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 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;
}
}
}
}