diff --git a/Hcs.WebApp/BackgroundServices/CampaignManagers/ExportCommonRegistryElementsManager_15_7_0_1.cs b/Hcs.WebApp/BackgroundServices/CampaignManagers/ExportCommonRegistryElementsManager_15_7_0_1.cs index 43c4c10..717a8f5 100644 --- a/Hcs.WebApp/BackgroundServices/CampaignManagers/ExportCommonRegistryElementsManager_15_7_0_1.cs +++ b/Hcs.WebApp/BackgroundServices/CampaignManagers/ExportCommonRegistryElementsManager_15_7_0_1.cs @@ -8,7 +8,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers IServiceScopeFactory scopeFactory, OperationExecutionState operationExecutionState, ResultGetState resultGetState, - Campaign campaign) : ManagerBase(scopeFactory, operationExecutionState, resultGetState, campaign) + DataParsingState dataParsingState, + Campaign campaign) : ManagerBase(scopeFactory, operationExecutionState, resultGetState, dataParsingState, campaign) { private enum Step { diff --git a/Hcs.WebApp/BackgroundServices/CampaignManagers/ExportPrivateRegistryElementsManager_15_7_0_1.cs b/Hcs.WebApp/BackgroundServices/CampaignManagers/ExportPrivateRegistryElementsManager_15_7_0_1.cs index 702bb80..8b35852 100644 --- a/Hcs.WebApp/BackgroundServices/CampaignManagers/ExportPrivateRegistryElementsManager_15_7_0_1.cs +++ b/Hcs.WebApp/BackgroundServices/CampaignManagers/ExportPrivateRegistryElementsManager_15_7_0_1.cs @@ -8,7 +8,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers IServiceScopeFactory scopeFactory, OperationExecutionState operationExecutionState, ResultGetState resultGetState, - Campaign campaign) : ManagerBase(scopeFactory, operationExecutionState, resultGetState, campaign) + DataParsingState dataParsingState, + Campaign campaign) : ManagerBase(scopeFactory, operationExecutionState, resultGetState, dataParsingState, campaign) { private enum Step { diff --git a/Hcs.WebApp/BackgroundServices/CampaignManagers/ManagerBase.cs b/Hcs.WebApp/BackgroundServices/CampaignManagers/ManagerBase.cs index 3bdedb2..a41c100 100644 --- a/Hcs.WebApp/BackgroundServices/CampaignManagers/ManagerBase.cs +++ b/Hcs.WebApp/BackgroundServices/CampaignManagers/ManagerBase.cs @@ -8,11 +8,13 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers IServiceScopeFactory scopeFactory, OperationExecutionState operationExecutionState, ResultGetState resultGetState, + DataParsingState dataParsingState, Campaign campaign) : IManager { protected readonly IServiceScope scope = scopeFactory.CreateScope(); protected readonly OperationExecutionState operationExecutionState = operationExecutionState; protected readonly ResultGetState resultGetState = resultGetState; + protected readonly DataParsingState dataParsingState = dataParsingState; protected readonly Campaign campaign = campaign; private HeadquartersService? headquartersService; diff --git a/Hcs.WebApp/BackgroundServices/CampaignManagers/ManagerFactory.cs b/Hcs.WebApp/BackgroundServices/CampaignManagers/ManagerFactory.cs index 0ef913d..36a5bcd 100644 --- a/Hcs.WebApp/BackgroundServices/CampaignManagers/ManagerFactory.cs +++ b/Hcs.WebApp/BackgroundServices/CampaignManagers/ManagerFactory.cs @@ -2,7 +2,7 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers { - public class ManagerFactory(IServiceScopeFactory serviceScopeFactory, OperationExecutionState operationExecutionState, ResultGetState resultGetState) + public class ManagerFactory(IServiceScopeFactory serviceScopeFactory, OperationExecutionState operationExecutionState, ResultGetState resultGetState, DataParsingState dataParsingState) { protected readonly IServiceScopeFactory serviceScopeFactory = serviceScopeFactory; protected readonly OperationExecutionState operationExecutionState = operationExecutionState; @@ -12,9 +12,9 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers { return campaign.Type switch { - Campaign.CampaignType.ExportPrivateRegistryElements_15_7_0_1 => new ExportPrivateRegistryElementsManager_15_7_0_1(serviceScopeFactory, operationExecutionState, resultGetState, campaign), - Campaign.CampaignType.ExportCommonRegistryElements_15_7_0_1 => new ExportCommonRegistryElementsManager_15_7_0_1(serviceScopeFactory, operationExecutionState, resultGetState, campaign), - Campaign.CampaignType.ParseHousesData_15_7_0_1 => new ParseHousesDataManager_15_7_0_1(serviceScopeFactory, operationExecutionState, resultGetState, campaign) + Campaign.CampaignType.ExportPrivateRegistryElements_15_7_0_1 => new ExportPrivateRegistryElementsManager_15_7_0_1(serviceScopeFactory, operationExecutionState, resultGetState, dataParsingState, campaign), + Campaign.CampaignType.ExportCommonRegistryElements_15_7_0_1 => new ExportCommonRegistryElementsManager_15_7_0_1(serviceScopeFactory, operationExecutionState, resultGetState, dataParsingState, campaign), + Campaign.CampaignType.ParseHousesData_15_7_0_1 => new ParseHousesDataManager_15_7_0_1(serviceScopeFactory, operationExecutionState, resultGetState, dataParsingState, campaign) }; } } diff --git a/Hcs.WebApp/BackgroundServices/CampaignManagers/ParseHousesDataManager_15_7_0_1.cs b/Hcs.WebApp/BackgroundServices/CampaignManagers/ParseHousesDataManager_15_7_0_1.cs index 916278f..3b1f976 100644 --- a/Hcs.WebApp/BackgroundServices/CampaignManagers/ParseHousesDataManager_15_7_0_1.cs +++ b/Hcs.WebApp/BackgroundServices/CampaignManagers/ParseHousesDataManager_15_7_0_1.cs @@ -1,4 +1,7 @@ using Hcs.WebApp.Data.Hcs; +using Hcs.WebApp.Data.Hcs.CampaignArgs; +using Hcs.WebApp.Services; +using Microsoft.EntityFrameworkCore; namespace Hcs.WebApp.BackgroundServices.CampaignManagers { @@ -6,13 +9,108 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers IServiceScopeFactory scopeFactory, OperationExecutionState operationExecutionState, ResultGetState resultGetState, - Campaign campaign) : ManagerBase(scopeFactory, operationExecutionState, resultGetState, campaign) + DataParsingState dataParsingState, + Campaign campaign) : ManagerBase(scopeFactory, operationExecutionState, resultGetState, dataParsingState, campaign) { - protected override int StepCount => throw new NotImplementedException(); - - public override Task ProcessAsync() + private enum Step { - throw new NotImplementedException(); + Start = 0, + ParseWait = 1, + End = 2 + } + + private FileToParseService? fileToParseService; + + protected override int StepCount => Enum.GetValues(typeof(Step)).Length; + + protected FileToParseService FileToParseService => fileToParseService ??= scope.ServiceProvider.GetRequiredService(); + + public override async Task ProcessAsync() + { + switch ((Step)campaign.Step) + { + case Step.Start: + await DoStartStepAsync(); + break; + + case Step.ParseWait: + await DoParseWaitStepAsync(); + break; + } + } + + private async Task DoStartStepAsync() + { + DateTime startedAt = default; + IEnumerable? operations = null; + + using var context = HeadquartersService.GetNewContext(); + var executionStrategy = context.Database.CreateExecutionStrategy(); + await executionStrategy.ExecuteAsync(async () => + { + using var transaction = await context.Database.BeginTransactionAsync(); + try + { + startedAt = DateTime.UtcNow; + await HeadquartersService.SetCampaignStartedAsync(context, campaign.Id, startedAt); + + await ProgressStepAsync(context, (int)Step.ParseWait); + + var args = campaign.DeserializeArgs() as CampaignParseArgs; + operations = await HeadquartersService.InitiateOperationsAsync(context, 1, campaign.Id, Operation.OperationType.ParseHousesData_15_7_0_1); + await FileToParseService.SetOperationToFileToParseAsync(context, args!.FileToParseId, operations.First()); + + await transaction.CommitAsync(); + } + catch + { + transaction?.Rollback(); + + throw; + } + }); + + if (operations != null) + { + operationExecutionState.EnqueueOperation(operations.First()); + } + + State = IManager.ManagerState.Started; + + InvokeOnCampaignStarted(startedAt); + } + + private async Task DoParseWaitStepAsync() + { + if (dataParsingState.HasCampaignOperation(campaign.Id)) return; + + DateTime endedAt = default; + + using var context = HeadquartersService.GetNewContext(); + var executionStrategy = context.Database.CreateExecutionStrategy(); + await executionStrategy.ExecuteAsync(async () => + { + using var transaction = await context.Database.BeginTransactionAsync(); + try + { + await ProgressStepAsync(context, (int)Step.End); + + endedAt = DateTime.UtcNow; + await HeadquartersService.SetCampaignEndedAsync(context, campaign.Id, endedAt); + + await transaction.CommitAsync(); + } + catch + { + transaction?.Rollback(); + + throw; + } + }); + + State = IManager.ManagerState.Ended; + + InvokeOnCampaignEnded(endedAt, string.Empty); } } } diff --git a/Hcs.WebApp/Services/FileToParseService.cs b/Hcs.WebApp/Services/FileToParseService.cs index 2b5533e..5062e75 100644 --- a/Hcs.WebApp/Services/FileToParseService.cs +++ b/Hcs.WebApp/Services/FileToParseService.cs @@ -26,5 +26,13 @@ namespace Hcs.WebApp.Services await context.SaveChangesAsync(); return fileToParse; } + + public async Task SetOperationToFileToParseAsync(HcsDbContext context, int fileToParseId, Operation operation) + { + var fileToParse = await context.FilesToParse.FirstOrDefaultAsync(x => x.Id == fileToParseId); + fileToParse!.LastParseOperationId = operation.Id; + + await context.SaveChangesAsync(); + } } }