Files
tiku-backend.net/Tiku.Infrastructure/Persistence/TikuDbContext.cs

100 lines
4.7 KiB
C#

using Microsoft.EntityFrameworkCore;
using Tiku.Domain.Catalog;
using Tiku.Domain.Common;
using Tiku.Domain.Content;
using Tiku.Domain.Identity;
using Tiku.Domain.Learning;
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<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<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<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>();
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;
}
}
}
}