using System.Reflection; using CMSMicroservice.Application.Common.Interfaces; using Microsoft.EntityFrameworkCore.Diagnostics; using CMSMicroservice.Domain.Entities; using CMSMicroservice.Domain.Entities.Payment; using CMSMicroservice.Domain.Entities.Order; using CMSMicroservice.Domain.Entities.DiscountShop; using CMSMicroservice.Infrastructure.Persistence.Interceptors; using MediatR; using Microsoft.EntityFrameworkCore; namespace CMSMicroservice.Infrastructure.Persistence; public class ApplicationDbContext : DbContext, IApplicationDbContext { private readonly IMediator _mediator; private readonly AuditableEntitySaveChangesInterceptor _auditableEntitySaveChangesInterceptor; public ApplicationDbContext( DbContextOptions options, IMediator mediator, AuditableEntitySaveChangesInterceptor auditableEntitySaveChangesInterceptor) : base(options) { _mediator = mediator; _auditableEntitySaveChangesInterceptor = auditableEntitySaveChangesInterceptor; } protected override void OnModelCreating(ModelBuilder builder) { builder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly()); builder.HasDefaultSchema("CMS"); // Ignore MediatR notification types builder.Ignore(); base.OnModelCreating(builder); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.AddInterceptors(_auditableEntitySaveChangesInterceptor); // Suppress PendingModelChangesWarning in EF Core 9 optionsBuilder.ConfigureWarnings(w => w.Ignore(RelationalEventId.PendingModelChangesWarning)); } public override async Task SaveChangesAsync(CancellationToken cancellationToken = default) { await _mediator.DispatchDomainEvents(this); return await base.SaveChangesAsync(cancellationToken); } public DbSet UserAddresses => Set(); public DbSet Packages => Set(); public DbSet Roles => Set(); public DbSet Categories => Set(); public DbSet UserRoles => Set(); public DbSet UserCarts => Set(); public DbSet ProductGalleries => Set(); public DbSet FactorDetails => Set(); public DbSet Products => Set(); public DbSet ProductImages => Set(); public DbSet Users => Set(); public DbSet OtpTokens => Set(); public DbSet Contracts => Set(); public DbSet UserContracts => Set(); public DbSet Tags => Set(); public DbSet ProductCategories => Set(); public DbSet ProductTags => Set(); public DbSet Transactions => Set(); public DbSet UserOrders => Set(); public DbSet OrderVATs => Set(); public DbSet UserPackagePurchases => Set(); public DbSet UserWallets => Set(); public DbSet UserWalletChangeLogs => Set(); public DbSet DayaLoanContracts => Set(); // Payment public DbSet ManualPayments => Set(); // Message public DbSet PublicMessages => Set(); // ============= Network Club System DbSets ============= // Configuration public DbSet SystemConfigurations => Set(); public DbSet SystemConfigurationHistories => Set(); // Club Management public DbSet ClubMemberships => Set(); public DbSet ClubFeatures => Set(); public DbSet UserClubFeatures => Set(); public DbSet ClubMembershipHistories => Set(); // Network public DbSet NetworkWeeklyBalances => Set(); public DbSet NetworkMembershipHistories => Set(); // Commission public DbSet WeeklyCommissionPools => Set(); public DbSet UserCommissionPayouts => Set(); public DbSet CommissionPayoutHistories => Set(); public DbSet WorkerExecutionLogs => Set(); // ============= Discount Shop DbSets ============= public DbSet DiscountProducts => Set(); public DbSet DiscountCategories => Set(); public DbSet DiscountProductCategories => Set(); public DbSet DiscountShoppingCarts => Set(); public DbSet DiscountOrders => Set(); public DbSet DiscountOrderDetails => Set(); }