using Microsoft.Extensions.Options; using SeaHaven.Services.Configuration; using SeaHaven.Services.Interfaces; namespace Api.SeaHavenIndustries.HostedServices { public class UpliftLifecycleHostedService : BackgroundService { private readonly IServiceScopeFactory _scopeFactory; private readonly ILogger _logger; private readonly ApprovalsOptions _options; public UpliftLifecycleHostedService( IServiceScopeFactory scopeFactory, IOptions options, ILogger logger) { _scopeFactory = scopeFactory; _logger = logger; _options = options.Value; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { try { await SweepAsync(stoppingToken); } catch (OperationCanceledException) { throw; } catch (Exception ex) { _logger.LogError(ex, "Uplift lifecycle sweep failed; will retry on next interval"); } await Task.Delay(_options.EffectiveSweepInterval, stoppingToken); } } private async Task SweepAsync(CancellationToken cancellationToken) { using var scope = _scopeFactory.CreateScope(); var lifecycle = scope.ServiceProvider.GetRequiredService(); await lifecycle.ExpireDueAsync(cancellationToken); await lifecycle.SendDueInitialNotificationsAsync(cancellationToken); await lifecycle.EscalateDueAsync(cancellationToken); } } }