using Microsoft.EntityFrameworkCore; using Tiku.Domain.Catalog; using Tiku.Domain.Commerce; using Tiku.Domain.Common; using Tiku.Domain.Content; using Tiku.Domain.Growth; using Tiku.Domain.Identity; using Tiku.Domain.Learning; using Tiku.Domain.Operations; using Tiku.Domain.QuestionBanks; using Tiku.Domain.Tenancy; namespace Tiku.Infrastructure.Persistence; public sealed class TikuDbContext(DbContextOptions options) : DbContext(options) { public DbSet Tenants => Set(); public DbSet Users => Set(); public DbSet UserIdentities => Set(); public DbSet TenantMemberships => Set(); public DbSet TenantDomains => Set(); public DbSet TenantBrandings => Set(); public DbSet TenantSettings => Set(); public DbSet TenantAuthProviders => Set(); public DbSet SmsVerificationCodes => Set(); public DbSet AuthLoginEvents => Set(); public DbSet AuthSessions => Set(); public DbSet SmsSendRateLimits => Set(); public DbSet TenantRoleTemplates => Set(); public DbSet TenantClasses => Set(); public DbSet TenantClassMembers => Set(); public DbSet TenantStudentNotes => Set(); public DbSet TenantStudentFollowups => Set(); public DbSet StudentProfiles => Set(); public DbSet Regions => Set(); public DbSet RegionModules => Set(); public DbSet ModuleNodes => Set(); public DbSet Schools => Set(); public DbSet Majors => Set(); public DbSet Subjects => Set(); public DbSet Categories => Set(); public DbSet QuestionBanks => Set(); public DbSet Questions => Set(); public DbSet QuestionVersions => Set(); public DbSet ContentEntries => Set(); public DbSet ContentNodes => Set(); public DbSet QuestionCollections => Set(); public DbSet QuestionCollectionItems => Set(); public DbSet PracticeBlueprints => Set(); public DbSet VocabularyUnits => Set(); public DbSet VocabularyWords => Set(); public DbSet UserWordProgress => Set(); public DbSet UserWordFavorites => Set(); public DbSet HandbookSubjects => Set(); public DbSet HandbookChapters => Set(); public DbSet HandbookEntries => Set(); public DbSet QuestionTypeGroups => Set(); public DbSet SubjectShares => Set(); public DbSet ContentAssets => Set(); public DbSet ContentAssetAccessEvents => Set(); public DbSet ContentAssetSecurityScanEvents => Set(); public DbSet ContentImportJobs => Set(); public DbSet ContentImportItems => Set(); public DbSet ContentImportIssues => Set(); public DbSet Images => Set(); public DbSet AppAssets => Set(); public DbSet VideoExplanations => Set(); public DbSet QuestionVideos => Set(); public DbSet QuestionBankGrants => Set(); public DbSet TenantQuestionBankAdoptions => Set(); public DbSet AiRecommendationReports => Set(); public DbSet PracticeSessions => Set(); public DbSet AnswerRecords => Set(); public DbSet FavoriteQuestions => Set(); public DbSet WrongQuestions => Set(); public DbSet RecentPractices => Set(); public DbSet ExamDates => Set(); public DbSet Reports => Set(); public DbSet ReportStatusEvents => Set(); public DbSet UserScoreEvents => Set(); public DbSet PracticeDailyUsages => Set(); public DbSet PracticeAccessEvents => Set(); public DbSet PracticeSessionReports => Set(); public DbSet PracticeSessionReportSections => Set(); public DbSet DashboardDailyStats => Set(); public DbSet RevenueDailyStats => Set(); public DbSet Products => Set(); public DbSet SvipPlans => Set(); public DbSet Orders => Set(); public DbSet OrderItems => Set(); public DbSet Payments => Set(); public DbSet PaymentEvents => Set(); public DbSet Entitlements => Set(); public DbSet CodeBatches => Set(); public DbSet ActivationCodes => Set(); public DbSet Coupons => Set(); public DbSet CouponRedemptions => Set(); public DbSet TenantPaymentAccounts => Set(); public DbSet TenantSubscriptions => Set(); public DbSet TenantUsageRecords => Set(); public DbSet CommerceRefundRequests => Set(); public DbSet CommerceRefundEvents => Set(); public DbSet CommerceReconciliationBatches => Set(); public DbSet CommerceReconciliationItems => Set(); public DbSet CommerceReconciliationIssues => Set(); public DbSet CommerceReconciliationIssueEvents => Set(); public DbSet ReferralTracks => Set(); public DbSet ReferralCodes => Set(); public DbSet ReferralLeads => Set(); public DbSet ReferralTeamEdges => Set(); public DbSet ReferralQrcodes => Set(); public DbSet CrmConfigs => Set(); public DbSet CrmWebhookQueue => Set(); public DbSet CrmWebhookLogs => Set(); public DbSet TenantCommissionSettings => Set(); public DbSet CommissionSettlements => Set(); public DbSet CommissionSettlementItems => Set(); public DbSet Banners => Set(); public DbSet Faqs => Set(); public DbSet Announcements => Set(); public DbSet AuditLogs => Set(); public DbSet UserNotifications => Set(); public DbSet Badges => Set(); public DbSet UserBadges => Set(); public DbSet TenantContentNotifications => Set(); public DbSet TenantThemeTemplates => Set(); public DbSet TenantThemeConfigs => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.HasPostgresExtension("citext"); modelBuilder.HasPostgresExtension("ltree"); modelBuilder.ApplyConfigurationsFromAssembly(typeof(TikuDbContext).Assembly); modelBuilder.UseSnakeCaseIdentifiers(); } public override int SaveChanges(bool acceptAllChangesOnSuccess) { UpdateTimestamps(); return base.SaveChanges(acceptAllChangesOnSuccess); } public override Task SaveChangesAsync( bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default) { UpdateTimestamps(); return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken); } private void UpdateTimestamps() { var now = DateTimeOffset.UtcNow; foreach (var entry in ChangeTracker.Entries()) { if (entry.State == EntityState.Added) { entry.Entity.CreatedAt = now; } if (entry.State is EntityState.Added or EntityState.Modified) { entry.Entity.UpdatedAt = now; } } } }