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.
86 lines
No EOL
2.4 KiB
C#
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; }
|
|
} |