using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; using Musify.Domain.Abstractions; namespace Musify.Infrastructure.Persistence { public sealed class AuditableEntityInterceptor : SaveChangesInterceptor { public override InterceptionResult SavingChanges(DbContextEventData eventData, InterceptionResult result) { ApplyTimestamps(eventData.Context); return base.SavingChanges(eventData, result); } public override ValueTask> SavingChangesAsync( DbContextEventData eventData, InterceptionResult result, CancellationToken cancellationToken = default) { ApplyTimestamps(eventData.Context); return base.SavingChangesAsync(eventData, result, cancellationToken); } private static void ApplyTimestamps(DbContext? context) { if (context is null) return; var now = DateTime.UtcNow; foreach (var entry in context.ChangeTracker.Entries()) { if (entry.State == EntityState.Added) { entry.Entity.CreatedAt = now; entry.Entity.UpdatedAt = now; } else if (entry.State == EntityState.Modified) { entry.Entity.UpdatedAt = now; } } } } }