using FictionArchive.Service.Shared.Models.Interfaces; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; using NodaTime; namespace FictionArchive.Service.Shared.Services.Database; public class AuditInterceptor : SaveChangesInterceptor { public override InterceptionResult SavingChanges( DbContextEventData eventData, InterceptionResult result) { var context = eventData.Context; SetAuditFields(context); return base.SavingChanges(eventData, result); } public override ValueTask> SavingChangesAsync(DbContextEventData eventData, InterceptionResult result, CancellationToken cancellationToken = new CancellationToken()) { var context = eventData.Context; SetAuditFields(context); return base.SavingChangesAsync(eventData, result, cancellationToken); } private void SetAuditFields(DbContext? context) { if (context == null) return; var entries = context.ChangeTracker.Entries(); var now = Instant.FromDateTimeUtc(DateTime.UtcNow); foreach (var e in entries) { if (e.State == EntityState.Added) { e.Entity.CreatedTime = now; e.Entity.LastUpdatedTime = now; } else if (e.State == EntityState.Modified) { e.Entity.LastUpdatedTime = now; } } } }