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 { /// /// Supprime les questions posées au guide IA au-delà de 90 jours. /// /// Contrairement à , cette purge n'est **pas** /// conditionnée à un réglage : la durée est un engagement pris dans les CGU (§8.4), pas /// un paramètre commercial. Un job de conformité qui ne s'exécute pas faute de /// configuration serait pire que pas de job du tout — il donnerait l'illusion du respect. /// La clé VisitorQuestions:RetentionDays n'existe que pour raccourcir le délai en /// recette ; absente, la valeur légale s'applique. /// /// ⚠️ **Dépendance non satisfaite à ce jour.** Les CGU annoncent que « les regroupements /// par thème sont conservés au-delà, sous forme agrégée ». Or ThemeId est porté par /// la ligne VisitorQuestion elle-même : supprimer la ligne supprime aussi l'agrégat. /// Tant qu'une table d'agrégats distincte n'existe pas, la première purge fera perdre au /// client tout son historique au 91ᵉ jour. Rien n'est encore collecté, donc le délai n'a /// pas commencé à courir — mais la table doit exister avant la mise en service. /// public class VisitorQuestionPurgeService { /// Durée annoncée aux visiteurs et aux clients. Voir CGU §8.4. public const int RetentionDays = 90; private readonly MyInfoMateDbContext _dbContext; private readonly IConfiguration _configuration; private readonly ILogger _logger; public VisitorQuestionPurgeService( MyInfoMateDbContext dbContext, IConfiguration configuration, ILogger logger) { _dbContext = dbContext; _configuration = configuration; _logger = logger; } public async Task PurgeAsync() { var configured = _configuration.GetValue("VisitorQuestions:RetentionDays"); var retentionDays = configured > 0 ? configured : RetentionDays; var cutoff = DateTime.UtcNow.AddDays(-retentionDays); var deleted = await _dbContext.VisitorQuestions .Where(q => q.CreatedAt < cutoff) .ExecuteDeleteAsync(); if (deleted > 0) { _logger.LogInformation( "Purge RGPD des questions visiteurs : {Deleted} question(s) antérieure(s) au {Cutoff:yyyy-MM-dd} supprimée(s).", deleted, cutoff); } } } }