From 505ae05c5382e9619df92c29a5a76151a070841e Mon Sep 17 00:00:00 2001 From: XShine555 Date: Wed, 23 Sep 2026 19:04:21 +0200 Subject: [PATCH] Refactor AuditableEntityInterceptor to use property access for UpdatedAt; update Database configuration to add interceptor and adjust tests for consistency --- .../Persistence/AuditableEntityInterceptor.cs | 2 +- backend/Core/Musify.Infrastructure/Persistence/Database.cs | 6 +++++- .../Persistence/DatabaseDependencyInjection.cs | 5 +---- .../Persistence/AuditableEntityInterceptorTests.cs | 6 ++++++ 4 files changed, 13 insertions(+), 6 deletions(-) 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}"); } } }