freetubesync/FreeTubeSync/Database/DataContext.cs
Mario Steele 004c490dd8 Looks like we finally have a solution.
Change logging to just log a message, instead of the exception.
Moved logic to Syncer involvement.  When posting the data, if a 500 is
returned, then it is up to the Syncer to re-submit it.
2025-08-09 04:09:17 -05:00

86 lines
No EOL
2.4 KiB
C#

using FreeTubeSync.Model;
using Microsoft.EntityFrameworkCore;
namespace FreeTubeSync.Database;
public class DataContext : DbContext
{
public DataContext(DbContextOptions<DataContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Profile>()
.OwnsMany<Subscription>(o => o.subscriptions);
modelBuilder.Entity<Playlist>()
.OwnsMany<Video>(o => o.videos);
}
public override int SaveChanges()
{
TrackChanges();
return base.SaveChanges();
}
public override async Task<int> 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<ChangeLog?> GetLatestChangeAsync(CancellationToken ct = default)
{
return await ChangeLogs
.OrderByDescending(cl => cl.ChangeTime)
.FirstOrDefaultAsync(ct);
}
public async Task CleanupChangeLogAsync(CancellationToken ct = default)
{
var logs = await ChangeLogs.ToListAsync(ct);
if (logs.Count < 50) return;
for (var i = 0; i < (logs.Count - 50); i++)
{
ChangeLogs.Remove(logs[i]);
}
await base.SaveChangesAsync(ct);
}
public DbSet<History> Histories { get; set; }
public DbSet<Playlist> Playlists { get; set; }
public DbSet<Profile> Profiles { get; set; }
public DbSet<SearchHistory> SearchHistories { get; set; }
public DbSet<Setting> Settings { get; set; }
public DbSet<ChangeLog> ChangeLogs { get; set; }
}