using Microsoft.Extensions.Hosting; namespace Drab.Logic.Services; public class OldOrdersCleanupService : BackgroundService { private readonly IServiceProvider _services; private readonly ILogger _logger; private readonly TimeSpan _interval = TimeSpan.FromHours(24); public OldOrdersCleanupService(IServiceProvider services, ILogger logger) { _services = services; _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { try { using var scope = _services.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); var threshold = DateTime.Now.AddDays(-45); var oldOrders = dbContext.Orders .Where(o => o.Created < threshold) .ToList(); var filesToDelete = oldOrders .Select(o => Path.Combine(Constants.ReportsOutputPath, o.Filename)) .Where(p => !string.IsNullOrWhiteSpace(p) && File.Exists(p)) .ToList(); foreach (var path in filesToDelete) { try { File.Delete(path); } catch (Exception ex) { _logger.LogWarning(ex, "Failed to delete file: {FilePath}", path); } } if (oldOrders.Count > 0) { dbContext.Orders.RemoveRange(oldOrders); await dbContext.SaveChangesAsync(stoppingToken); _logger.LogInformation("Removed {OrderCount} old orders and deleted {FileCount} files.", oldOrders.Count, filesToDelete.Count); } else { _logger.LogInformation("Nothing to do."); } } catch (Exception ex) { _logger.LogError(ex, "Error occured:"); } await Task.Delay(_interval, stoppingToken); } } }