From ec8f434f4282932d088b6ada981c904812d1cd4a Mon Sep 17 00:00:00 2001 From: Mikhail Shabanov Date: Tue, 17 Nov 2020 12:36:02 +0100 Subject: [PATCH] Some Operation context refactor --- ... AccountInformationPipelineContextData.cs} | 17 +------- .../HistoryInformationPipelineContext.cs | 28 ------------- .../HistoryInformationPipelineContextData.cs | 13 ++++++ .../IAccountPipelineContext.cs | 11 ----- ...ext.cs => IDatabasePipelineContextData.cs} | 3 +- .../OperationContext/AccountRequest.cs | 18 +++++++++ .../OperationContext/IOperationContext.cs | 11 +++++ .../OperationContext/OperationContext.cs | 27 +++++++++++++ .../BuildAccountInfoResponseOperation.cs | 25 +++++++----- .../CalculateStatisticsOperation.cs | 15 ++++--- .../CheckLAstBattleDateOperation.cs | 13 +++--- .../Operations/GetAccountInfoOperation.cs | 16 ++++---- .../Operations/GetTanksInfoOperation.cs | 19 +++++---- .../ReadAccountInfoFromDbOperation.cs | 9 +++-- .../SaveAccountAndTanksOperation.cs | 17 ++++---- .../WargamingAccounts.cs | 40 +++++++++++-------- 16 files changed, 163 insertions(+), 119 deletions(-) rename WotBlitzStatisticsPro.Logic/AccountInformationPipeline/{AccountInformationPipelineContext.cs => AccountInformationPipelineContextData.cs} (53%) delete mode 100644 WotBlitzStatisticsPro.Logic/AccountInformationPipeline/HistoryInformationPipelineContext.cs create mode 100644 WotBlitzStatisticsPro.Logic/AccountInformationPipeline/HistoryInformationPipelineContextData.cs delete mode 100644 WotBlitzStatisticsPro.Logic/AccountInformationPipeline/IAccountPipelineContext.cs rename WotBlitzStatisticsPro.Logic/AccountInformationPipeline/{IDatabasePipelineContext.cs => IDatabasePipelineContextData.cs} (59%) create mode 100644 WotBlitzStatisticsPro.Logic/AccountInformationPipeline/OperationContext/AccountRequest.cs create mode 100644 WotBlitzStatisticsPro.Logic/AccountInformationPipeline/OperationContext/IOperationContext.cs create mode 100644 WotBlitzStatisticsPro.Logic/AccountInformationPipeline/OperationContext/OperationContext.cs diff --git a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/AccountInformationPipelineContext.cs b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/AccountInformationPipelineContextData.cs similarity index 53% rename from WotBlitzStatisticsPro.Logic/AccountInformationPipeline/AccountInformationPipelineContext.cs rename to WotBlitzStatisticsPro.Logic/AccountInformationPipeline/AccountInformationPipelineContextData.cs index dedb9d0..557d2ad 100644 --- a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/AccountInformationPipelineContext.cs +++ b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/AccountInformationPipelineContextData.cs @@ -4,23 +4,8 @@ using WotBlitzStatisticsPro.DataAccess.Model.Accounts; namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline { - public class AccountInformationPipelineContext: IDatabasePipelineContext + public class AccountInformationPipelineContextData : IDatabasePipelineContextData { - public AccountInformationPipelineContext( - long accountId, - RealmType realmType, - RequestLanguage requestLanguage) - { - AccountId = accountId; - RealmType = realmType; - RequestLanguage = requestLanguage; - } - - - public long AccountId { get; } - public RealmType RealmType { get; } - public RequestLanguage RequestLanguage { get; } - public AccountInfo AccountInfo { get; set; } public AccountInfoHistory AccountInfoHistory { get; set; } diff --git a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/HistoryInformationPipelineContext.cs b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/HistoryInformationPipelineContext.cs deleted file mode 100644 index 1864bb8..0000000 --- a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/HistoryInformationPipelineContext.cs +++ /dev/null @@ -1,28 +0,0 @@ -using WotBlitzStatisticsPro.Common.Model; -using WotBlitzStatisticsPro.DataAccess.Model.Accounts; - -namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline -{ - public class HistoryInformationPipelineContext: IDatabasePipelineContext - { - public HistoryInformationPipelineContext( - long accountId, - RealmType realmType, - RequestLanguage requestLanguage) - { - AccountId = accountId; - RealmType = realmType; - RequestLanguage = requestLanguage; - } - - - public long AccountId { get; } - public RealmType RealmType { get; } - public RequestLanguage RequestLanguage { get; } - - public AccountInfo DbAccountInfo { get; set; } - - - public AccountInfoHistoryResponse Response { get; set; } - } -} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/HistoryInformationPipelineContextData.cs b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/HistoryInformationPipelineContextData.cs new file mode 100644 index 0000000..54310ea --- /dev/null +++ b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/HistoryInformationPipelineContextData.cs @@ -0,0 +1,13 @@ +using WotBlitzStatisticsPro.Common.Model; +using WotBlitzStatisticsPro.DataAccess.Model.Accounts; + +namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline +{ + public class HistoryInformationPipelineContextData: IDatabasePipelineContextData + { + public AccountInfo DbAccountInfo { get; set; } + + + public AccountInfoHistoryResponse Response { get; set; } + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/IAccountPipelineContext.cs b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/IAccountPipelineContext.cs deleted file mode 100644 index 2c187a1..0000000 --- a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/IAccountPipelineContext.cs +++ /dev/null @@ -1,11 +0,0 @@ -using WotBlitzStatisticsPro.Common.Model; - -namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline -{ - public interface IAccountPipelineContext - { - long AccountId { get; } - RealmType RealmType { get; } - RequestLanguage RequestLanguage { get; } - } -} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/IDatabasePipelineContext.cs b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/IDatabasePipelineContextData.cs similarity index 59% rename from WotBlitzStatisticsPro.Logic/AccountInformationPipeline/IDatabasePipelineContext.cs rename to WotBlitzStatisticsPro.Logic/AccountInformationPipeline/IDatabasePipelineContextData.cs index 9454ee0..2b5e8dd 100644 --- a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/IDatabasePipelineContext.cs +++ b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/IDatabasePipelineContextData.cs @@ -1,8 +1,9 @@ using WotBlitzStatisticsPro.DataAccess.Model.Accounts; +using WotBlitzStatisticsPro.Logic.AccountInformationPipeline.OperationContext; namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline { - public interface IDatabasePipelineContext: IAccountPipelineContext + public interface IDatabasePipelineContextData { AccountInfo DbAccountInfo { get; set; } } diff --git a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/OperationContext/AccountRequest.cs b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/OperationContext/AccountRequest.cs new file mode 100644 index 0000000..9eaa134 --- /dev/null +++ b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/OperationContext/AccountRequest.cs @@ -0,0 +1,18 @@ +using WotBlitzStatisticsPro.Common.Model; + +namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.OperationContext +{ + public class AccountRequest + { + public AccountRequest(long accountId, RealmType realmType, RequestLanguage requestLanguage) + { + AccountId = accountId; + RealmType = realmType; + RequestLanguage = requestLanguage; + } + + public long AccountId { get; } + public RealmType RealmType { get; } + public RequestLanguage RequestLanguage { get; } + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/OperationContext/IOperationContext.cs b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/OperationContext/IOperationContext.cs new file mode 100644 index 0000000..c77e1df --- /dev/null +++ b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/OperationContext/IOperationContext.cs @@ -0,0 +1,11 @@ +namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.OperationContext +{ + public interface IOperationContext + { + AccountRequest Request { get; } + + void AddOrReplace(TContextData data); + + TContextData Get(); + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/OperationContext/OperationContext.cs b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/OperationContext/OperationContext.cs new file mode 100644 index 0000000..1bb2f39 --- /dev/null +++ b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/OperationContext/OperationContext.cs @@ -0,0 +1,27 @@ +namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.OperationContext +{ + public class OperationContext : IOperationContext + { + private object _contextData; + + + public OperationContext(AccountRequest request) + { + Request = request; + } + + public AccountRequest Request { get; } + + public void AddOrReplace(TContextData data) + { + _contextData = data; + } + + public TContextData Get() + { + _contextData ??= default(TContextData); + + return (TContextData)_contextData; + } + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/BuildAccountInfoResponseOperation.cs b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/BuildAccountInfoResponseOperation.cs index 5f1992d..1e7bd8a 100644 --- a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/BuildAccountInfoResponseOperation.cs +++ b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/BuildAccountInfoResponseOperation.cs @@ -8,11 +8,12 @@ using WotBlitzStatisticsPro.Common.Model; using WotBlitzStatisticsPro.DataAccess; using WotBlitzStatisticsPro.DataAccess.Model; using WotBlitzStatisticsPro.DataAccess.Model.Accounts; +using WotBlitzStatisticsPro.Logic.AccountInformationPipeline.OperationContext; using WotBlitzStatisticsPro.Logic.Pipeline; namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.Operations { - public class BuildAccountInfoResponseOperation : IOperation + public class BuildAccountInfoResponseOperation : IOperation { private readonly IMapper _mapper; private readonly IDictionariesDataAccessor _dictionariesDataAccessor; @@ -23,26 +24,28 @@ namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.Operations _dictionariesDataAccessor = dictionariesDataAccessor; } - public async Task Invoke(AccountInformationPipelineContext context, Func next) + public async Task Invoke(IOperationContext context, Func next) { - context.Response = _mapper.Map(context.AccountInfo); - context.Response = _mapper.Map(context.AccountInfoHistory, context.Response); + var contextData = context.Get(); - var tankIds = context.Tanks.Select(t => t.TankId).ToArray(); + contextData.Response = _mapper.Map(contextData.AccountInfo); + contextData.Response = _mapper.Map(contextData.AccountInfoHistory, contextData.Response); + + var tankIds = contextData.Tanks.Select(t => t.TankId).ToArray(); var vehicles = await _dictionariesDataAccessor.GetVehicles(tankIds); - var nations = await _dictionariesDataAccessor.GetNations(context.RequestLanguage); - var tankTypes = await _dictionariesDataAccessor.GetTankTypes(context.RequestLanguage); + var nations = await _dictionariesDataAccessor.GetNations(context.Request.RequestLanguage); + var tankTypes = await _dictionariesDataAccessor.GetTankTypes(context.Request.RequestLanguage); - context.Response.Tanks = _mapper.Map, List>(context.Tanks); - context.Response.Tanks.ForEach(t => + contextData.Response.Tanks = _mapper.Map, List>(contextData.Tanks); + contextData.Response.Tanks.ForEach(t => { - t = _mapper.Map(context.TanksHistory[t.TankId], t); + t = _mapper.Map(contextData.TanksHistory[t.TankId], t); var vehicle = vehicles.ContainsKey(t.TankId) ? vehicles[t.TankId] : CreateStubVehicle(); t = _mapper.Map(vehicle, t, opt => { - opt.Items["language"] = context.RequestLanguage; + opt.Items["language"] = context.Request.RequestLanguage; opt.AfterMap((src, dest) => { dest.TankType = tankTypes.ContainsKey(dest.TankTypeId) ? tankTypes[dest.TankTypeId] : "-"; diff --git a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/CalculateStatisticsOperation.cs b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/CalculateStatisticsOperation.cs index 0e30612..8b40d58 100644 --- a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/CalculateStatisticsOperation.cs +++ b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/CalculateStatisticsOperation.cs @@ -2,12 +2,13 @@ using System.Linq; using System.Threading.Tasks; using WotBlitzStatisticsPro.DataAccess; +using WotBlitzStatisticsPro.Logic.AccountInformationPipeline.OperationContext; using WotBlitzStatisticsPro.Logic.Calculations; using WotBlitzStatisticsPro.Logic.Pipeline; namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.Operations { - public class CalculateStatisticsOperation : IOperation + public class CalculateStatisticsOperation : IOperation { private readonly IDictionariesDataAccessor _dictionariesDataAccessor; @@ -16,12 +17,14 @@ namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.Operations _dictionariesDataAccessor = dictionariesDataAccessor; } - public async Task Invoke(AccountInformationPipelineContext context, Func next) + public async Task Invoke(IOperationContext context, Func next) { - var tankIds = context.Tanks.Select(t => t.TankId).ToArray(); + var contextData = context.Get(); + + var tankIds = contextData.Tanks.Select(t => t.TankId).ToArray(); var tankTires = await _dictionariesDataAccessor.GetTankTires(tankIds); - foreach (var tankInfoHistory in context.TanksHistory) + foreach (var tankInfoHistory in contextData.TanksHistory) { if (!tankTires.ContainsKey(tankInfoHistory.Key)) { @@ -30,8 +33,8 @@ namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.Operations tankInfoHistory.Value.CalculateWn7(tankTires[tankInfoHistory.Key]); } - context.AccountInfoHistory.CalculateMiddleTier(context.TanksHistory.Values.ToList(), tankTires); - context.AccountInfoHistory.CalculateWn7(); + contextData.AccountInfoHistory.CalculateMiddleTier(contextData.TanksHistory.Values.ToList(), tankTires); + contextData.AccountInfoHistory.CalculateWn7(); await next.Invoke(context); } diff --git a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/CheckLAstBattleDateOperation.cs b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/CheckLAstBattleDateOperation.cs index 5ad16e0..d8e12bc 100644 --- a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/CheckLAstBattleDateOperation.cs +++ b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/CheckLAstBattleDateOperation.cs @@ -1,11 +1,12 @@ using System; using System.Threading.Tasks; using Microsoft.Extensions.Logging; +using WotBlitzStatisticsPro.Logic.AccountInformationPipeline.OperationContext; using WotBlitzStatisticsPro.Logic.Pipeline; namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.Operations { - public class CheckLastBattleDateOperation : IOperation + public class CheckLastBattleDateOperation : IOperation { private readonly ILogger _logger; @@ -14,14 +15,16 @@ namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.Operations _logger = logger; } - public Task Invoke(AccountInformationPipelineContext context, Func next) + public Task Invoke(IOperationContext context, Func next) { - if (context.DbAccountInfo == null || - context.DbAccountInfo.LastBattleTime < context.AccountInfo.LastBattleTime) + var contextData = context.Get(); + + if (contextData.DbAccountInfo == null || + contextData.DbAccountInfo.LastBattleTime < contextData.AccountInfo.LastBattleTime) { return next.Invoke(context); } - _logger.LogInformation($"Exiting without saving. Db LastBattleTime: {context.DbAccountInfo.LastBattleTime}, WG LastBattleTime: {context.AccountInfo.LastBattleTime}"); + _logger.LogInformation($"Exiting without saving. Db LastBattleTime: {contextData.DbAccountInfo.LastBattleTime}, WG LastBattleTime: {contextData.AccountInfo.LastBattleTime}"); return Task.CompletedTask; } } diff --git a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/GetAccountInfoOperation.cs b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/GetAccountInfoOperation.cs index 8dc262b..ee129db 100644 --- a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/GetAccountInfoOperation.cs +++ b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/GetAccountInfoOperation.cs @@ -2,13 +2,14 @@ using System.Threading.Tasks; using AutoMapper; using WotBlitzStatisticsPro.DataAccess.Model.Accounts; +using WotBlitzStatisticsPro.Logic.AccountInformationPipeline.OperationContext; using WotBlitzStatisticsPro.Logic.Pipeline; using WotBlitzStatisticsPro.WgApiClient; using WotBlitzStatisticsPro.WgApiClient.Model; namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.Operations { - public class GetAccountInfoOperation: IOperation + public class GetAccountInfoOperation: IOperation { private readonly IWargamingApiClient _wargamingApi; private readonly IMapper _mapper; @@ -21,17 +22,18 @@ namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.Operations _mapper = mapper; } - public async Task Invoke(AccountInformationPipelineContext context, Func next) + public async Task Invoke(IOperationContext context, Func next) { var accountInfo = await - _wargamingApi.GetPlayerAccountInfo(context.AccountId, context.RealmType, context.RequestLanguage); + _wargamingApi.GetPlayerAccountInfo(context.Request.AccountId, context.Request.RealmType, context.Request.RequestLanguage); // Store info to AccountInfo and in AccountInfoHistory - context.AccountInfo = _mapper.Map(accountInfo); - context.AccountInfo.Realm = context.RealmType; + var contextData = context.Get(); + contextData.AccountInfo = _mapper.Map(accountInfo); + contextData.AccountInfo.Realm = context.Request.RealmType; - context.AccountInfoHistory = new AccountInfoHistory(context.AccountId, context.AccountInfo.LastBattleTime); - _mapper.Map(accountInfo.Statistics.All, context.AccountInfoHistory); + contextData.AccountInfoHistory = new AccountInfoHistory(context.Request.AccountId, contextData.AccountInfo.LastBattleTime); + _mapper.Map(accountInfo.Statistics.All, contextData.AccountInfoHistory); await next.Invoke(context); } diff --git a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/GetTanksInfoOperation.cs b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/GetTanksInfoOperation.cs index 9b67fbd..da2f743 100644 --- a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/GetTanksInfoOperation.cs +++ b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/GetTanksInfoOperation.cs @@ -3,13 +3,14 @@ using System.Collections.Generic; using System.Threading.Tasks; using AutoMapper; using WotBlitzStatisticsPro.DataAccess.Model.Accounts; +using WotBlitzStatisticsPro.Logic.AccountInformationPipeline.OperationContext; using WotBlitzStatisticsPro.Logic.Pipeline; using WotBlitzStatisticsPro.WgApiClient; using WotBlitzStatisticsPro.WgApiClient.Model; namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.Operations { - public class GetTanksInfoOperation: IOperation + public class GetTanksInfoOperation: IOperation { private readonly IWargamingTanksApiClient _wargamingApi; private readonly IMapper _mapper; @@ -22,22 +23,24 @@ namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.Operations _mapper = mapper; } - public async Task Invoke(AccountInformationPipelineContext context, Func next) + public async Task Invoke(IOperationContext context, Func next) { - var tanksInfo = await - _wargamingApi.GetPlayerAccountTanksInfo(context.AccountId, context.RealmType, context.RequestLanguage); + var contextData = context.Get(); - context.Tanks = new List(); - context.TanksHistory = new Dictionary(); + var tanksInfo = await + _wargamingApi.GetPlayerAccountTanksInfo(context.Request.AccountId, context.Request.RealmType, context.Request.RequestLanguage); + + contextData.Tanks = new List(); + contextData.TanksHistory = new Dictionary(); tanksInfo.ForEach(tank => { var tankInfo = new TankInfo(tank.AccountId, tank.TankId); _mapper.Map(tank, tankInfo); - context.Tanks.Add(tankInfo); + contextData.Tanks.Add(tankInfo); var stat = new TankInfoHistory(tank.AccountId, tank.TankId, tank.LastBattleTime); _mapper.Map(tank.All, stat); - context.TanksHistory[stat.TankId] = stat; + contextData.TanksHistory[stat.TankId] = stat; }); await next.Invoke(context); diff --git a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/ReadAccountInfoFromDbOperation.cs b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/ReadAccountInfoFromDbOperation.cs index 66a6b3e..d688460 100644 --- a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/ReadAccountInfoFromDbOperation.cs +++ b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/ReadAccountInfoFromDbOperation.cs @@ -1,11 +1,12 @@ using System; using System.Threading.Tasks; using WotBlitzStatisticsPro.DataAccess; +using WotBlitzStatisticsPro.Logic.AccountInformationPipeline.OperationContext; using WotBlitzStatisticsPro.Logic.Pipeline; namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.Operations { - public class ReadAccountInfoFromDbOperation : IOperation + public class ReadAccountInfoFromDbOperation : IOperation { private readonly IWargamingAccountDataAccessor _accountDataAccessor; @@ -14,9 +15,11 @@ namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.Operations _accountDataAccessor = accountDataAccessor; } - public async Task Invoke(AccountInformationPipelineContext context, Func next) + public async Task Invoke(IOperationContext context, Func next) { - context.DbAccountInfo = await _accountDataAccessor.ReadAccountInfo(context.AccountId); + var contextData = context.Get(); + + contextData.DbAccountInfo = await _accountDataAccessor.ReadAccountInfo(context.Request.AccountId); await next.Invoke(context); } } diff --git a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/SaveAccountAndTanksOperation.cs b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/SaveAccountAndTanksOperation.cs index ad24975..197bb62 100644 --- a/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/SaveAccountAndTanksOperation.cs +++ b/WotBlitzStatisticsPro.Logic/AccountInformationPipeline/Operations/SaveAccountAndTanksOperation.cs @@ -4,11 +4,12 @@ using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using WotBlitzStatisticsPro.DataAccess; +using WotBlitzStatisticsPro.Logic.AccountInformationPipeline.OperationContext; using WotBlitzStatisticsPro.Logic.Pipeline; namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.Operations { - public class SaveAccountAndTanksOperation : IOperation + public class SaveAccountAndTanksOperation : IOperation { private readonly IWargamingAccountDataAccessor _accountDataAccessor; private readonly ILogger _logger; @@ -21,27 +22,29 @@ namespace WotBlitzStatisticsPro.Logic.AccountInformationPipeline.Operations _logger = logger; } - public async Task Invoke(AccountInformationPipelineContext context, Func next) + public async Task Invoke(IOperationContext context, Func next) { - await _accountDataAccessor.AddOurUpdateAccountInfo(context.AccountInfo); - await _accountDataAccessor.AddAccountInfoHistory(context.AccountInfoHistory); + var contextData = context.Get(); + + await _accountDataAccessor.AddOurUpdateAccountInfo(contextData.AccountInfo); + await _accountDataAccessor.AddAccountInfoHistory(contextData.AccountInfoHistory); var tanksCount = 0; var tankIdsAsString = new StringBuilder(); - foreach (var tankInfo in context.Tanks) + foreach (var tankInfo in contextData.Tanks) { var tankFromDb = await _accountDataAccessor.ReadTankInfo(tankInfo.AccountId, tankInfo.TankId); if (tankFromDb == null || tankInfo.LastBattleTime > tankFromDb.LastBattleTime) { await _accountDataAccessor.AddOrUpdateTankInfo(tankInfo); - await _accountDataAccessor.AddTankInfoHistory(context.TanksHistory[tankInfo.TankId]); + await _accountDataAccessor.AddTankInfoHistory(contextData.TanksHistory[tankInfo.TankId]); tanksCount++; tankIdsAsString.Append($" {tankInfo.TankId}; "); } } - _logger.LogInformation($"Updated account {context.AccountInfo.AccountId} and {tanksCount} tanks: {tankIdsAsString}"); + _logger.LogInformation($"Updated account {contextData.AccountInfo.AccountId} and {tanksCount} tanks: {tankIdsAsString}"); await next.Invoke(context); } diff --git a/WotBlitzStatisticsPro.Logic/WargamingAccounts.cs b/WotBlitzStatisticsPro.Logic/WargamingAccounts.cs index 5de30a5..1b8a36a 100644 --- a/WotBlitzStatisticsPro.Logic/WargamingAccounts.cs +++ b/WotBlitzStatisticsPro.Logic/WargamingAccounts.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using WotBlitzStatisticsPro.Common.Model; using WotBlitzStatisticsPro.Logic.AccountInformationPipeline; +using WotBlitzStatisticsPro.Logic.AccountInformationPipeline.OperationContext; using WotBlitzStatisticsPro.Logic.AccountInformationPipeline.Operations; using WotBlitzStatisticsPro.Logic.Pipeline; @@ -18,8 +19,10 @@ namespace WotBlitzStatisticsPro.Logic public async Task GatherAccountInformation(RealmType realm, long accountId, RequestLanguage requestLanguage) { - var context = new AccountInformationPipelineContext(accountId, realm, requestLanguage); - var pipeline = new Pipeline(_operationFactory); + var contextData = new AccountInformationPipelineContextData(); + var context = new OperationContext(new AccountRequest(accountId, realm, requestLanguage)); + context.AddOrReplace(contextData); + var pipeline = new Pipeline(_operationFactory); pipeline.AddOperation() .AddOperation() @@ -31,13 +34,15 @@ namespace WotBlitzStatisticsPro.Logic .Invoke(context, null) .ConfigureAwait(false); - return context.Response; + return contextData.Response; } public async Task GatherAndSaveAccountInformation(RealmType realm, long accountId, RequestLanguage requestLanguage) { - var context = new AccountInformationPipelineContext(accountId, realm, requestLanguage); - var pipeline = new Pipeline(_operationFactory); + var contextData = new AccountInformationPipelineContextData(); + var context = new OperationContext(new AccountRequest(accountId, realm, requestLanguage)); + context.AddOrReplace(contextData); + var pipeline = new Pipeline(_operationFactory); pipeline.AddOperation() .AddOperation() @@ -52,29 +57,32 @@ namespace WotBlitzStatisticsPro.Logic .Invoke(context, null) .ConfigureAwait(false); - return context.Response; + return contextData.Response; } public async Task GetAccountInfoHistory(RealmType realm, long accountId, DateTime startDate, RequestLanguage requestLanguage) { - var context = new HistoryInformationPipelineContext(accountId, realm, requestLanguage); - var pipeline = new Pipeline(_operationFactory); - - //pipeline.AddOperation() + var contextData = new HistoryInformationPipelineContextData(); + var context = new OperationContext(new AccountRequest(accountId, realm, requestLanguage)); + context.AddOrReplace(contextData); + var pipeline = new Pipeline(_operationFactory); // ToDo: // 1. First read account info from DB operation - // 2. Read account history from DB at the startDate !Array SortedByDate! operation - // 3. Fill the OverallAccountStatistics - // PeriodAccountStatistics - // PeriodDifference - // StatisticsHistory + pipeline.AddOperation() + + // 2. Read account history from DB at the startDate !Array SortedByDate! operation + // 3. Fill the OverallAccountStatistics + // PeriodAccountStatistics + // PeriodDifference + // StatisticsHistory + ; await pipeline.Build() .Invoke(context, null) .ConfigureAwait(false); - return context.Response; + return contextData.Response; } } } \ No newline at end of file