DRAB/Drab.Logic/Services/OldOrdersCleanupService.cs
2025-07-11 10:50:46 +02:00

69 lines
2.3 KiB
C#

using Microsoft.Extensions.Hosting;
namespace Drab.Logic.Services;
public class OldOrdersCleanupService : BackgroundService
{
private readonly IServiceProvider _services;
private readonly ILogger<OldOrdersCleanupService> _logger;
private readonly TimeSpan _interval = TimeSpan.FromHours(24);
public OldOrdersCleanupService(IServiceProvider services, ILogger<OldOrdersCleanupService> 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<LocalDbContext>();
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);
}
}
}