using Extrudex.Domain.Base; using Extrudex.Domain.Entities; using Microsoft.EntityFrameworkCore; namespace Extrudex.Infrastructure.Data; /// /// Main EF Core database context for the Extrudex system. /// Handles entity registration, snake_case naming, and automatic timestamp management. /// public class ExtrudexDbContext : DbContext { public ExtrudexDbContext(DbContextOptions options) : base(options) { } // Lookup tables public DbSet MaterialBases => Set(); public DbSet MaterialFinishes => Set(); public DbSet MaterialModifiers => Set(); // Core entities public DbSet Spools => Set(); public DbSet Printers => Set(); public DbSet AmsUnits => Set(); public DbSet AmsSlots => Set(); public DbSet PrintJobs => Set(); public DbSet FilamentUsages => Set(); public DbSet UsageLogs => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Apply all entity type configurations from the assembly modelBuilder.ApplyConfigurationsFromAssembly(typeof(ExtrudexDbContext).Assembly); // Apply seed data modelBuilder.Entity().HasData(SeedData.MaterialBases); modelBuilder.Entity().HasData(SeedData.MaterialFinishes); modelBuilder.Entity().HasData(SeedData.MaterialModifiers); } /// /// Automatically set UpdatedAt on auditable entities during SaveChanges. /// public override int SaveChanges(bool acceptAllChangesOnSuccess) { SetAuditTimestamps(); return base.SaveChanges(acceptAllChangesOnSuccess); } public override async Task SaveChangesAsync( bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default) { SetAuditTimestamps(); return await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken); } /// /// Sets UpdatedAt on all auditable entities that have been modified. /// Sets CreatedAt on all auditable entities that are being added. /// private void SetAuditTimestamps() { var entries = ChangeTracker.Entries(); foreach (var entry in entries) { if (entry.State == EntityState.Added) { entry.Entity.CreatedAt = DateTime.UtcNow; entry.Entity.UpdatedAt = DateTime.UtcNow; } else if (entry.State == EntityState.Modified) { entry.Entity.UpdatedAt = DateTime.UtcNow; } } } }