using System; using System.Linq; using System.Threading.Tasks; using ManagerService.Data; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; namespace ManagerService.Services { /// /// Purge les VisitEvent au-delà de la fenêtre d'historique lisible. /// La fenêtre commerciale est de 13 mois () : /// garder indéfiniment des événements que personne ne peut plus lire coûte du stockage /// et alourdit chaque requête d'agrégation, sans rien apporter au client. /// /// ⚠️ Désactivé tant que Stats:RetentionDays n'est pas défini dans la configuration. /// C'est une suppression définitive : ne l'activer qu'une fois la sauvegarde applicative /// (pg_dump quotidien) en place — le snapshot OVH seul ne permet pas une restauration fine. /// public class VisitEventPurgeService { private readonly MyInfoMateDbContext _dbContext; private readonly IConfiguration _configuration; private readonly ILogger _logger; public VisitEventPurgeService( MyInfoMateDbContext dbContext, IConfiguration configuration, ILogger logger) { _dbContext = dbContext; _configuration = configuration; _logger = logger; } public async Task PurgeAsync() { var retentionDays = _configuration.GetValue("Stats:RetentionDays"); if (retentionDays <= 0) { _logger.LogInformation( "Purge des VisitEvent ignorée : Stats:RetentionDays non défini. " + "Valeur attendue une fois le pg_dump en place : {Expected}.", MyInfoMateDbContext.StatsRetentionDays); return; } var cutoff = DateTime.UtcNow.AddDays(-retentionDays); var deleted = await _dbContext.VisitEvents .Where(e => e.Timestamp < cutoff) .ExecuteDeleteAsync(); _logger.LogInformation( "Purge des VisitEvent : {Deleted} événements antérieurs au {Cutoff:yyyy-MM-dd} supprimés.", deleted, cutoff); } } }