using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; using OnlyPrompt.Backend.Database.Core; using OnlyPrompt.Backend.Database.Models; namespace OnlyPrompt.Backend.Database { public class OnlyPromptContext : DbContext { public DbSet Users { get; set; } public DbSet UserProfiles { get; set; } public DbSet Categories { get; set; } public DbSet Prompts { get; set; } public DbSet SubscriptionTiers { get; set; } public DbSet Subscriptions { get; set; } public DbSet Reviews { get; set; } public OnlyPromptContext(DbContextOptions options) : base(options) { } private void HandleEntityTimestamps() { var entries = ChangeTracker.Entries(); var now = DateTime.UtcNow; foreach (var entry in entries) { if (entry.State == EntityState.Added) { entry.Entity.CreatedAt = now; entry.Entity.UpdatedAt = now; } else if (entry.State == EntityState.Modified) { entry.Entity.UpdatedAt = now; } } } public override Task SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default) { HandleEntityTimestamps(); return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken); } public override int SaveChanges(bool acceptAllChangesOnSuccess) { HandleEntityTimestamps(); return base.SaveChanges(acceptAllChangesOnSuccess); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); if(optionsBuilder.IsConfigured == false) { optionsBuilder.UseNpgsql(); optionsBuilder.UseLazyLoadingProxies(); } } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity(entity => { entity.HasOne(e => e.Profile) .WithOne(p => p.User) .HasForeignKey(p => p.Id); }); modelBuilder.Entity(entity => { entity.HasOne(e => e.Subscriber) .WithMany(s => s.Subscriptions) .HasForeignKey(e => e.SubscriberId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.SubscribedTo) .WithMany(c => c.Subscribers) .HasForeignKey(e => e.SubscribedToId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.SubscriptionTier) .WithMany(t => t.Subscriptions) .HasForeignKey(e => e.SubscriptionTierId) .OnDelete(DeleteBehavior.SetNull); }); } } }