diff --git a/backend/Core/Musify.Infrastructure/Persistence/AuditableEntityInterceptor.cs b/backend/Core/Musify.Infrastructure/Persistence/AuditableEntityInterceptor.cs index c1732d2..6a490c5 100644 --- a/backend/Core/Musify.Infrastructure/Persistence/AuditableEntityInterceptor.cs +++ b/backend/Core/Musify.Infrastructure/Persistence/AuditableEntityInterceptor.cs @@ -37,7 +37,7 @@ namespace Musify.Infrastructure.Persistence } else if (entry.State == EntityState.Modified) { - entry.Entity.UpdatedAt = now; + entry.Property(nameof(IAuditable.UpdatedAt)).CurrentValue = now; } } } diff --git a/backend/Core/Musify.Infrastructure/Persistence/Database.cs b/backend/Core/Musify.Infrastructure/Persistence/Database.cs index ad18df8..9085718 100644 --- a/backend/Core/Musify.Infrastructure/Persistence/Database.cs +++ b/backend/Core/Musify.Infrastructure/Persistence/Database.cs @@ -13,9 +13,13 @@ namespace Musify.Infrastructure.Persistence public class Database(DatabaseConfiguration configuration) : DbContext, AppIDatabase { + private static readonly AuditableEntityInterceptor AuditInterceptor = new(); + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { - optionsBuilder.UseNpgsql(configuration.ConnectionString, o => o.MapEnum("genre")); + optionsBuilder + .UseNpgsql(configuration.ConnectionString, o => o.MapEnum("genre")) + .AddInterceptors(AuditInterceptor); } protected override void OnModelCreating(ModelBuilder modelBuilder) diff --git a/backend/Core/Musify.Infrastructure/Persistence/DatabaseDependencyInjection.cs b/backend/Core/Musify.Infrastructure/Persistence/DatabaseDependencyInjection.cs index 5052808..e577bc5 100644 --- a/backend/Core/Musify.Infrastructure/Persistence/DatabaseDependencyInjection.cs +++ b/backend/Core/Musify.Infrastructure/Persistence/DatabaseDependencyInjection.cs @@ -18,10 +18,7 @@ namespace Musify.Infrastructure.Persistence serviceDescriptors.AddSingleton(serviceProvider => serviceProvider.GetRequiredService>().Value); - serviceDescriptors.AddSingleton(); - - serviceDescriptors.AddDbContext((serviceProvider, options) => - options.AddInterceptors(serviceProvider.GetRequiredService())); + serviceDescriptors.AddDbContext(); serviceDescriptors.AddScoped(serviceProvider => serviceProvider.GetRequiredService()); diff --git a/backend/Tests/Musify.Infrastructure.Tests/Persistence/AuditableEntityInterceptorTests.cs b/backend/Tests/Musify.Infrastructure.Tests/Persistence/AuditableEntityInterceptorTests.cs index b6ef79e..db7ce42 100644 --- a/backend/Tests/Musify.Infrastructure.Tests/Persistence/AuditableEntityInterceptorTests.cs +++ b/backend/Tests/Musify.Infrastructure.Tests/Persistence/AuditableEntityInterceptorTests.cs @@ -1,3 +1,4 @@ +using Microsoft.EntityFrameworkCore; using Musify.Domain.Entities; using Musify.Infrastructure.Tests.TestSupport; using Xunit; @@ -43,6 +44,11 @@ namespace Musify.Infrastructure.Tests.Persistence Assert.Equal(originalCreatedAt, user.CreatedAt); Assert.True(user.UpdatedAt > originalCreatedAt, $"original-created-at={originalCreatedAt:O}, final-updated-at={user.UpdatedAt:O}"); + + await using var reader = fixture.CreateDatabase(); + var stored = await reader.Users.SingleAsync(u => u.Id == user.Id, TestContext.Current.CancellationToken); + Assert.True(stored.UpdatedAt > stored.CreatedAt, + $"stored-created-at={stored.CreatedAt:O}, stored-updated-at={stored.UpdatedAt:O}"); } } }