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);
}
}
}