From 05059b0edadde909905138835dace42ea2b8e39e Mon Sep 17 00:00:00 2001 From: Mikhail Shabanov Date: Thu, 2 Sep 2021 18:43:00 +0200 Subject: [PATCH] feat: http header passing mechanism --- .../Pages/PlayerInfoLayoutBase.cs | 20 +++++++++++---- WotBlitzStatisticsPro.Blazor/Program.cs | 12 ++++++--- .../Services/GraphQlBackendService.cs | 13 ++++++---- .../IWargamingAuthTokenHeaderHelper.cs | 7 ++++++ .../WargamingAuthTokenHeaderHandler.cs | 25 +++++++++++++++++++ .../WargamingAuthTokenHeaderHelper.cs | 7 ++++++ 6 files changed, 71 insertions(+), 13 deletions(-) create mode 100644 WotBlitzStatisticsPro.Blazor/Services/IWargamingAuthTokenHeaderHelper.cs create mode 100644 WotBlitzStatisticsPro.Blazor/Services/WargamingAuthTokenHeaderHandler.cs create mode 100644 WotBlitzStatisticsPro.Blazor/Services/WargamingAuthTokenHeaderHelper.cs diff --git a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayoutBase.cs b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayoutBase.cs index abeac71..bc965eb 100644 --- a/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayoutBase.cs +++ b/WotBlitzStatisticsPro.Blazor/Pages/PlayerInfoLayoutBase.cs @@ -19,6 +19,9 @@ namespace WotBlitzStatisticsPro.Blazor.Pages [Inject] public IStringLocalizer Localize { get; set; } + [Inject] + public INotificationsService Notifications { get; set; } + [Parameter] public long AccountId { get; set; } @@ -35,13 +38,20 @@ namespace WotBlitzStatisticsPro.Blazor.Pages var settings = await LocalStorageService.ReadSettings(); CurrentRealmType = settings.RealmType; - // Maybe add refresh button instead of calling mutation each time - if(loggedInInfo != null && loggedInInfo.AccountId == AccountId) + try { - await GraphQlBackendService.CollectPlayerInfo(AccountId, CurrentRealmType, loggedInInfo.AccessToken); - } + // Maybe add refresh button instead of calling mutation each time + if(loggedInInfo != null && loggedInInfo.AccountId == AccountId) + { + await GraphQlBackendService.CollectPlayerInfo(AccountId, CurrentRealmType, loggedInInfo.AccessToken); + } - (AccountInfo, AchievementsBySection) = await GraphQlBackendService.GetPlayerInfo(AccountId, CurrentRealmType); + (AccountInfo, AchievementsBySection) = await GraphQlBackendService.GetPlayerInfo(AccountId, CurrentRealmType); + } + catch (System.Exception e) + { + Notifications.ReportError("Can not get data from backend", e.Message); + } } } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/Program.cs b/WotBlitzStatisticsPro.Blazor/Program.cs index d17de1c..1bd9636 100644 --- a/WotBlitzStatisticsPro.Blazor/Program.cs +++ b/WotBlitzStatisticsPro.Blazor/Program.cs @@ -11,6 +11,7 @@ using Radzen; using WotBlitzStatisticsPro.Blazor.Model; using WotBlitzStatisticsPro.Blazor.Services; using WotBlitzStatisticsPro.Blazor.Services.Mock; +using WotBlitzStatisticsPro.Blazor.GraphQl; namespace WotBlitzStatisticsPro.Blazor { @@ -36,10 +37,15 @@ namespace WotBlitzStatisticsPro.Blazor builder.Services.AddScoped(); builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddTransient(); + // StrawberryShake GraphQL Client - builder.Services - .AddWotBlitzStatisticsProClient() - .ConfigureHttpClient(client => client.BaseAddress = new Uri($"{builder.HostEnvironment.BaseAddress}graphql/")); + builder.Services.AddHttpClient( + WotBlitzStatisticsProClient.ClientName, + client => client.BaseAddress = new Uri($"{builder.HostEnvironment.BaseAddress}graphql/")) + .AddHttpMessageHandler(); + builder.Services.AddWotBlitzStatisticsProClient(); // ToDo: Asp Net hosting environment variables don't work here. I don't know why //var useMock = Environment.GetEnvironmentVariable("USE_GRAPH_QL_MOCK"); diff --git a/WotBlitzStatisticsPro.Blazor/Services/GraphQlBackendService.cs b/WotBlitzStatisticsPro.Blazor/Services/GraphQlBackendService.cs index 7453e72..251d017 100644 --- a/WotBlitzStatisticsPro.Blazor/Services/GraphQlBackendService.cs +++ b/WotBlitzStatisticsPro.Blazor/Services/GraphQlBackendService.cs @@ -12,13 +12,16 @@ namespace WotBlitzStatisticsPro.Blazor.Services { private readonly WotBlitzStatisticsProClient _client; private readonly INotificationsService _notificationsService; + private readonly IWargamingAuthTokenHeaderHelper _wargamingAuthTokenHeaderHelper; public GraphQlBackendService( WotBlitzStatisticsProClient client, - INotificationsService notificationsService) + INotificationsService notificationsService, + IWargamingAuthTokenHeaderHelper wargamingAuthTokenHeaderHelper) { _client = client; _notificationsService = notificationsService; + _wargamingAuthTokenHeaderHelper = wargamingAuthTokenHeaderHelper; } public async Task?> FindPlayers(string accountNick, RealmType realmType) @@ -57,11 +60,11 @@ namespace WotBlitzStatisticsPro.Blazor.Services throw new System.NotImplementedException(); } - public Task CollectPlayerInfo(long accountId, RealmType realmType, string accessToken) + public async Task CollectPlayerInfo(long accountId, RealmType realmType, string accessToken) { - // ToDo: Call mutation with accessToken in the context - - return _client.UpdatePlayer.ExecuteAsync(accountId, realmType, RequestLanguage.En); + _wargamingAuthTokenHeaderHelper.WargamingToken = accessToken; + var result = await _client.UpdatePlayer.ExecuteAsync(accountId, realmType, RequestLanguage.En); + CheckErrors(result.Errors); } private RequestLanguage GetLanguage() diff --git a/WotBlitzStatisticsPro.Blazor/Services/IWargamingAuthTokenHeaderHelper.cs b/WotBlitzStatisticsPro.Blazor/Services/IWargamingAuthTokenHeaderHelper.cs new file mode 100644 index 0000000..2bb090a --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Services/IWargamingAuthTokenHeaderHelper.cs @@ -0,0 +1,7 @@ +namespace WotBlitzStatisticsPro.Blazor.Services +{ + public interface IWargamingAuthTokenHeaderHelper + { + string? WargamingToken { get; set; } + } +} diff --git a/WotBlitzStatisticsPro.Blazor/Services/WargamingAuthTokenHeaderHandler.cs b/WotBlitzStatisticsPro.Blazor/Services/WargamingAuthTokenHeaderHandler.cs new file mode 100644 index 0000000..534b807 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Services/WargamingAuthTokenHeaderHandler.cs @@ -0,0 +1,25 @@ +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +namespace WotBlitzStatisticsPro.Blazor.Services +{ + public class WargamingAuthTokenHeaderHandler: DelegatingHandler + { + private readonly IWargamingAuthTokenHeaderHelper _wargamingAuthTokenHeaderHelper; + + public WargamingAuthTokenHeaderHandler(IWargamingAuthTokenHeaderHelper wargamingAuthTokenHeaderHelper) + { + _wargamingAuthTokenHeaderHelper = wargamingAuthTokenHeaderHelper; + } + + protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + if (!string.IsNullOrEmpty(_wargamingAuthTokenHeaderHelper.WargamingToken)) + { + request.Headers.Add("WargamingToken", _wargamingAuthTokenHeaderHelper.WargamingToken); + } + return base.SendAsync(request, cancellationToken); + } + } +} diff --git a/WotBlitzStatisticsPro.Blazor/Services/WargamingAuthTokenHeaderHelper.cs b/WotBlitzStatisticsPro.Blazor/Services/WargamingAuthTokenHeaderHelper.cs new file mode 100644 index 0000000..846a9f9 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Services/WargamingAuthTokenHeaderHelper.cs @@ -0,0 +1,7 @@ +namespace WotBlitzStatisticsPro.Blazor.Services +{ + public class WargamingAuthTokenHeaderHelper : IWargamingAuthTokenHeaderHelper + { + public string? WargamingToken { get; set; } = null; + } +}