forked from xiongyuxing/tiku-backend.net
184 lines
11 KiB
C#
184 lines
11 KiB
C#
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.Import;
|
|
using Tiku.Domain.Learning;
|
|
using Tiku.Domain.Operations;
|
|
using Tiku.Domain.Platform;
|
|
using Tiku.Domain.QuestionBanks;
|
|
using Tiku.Domain.Tenancy;
|
|
|
|
namespace Tiku.Infrastructure.Persistence;
|
|
|
|
public sealed class TikuDbContext(DbContextOptions<TikuDbContext> options) : DbContext(options)
|
|
{
|
|
public DbSet<Tenant> Tenants => Set<Tenant>();
|
|
public DbSet<User> Users => Set<User>();
|
|
public DbSet<UserIdentity> UserIdentities => Set<UserIdentity>();
|
|
public DbSet<TenantMembership> TenantMemberships => Set<TenantMembership>();
|
|
public DbSet<TenantDomain> TenantDomains => Set<TenantDomain>();
|
|
public DbSet<TenantBranding> TenantBrandings => Set<TenantBranding>();
|
|
public DbSet<TenantSettings> TenantSettings => Set<TenantSettings>();
|
|
public DbSet<TenantAuthProvider> TenantAuthProviders => Set<TenantAuthProvider>();
|
|
public DbSet<SmsVerificationCode> SmsVerificationCodes => Set<SmsVerificationCode>();
|
|
public DbSet<AuthLoginEvent> AuthLoginEvents => Set<AuthLoginEvent>();
|
|
public DbSet<AuthSession> AuthSessions => Set<AuthSession>();
|
|
public DbSet<SmsSendRateLimit> SmsSendRateLimits => Set<SmsSendRateLimit>();
|
|
public DbSet<TenantRoleTemplate> TenantRoleTemplates => Set<TenantRoleTemplate>();
|
|
public DbSet<TenantClass> TenantClasses => Set<TenantClass>();
|
|
public DbSet<TenantClassMember> TenantClassMembers => Set<TenantClassMember>();
|
|
public DbSet<TenantStudentNote> TenantStudentNotes => Set<TenantStudentNote>();
|
|
public DbSet<TenantStudentFollowup> TenantStudentFollowups => Set<TenantStudentFollowup>();
|
|
public DbSet<StudentProfile> StudentProfiles => Set<StudentProfile>();
|
|
public DbSet<Region> Regions => Set<Region>();
|
|
public DbSet<RegionModule> RegionModules => Set<RegionModule>();
|
|
public DbSet<ModuleNode> ModuleNodes => Set<ModuleNode>();
|
|
public DbSet<School> Schools => Set<School>();
|
|
public DbSet<Major> Majors => Set<Major>();
|
|
public DbSet<Subject> Subjects => Set<Subject>();
|
|
public DbSet<Category> Categories => Set<Category>();
|
|
public DbSet<QuestionBank> QuestionBanks => Set<QuestionBank>();
|
|
public DbSet<Question> Questions => Set<Question>();
|
|
public DbSet<QuestionVersion> QuestionVersions => Set<QuestionVersion>();
|
|
public DbSet<ContentEntry> ContentEntries => Set<ContentEntry>();
|
|
public DbSet<ContentNode> ContentNodes => Set<ContentNode>();
|
|
public DbSet<QuestionCollection> QuestionCollections => Set<QuestionCollection>();
|
|
public DbSet<QuestionCollectionItem> QuestionCollectionItems => Set<QuestionCollectionItem>();
|
|
public DbSet<PracticeBlueprint> PracticeBlueprints => Set<PracticeBlueprint>();
|
|
public DbSet<VocabularyUnit> VocabularyUnits => Set<VocabularyUnit>();
|
|
public DbSet<VocabularyWord> VocabularyWords => Set<VocabularyWord>();
|
|
public DbSet<UserWordProgress> UserWordProgress => Set<UserWordProgress>();
|
|
public DbSet<UserWordFavorite> UserWordFavorites => Set<UserWordFavorite>();
|
|
public DbSet<HandbookSubject> HandbookSubjects => Set<HandbookSubject>();
|
|
public DbSet<HandbookChapter> HandbookChapters => Set<HandbookChapter>();
|
|
public DbSet<HandbookEntry> HandbookEntries => Set<HandbookEntry>();
|
|
public DbSet<QuestionTypeGroup> QuestionTypeGroups => Set<QuestionTypeGroup>();
|
|
public DbSet<SubjectShare> SubjectShares => Set<SubjectShare>();
|
|
public DbSet<ContentAsset> ContentAssets => Set<ContentAsset>();
|
|
public DbSet<ContentAssetAccessEvent> ContentAssetAccessEvents => Set<ContentAssetAccessEvent>();
|
|
public DbSet<ContentAssetSecurityScanEvent> ContentAssetSecurityScanEvents => Set<ContentAssetSecurityScanEvent>();
|
|
public DbSet<ContentImportJob> ContentImportJobs => Set<ContentImportJob>();
|
|
public DbSet<ContentImportItem> ContentImportItems => Set<ContentImportItem>();
|
|
public DbSet<ContentImportIssue> ContentImportIssues => Set<ContentImportIssue>();
|
|
public DbSet<ImageAsset> Images => Set<ImageAsset>();
|
|
public DbSet<AppAsset> AppAssets => Set<AppAsset>();
|
|
public DbSet<VideoExplanation> VideoExplanations => Set<VideoExplanation>();
|
|
public DbSet<QuestionVideo> QuestionVideos => Set<QuestionVideo>();
|
|
public DbSet<QuestionBankGrant> QuestionBankGrants => Set<QuestionBankGrant>();
|
|
public DbSet<TenantQuestionBankAdoption> TenantQuestionBankAdoptions => Set<TenantQuestionBankAdoption>();
|
|
public DbSet<AiRecommendationReport> AiRecommendationReports => Set<AiRecommendationReport>();
|
|
public DbSet<PracticeSession> PracticeSessions => Set<PracticeSession>();
|
|
public DbSet<AnswerRecord> AnswerRecords => Set<AnswerRecord>();
|
|
public DbSet<FavoriteQuestion> FavoriteQuestions => Set<FavoriteQuestion>();
|
|
public DbSet<WrongQuestion> WrongQuestions => Set<WrongQuestion>();
|
|
public DbSet<RecentPractice> RecentPractices => Set<RecentPractice>();
|
|
public DbSet<ExamDate> ExamDates => Set<ExamDate>();
|
|
public DbSet<Report> Reports => Set<Report>();
|
|
public DbSet<ReportStatusEvent> ReportStatusEvents => Set<ReportStatusEvent>();
|
|
public DbSet<UserScoreEvent> UserScoreEvents => Set<UserScoreEvent>();
|
|
public DbSet<PracticeDailyUsage> PracticeDailyUsages => Set<PracticeDailyUsage>();
|
|
public DbSet<PracticeAccessEvent> PracticeAccessEvents => Set<PracticeAccessEvent>();
|
|
public DbSet<PracticeSessionReport> PracticeSessionReports => Set<PracticeSessionReport>();
|
|
public DbSet<PracticeSessionReportSection> PracticeSessionReportSections => Set<PracticeSessionReportSection>();
|
|
public DbSet<DashboardDailyStat> DashboardDailyStats => Set<DashboardDailyStat>();
|
|
public DbSet<RevenueDailyStat> RevenueDailyStats => Set<RevenueDailyStat>();
|
|
public DbSet<Product> Products => Set<Product>();
|
|
public DbSet<SvipPlan> SvipPlans => Set<SvipPlan>();
|
|
public DbSet<Order> Orders => Set<Order>();
|
|
public DbSet<OrderItem> OrderItems => Set<OrderItem>();
|
|
public DbSet<Payment> Payments => Set<Payment>();
|
|
public DbSet<PaymentEvent> PaymentEvents => Set<PaymentEvent>();
|
|
public DbSet<Entitlement> Entitlements => Set<Entitlement>();
|
|
public DbSet<CodeBatch> CodeBatches => Set<CodeBatch>();
|
|
public DbSet<ActivationCode> ActivationCodes => Set<ActivationCode>();
|
|
public DbSet<Coupon> Coupons => Set<Coupon>();
|
|
public DbSet<CouponRedemption> CouponRedemptions => Set<CouponRedemption>();
|
|
public DbSet<TenantPaymentAccount> TenantPaymentAccounts => Set<TenantPaymentAccount>();
|
|
public DbSet<TenantSubscription> TenantSubscriptions => Set<TenantSubscription>();
|
|
public DbSet<TenantUsageRecord> TenantUsageRecords => Set<TenantUsageRecord>();
|
|
public DbSet<CommerceRefundRequest> CommerceRefundRequests => Set<CommerceRefundRequest>();
|
|
public DbSet<CommerceRefundEvent> CommerceRefundEvents => Set<CommerceRefundEvent>();
|
|
public DbSet<CommerceReconciliationBatch> CommerceReconciliationBatches => Set<CommerceReconciliationBatch>();
|
|
public DbSet<CommerceReconciliationItem> CommerceReconciliationItems => Set<CommerceReconciliationItem>();
|
|
public DbSet<CommerceReconciliationIssue> CommerceReconciliationIssues => Set<CommerceReconciliationIssue>();
|
|
public DbSet<CommerceReconciliationIssueEvent> CommerceReconciliationIssueEvents => Set<CommerceReconciliationIssueEvent>();
|
|
public DbSet<ReferralTrack> ReferralTracks => Set<ReferralTrack>();
|
|
public DbSet<ReferralCode> ReferralCodes => Set<ReferralCode>();
|
|
public DbSet<ReferralLead> ReferralLeads => Set<ReferralLead>();
|
|
public DbSet<ReferralTeamEdge> ReferralTeamEdges => Set<ReferralTeamEdge>();
|
|
public DbSet<ReferralQrcode> ReferralQrcodes => Set<ReferralQrcode>();
|
|
public DbSet<CrmConfig> CrmConfigs => Set<CrmConfig>();
|
|
public DbSet<CrmWebhookQueueItem> CrmWebhookQueue => Set<CrmWebhookQueueItem>();
|
|
public DbSet<CrmWebhookLog> CrmWebhookLogs => Set<CrmWebhookLog>();
|
|
public DbSet<TenantCommissionSetting> TenantCommissionSettings => Set<TenantCommissionSetting>();
|
|
public DbSet<CommissionSettlement> CommissionSettlements => Set<CommissionSettlement>();
|
|
public DbSet<CommissionSettlementItem> CommissionSettlementItems => Set<CommissionSettlementItem>();
|
|
public DbSet<Banner> Banners => Set<Banner>();
|
|
public DbSet<Faq> Faqs => Set<Faq>();
|
|
public DbSet<Announcement> Announcements => Set<Announcement>();
|
|
public DbSet<AuditLog> AuditLogs => Set<AuditLog>();
|
|
public DbSet<UserNotification> UserNotifications => Set<UserNotification>();
|
|
public DbSet<Badge> Badges => Set<Badge>();
|
|
public DbSet<UserBadge> UserBadges => Set<UserBadge>();
|
|
public DbSet<TenantContentNotification> TenantContentNotifications => Set<TenantContentNotification>();
|
|
public DbSet<TenantThemeTemplate> TenantThemeTemplates => Set<TenantThemeTemplate>();
|
|
public DbSet<TenantThemeConfig> TenantThemeConfigs => Set<TenantThemeConfig>();
|
|
public DbSet<PlatformSaasPlan> PlatformSaasPlans => Set<PlatformSaasPlan>();
|
|
public DbSet<TenantBillingProfile> TenantBillingProfiles => Set<TenantBillingProfile>();
|
|
public DbSet<TenantInvoice> TenantInvoices => Set<TenantInvoice>();
|
|
public DbSet<TenantInvoiceItem> TenantInvoiceItems => Set<TenantInvoiceItem>();
|
|
public DbSet<TenantInvoicePayment> TenantInvoicePayments => Set<TenantInvoicePayment>();
|
|
public DbSet<TenantInvoiceReminder> TenantInvoiceReminders => Set<TenantInvoiceReminder>();
|
|
public DbSet<PlatformAuditAlertRule> PlatformAuditAlertRules => Set<PlatformAuditAlertRule>();
|
|
public DbSet<PlatformAuditAlert> PlatformAuditAlerts => Set<PlatformAuditAlert>();
|
|
public DbSet<PlatformDunningNotificationChannel> PlatformDunningNotificationChannels => Set<PlatformDunningNotificationChannel>();
|
|
public DbSet<PlatformDunningNotificationEvent> PlatformDunningNotificationEvents => Set<PlatformDunningNotificationEvent>();
|
|
public DbSet<PocketBaseImportRun> PocketBaseImportRuns => Set<PocketBaseImportRun>();
|
|
public DbSet<PocketBaseRawRecord> PocketBaseRawRecords => Set<PocketBaseRawRecord>();
|
|
public DbSet<PocketBaseImportIssue> PocketBaseImportIssues => Set<PocketBaseImportIssue>();
|
|
|
|
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<int> 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<IHasTimestamps>())
|
|
{
|
|
if (entry.State == EntityState.Added)
|
|
{
|
|
entry.Entity.CreatedAt = now;
|
|
}
|
|
|
|
if (entry.State is EntityState.Added or EntityState.Modified)
|
|
{
|
|
entry.Entity.UpdatedAt = now;
|
|
}
|
|
}
|
|
}
|
|
}
|