using Hcs.WebApp.Data.Hcs; using Microsoft.EntityFrameworkCore; namespace Hcs.WebApp.Services { public class HeadquartersService(IDbContextFactory factory) { private readonly IDbContextFactory factory = factory; public async Task HasActiveCampaignAsync(Campaign.CampaignType type) { using var context = factory.CreateDbContext(); return await context.Campaigns.AnyAsync(x => x.Type == type && !x.EndedAt.HasValue); } public async Task> GetInitiatedCampaignAsync() { using var context = factory.CreateDbContext(); return await (from campaign in context.Campaigns where !campaign.EndedAt.HasValue select campaign).ToListAsync(); } public async Task> GetInitiatedOperationsAsync() { using var context = factory.CreateDbContext(); return await (from operation in context.Operations where !operation.EndedAt.HasValue && string.IsNullOrEmpty(operation.MessageGuid) select operation).ToListAsync(); } public async Task InitiateCampaignAsync(Campaign.CampaignType type, string initiatorId) { using var context = factory.CreateDbContext(); var campaign = new Campaign() { Type = type, InitiatorId = initiatorId, CreatedAt = DateTime.UtcNow }; await context.Campaigns.AddAsync(campaign); await context.SaveChangesAsync(); return campaign; } public async Task InitiateOperationAsync(int campaignId, Operation.OperationType type) { using var context = factory.CreateDbContext(); var operation = new Operation() { CampaignId = campaignId, Type = type, CreatedAt = DateTime.UtcNow }; await context.Operations.AddAsync(operation); await context.SaveChangesAsync(); return operation; } public async Task SetCampaignEndedWithFail(int campaignId, string failureReason) { using var context = factory.CreateDbContext(); var campaign = await context.Campaigns.FirstOrDefaultAsync(x => x.Id == campaignId); if (campaign != null) { campaign.EndedAt = DateTime.UtcNow; campaign.FailureReason = failureReason; await context.SaveChangesAsync(); } } public async Task SetOperationStarted(int operationId) { using var context = factory.CreateDbContext(); var operation = await context.Operations.FirstOrDefaultAsync(x => x.Id == operationId); if (operation != null) { operation.StartedAt = DateTime.UtcNow; await context.SaveChangesAsync(); } } public async Task SetOperationEndedWithFail(int operationId, string failureReason) { using var context = factory.CreateDbContext(); var operation = await context.Operations.FirstOrDefaultAsync(x => x.Id == operationId); if (operation != null) { operation.EndedAt = DateTime.UtcNow; operation.FailureReason = failureReason; await context.SaveChangesAsync(); } } public async Task SetOperationMessageGuidAsync(int operationId, string messageGuid) { using var context = factory.CreateDbContext(); var operation = await context.Operations.FirstOrDefaultAsync(x => x.Id == operationId); if (operation != null) { operation.MessageGuid = messageGuid; await context.SaveChangesAsync(); } } } }