using FreeTubeSync.Model.Database; using Microsoft.EntityFrameworkCore; namespace FreeTubeSync.Database; public class DataContext : DbContext { public DataContext(DbContextOptions options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .Navigation(e => e.subscriptions).AutoInclude(); modelBuilder.Entity() .Navigation(e => e.videos).AutoInclude(); } public override int SaveChanges() { TrackChanges(); return base.SaveChanges(); } public override async Task SaveChangesAsync(CancellationToken ct = default) { TrackChanges(); return await base.SaveChangesAsync(ct); } private void TrackChanges() { var changedEntries = ChangeTracker.Entries() .Where(e => e.State == EntityState.Added || e.State == EntityState.Modified || e.State == EntityState.Deleted) .ToList(); foreach (var entry in changedEntries) { var log = new ChangeLog { TableName = entry.Metadata.GetTableName() ?? entry.Entity.GetType().Name, ChangeType = entry.State.ToString(), ChangeTime = DateTime.UtcNow }; ChangeLogs.Add(log); } } public ChangeLog? GetLatestChange() { return ChangeLogs .OrderByDescending(cl => cl.ChangeTime) .FirstOrDefault(); } public async Task GetLatestChangeAsync(CancellationToken ct = default) { return await ChangeLogs .OrderByDescending(cl => cl.ChangeTime) .FirstOrDefaultAsync(ct); } public DbSet Histories { get; set; } public DbSet Playlists { get; set; } public DbSet Profiles { get; set; } public DbSet SearchHistories { get; set; } public DbSet Settings { get; set; } public DbSet Subscriptions { get; set; } public DbSet