using LCU.Library.Internal.MemberPreferencesApiModels.Entities; using LCU.Library.Internal.MemberPreferencesApiModels.Enums; using LCU.Library.Internal.MemberPreferencesApiModels.Models; using Microsoft.EntityFrameworkCore; using System.Reflection; namespace LCU.API.Internal.MemberPreferencesApiLib.Persistence; public class ApplicationDbContext : DbContext, IApplicationDbContext { private readonly IDictionary _systemModifiedAuditables = new Dictionary(); public ApplicationDbContext(DbContextOptions options) : base(options) { } public DbSet MemberPreferences { get; set; } public DbSet MemberOptInSettings { get; set; } public DbSet DnaAuditProcesses { get; set; } public DbSet XdiBatchItems { get; set; } public override Task SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken()) { foreach (var entry in ChangeTracker.Entries()) { var auditableUser = _systemModifiedAuditables.TryGetValue(entry.Entity, out var systemUser); var applicationUser = new ApplicationUser { UserName = systemUser, UserType = UserType.System }; var otherUser = new ApplicationUser { UserName = "Unknown", UserType = UserType.System, }; var currentUser = auditableUser ? applicationUser : otherUser; switch (entry.State) { case EntityState.Added: entry.Entity.CreatedByType = currentUser.UserType; entry.Entity.CreatedBy = currentUser.UserName; entry.Entity.Created = DateTime.Now; entry.Entity.LastUpdatedByType = currentUser.UserType; entry.Entity.LastUpdatedBy = currentUser.UserName; entry.Entity.LastUpdated = DateTime.Now; break; case EntityState.Modified: entry.Entity.LastUpdatedByType = currentUser.UserType; entry.Entity.LastUpdatedBy = currentUser.UserName; entry.Entity.LastUpdated = DateTime.Now; break; } } return base.SaveChangesAsync(cancellationToken); } public Task SaveChangesWithOperatorAsync(string operatorId, DateTime dateAdded, UserType userType, CancellationToken cancellationToken = new CancellationToken()) { foreach (var entry in ChangeTracker.Entries()) { switch (entry.State) { case EntityState.Added: entry.Entity.CreatedByType = userType; entry.Entity.CreatedBy = operatorId; entry.Entity.Created = dateAdded; entry.Entity.LastUpdatedByType = userType; entry.Entity.LastUpdatedBy = operatorId; entry.Entity.LastUpdated = dateAdded; break; case EntityState.Modified: entry.Entity.LastUpdatedByType = userType; entry.Entity.LastUpdatedBy = operatorId; entry.Entity.LastUpdated = dateAdded; break; } } return base.SaveChangesAsync(cancellationToken); } public void SystemModified(Auditable entity, string modifiedBy) => _systemModifiedAuditables[entity] = modifiedBy; protected override void OnModelCreating(ModelBuilder builder) { builder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly()); base.OnModelCreating(builder); builder.Entity().ToTable("MemberPreference"); builder.Entity().HasKey(p => p.Id); builder.Entity().ToTable("XdiBatchItems"); builder.Entity().HasKey(p => new { p.UserId, p.BatchState }); builder.Entity().ToTable("MemberOptInSettings"); builder.Entity().HasKey(p => p.Id); builder.Entity().HasIndex(p => new { p.UserId }) .IsUnique(true); builder.Entity().ToTable("DnaAuditProcess"); builder.Entity().HasKey(p => p.ProcessId); } }