From 83628d21bdcefb1a882510e84a89be216f762130 Mon Sep 17 00:00:00 2001 From: Mikhail Shabanov Date: Thu, 19 Mar 2020 22:00:47 +0100 Subject: [PATCH] Some Data loader stuff --- .../DataLoaders/ClanDataLoader.cs | 32 +++++++++++++++++++ .../ObjectTypes/PlayerClanInfoObjectType.cs | 13 ++------ .../Resolvers/ClanInfoResolver.cs | 20 ++++++++++++ WotBlitzStatistics.GraphQl/Startup.cs | 7 ++-- .../WargamingApiClient.cs | 3 +- 5 files changed, 61 insertions(+), 14 deletions(-) create mode 100644 WotBlitzStatistics.GraphQl/DataLoaders/ClanDataLoader.cs create mode 100644 WotBlitzStatistics.GraphQl/Resolvers/ClanInfoResolver.cs diff --git a/WotBlitzStatistics.GraphQl/DataLoaders/ClanDataLoader.cs b/WotBlitzStatistics.GraphQl/DataLoaders/ClanDataLoader.cs new file mode 100644 index 0000000..80c97dd --- /dev/null +++ b/WotBlitzStatistics.GraphQl/DataLoaders/ClanDataLoader.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using GreenDonut; +using WotBlitzStatisticsPro.WgApiClient; +using WotBlitzStatisticsPro.WgApiClient.Model; + +namespace WotBlitzStatistics.GraphQl.DataLoaders +{ + public class ClanDataLoader : DataLoaderBase + { + private readonly IWargamingApiClient _wgApiClient; + + public ClanDataLoader(IWargamingApiClient wgApiClient) + { + _wgApiClient = wgApiClient; + } + + protected override async Task>> FetchAsync( + IReadOnlyList keys, + CancellationToken cancellationToken) + { + var result = new List>(); + foreach (var key in keys) + { + result.Add(await _wgApiClient.GetClanInfo(key)); + } + + return result.AsReadOnly(); + } + } +} \ No newline at end of file diff --git a/WotBlitzStatistics.GraphQl/ObjectTypes/PlayerClanInfoObjectType.cs b/WotBlitzStatistics.GraphQl/ObjectTypes/PlayerClanInfoObjectType.cs index b4ccdfc..e111137 100644 --- a/WotBlitzStatistics.GraphQl/ObjectTypes/PlayerClanInfoObjectType.cs +++ b/WotBlitzStatistics.GraphQl/ObjectTypes/PlayerClanInfoObjectType.cs @@ -2,6 +2,7 @@ using GreenDonut; using HotChocolate.Resolvers; using HotChocolate.Types; +using WotBlitzStatistics.GraphQl.Resolvers; using WotBlitzStatisticsPro.WgApiClient; using WotBlitzStatisticsPro.WgApiClient.Model; @@ -11,17 +12,7 @@ namespace WotBlitzStatistics.GraphQl.ObjectTypes { protected override void Configure(IObjectTypeDescriptor descriptor) { - // ToDo: Cache clan info! - // https://hotchocolate.io/docs/dataloaders - descriptor.Field("clanInfo") - .Resolver(c => - { - var warGamingClient = c.Service(); - var clanDataLoader = c.CacheDataLoader( - "clanInfoById", - clanId => warGamingClient.GetClanInfo(clanId)); - return clanDataLoader.LoadAsync(c.Parent().ClanId.Value); - }); + descriptor.Include(); } } } diff --git a/WotBlitzStatistics.GraphQl/Resolvers/ClanInfoResolver.cs b/WotBlitzStatistics.GraphQl/Resolvers/ClanInfoResolver.cs new file mode 100644 index 0000000..a7c419e --- /dev/null +++ b/WotBlitzStatistics.GraphQl/Resolvers/ClanInfoResolver.cs @@ -0,0 +1,20 @@ +using System.Threading; +using System.Threading.Tasks; +using HotChocolate; +using WotBlitzStatistics.GraphQl.DataLoaders; +using WotBlitzStatisticsPro.WgApiClient; +using WotBlitzStatisticsPro.WgApiClient.Model; + +namespace WotBlitzStatistics.GraphQl.Resolvers +{ + [GraphQLResolverOf(typeof(ClanInfo))] + public class ClanInfoResolver + { + public async Task GetClanInfo( + [Parent] ClanAccountInfo clanAccountInfo, + [DataLoader] ClanDataLoader clanDataLoader) + { + return (await clanDataLoader.LoadAsync(new[] {clanAccountInfo.ClanId.Value}, CancellationToken.None))[0]; + } + } +} \ No newline at end of file diff --git a/WotBlitzStatistics.GraphQl/Startup.cs b/WotBlitzStatistics.GraphQl/Startup.cs index 82c6d7c..96105e0 100644 --- a/WotBlitzStatistics.GraphQl/Startup.cs +++ b/WotBlitzStatistics.GraphQl/Startup.cs @@ -1,6 +1,7 @@ using HotChocolate; using HotChocolate.AspNetCore; using HotChocolate.AspNetCore.Voyager; +using HotChocolate.DataLoader; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; @@ -30,8 +31,10 @@ namespace WotBlitzStatistics.GraphQl services.AddSingleton(wgApiConfig); services.AddHttpClient(); - // this enables you to use DataLoader in your resolvers. - services.AddDataLoaderRegistry(); + // Global data loader - caches data between requests + //services.AddSingleton(); + // this enables you to use DataLoader in your resolvers. + services.AddDataLoaderRegistry(); // Add GraphQL Services services.AddGraphQL(sp => SchemaBuilder.New() diff --git a/WotBlitzStatisticsPro.WgApiClient/WargamingApiClient.cs b/WotBlitzStatisticsPro.WgApiClient/WargamingApiClient.cs index 110fd97..4d15697 100644 --- a/WotBlitzStatisticsPro.WgApiClient/WargamingApiClient.cs +++ b/WotBlitzStatisticsPro.WgApiClient/WargamingApiClient.cs @@ -55,7 +55,6 @@ namespace WotBlitzStatisticsPro.WgApiClient RealmType realmType = RealmType.Ru, RequestLanguage language = RequestLanguage.En) { - // https://api.wotblitz.ru/wotb/clans/info/?application_id=adc1387489cf9fc8d9a1d85dbd27763d&clan_id=40493 var clanInfo = await GetFromBlitzApi>( realmType, language, @@ -68,5 +67,7 @@ namespace WotBlitzStatisticsPro.WgApiClient return null; } + // https://api.wotblitz.ru/wotb/encyclopedia/achievements/?application_id=adc1387489cf9fc8d9a1d85dbd27763d + } }