Add GitHub-style activity contribution graph
CI / build-and-push (push) Successful in 52s
CI / deploy (push) Successful in 9s

Record create/update/delete events across novel content (chapters, beats,
characters, arc stages, tags, locations, questions) into an append-only
ActivityEvent log, aggregate by UTC day, and surface as a heatmap on the
novels list and each novel's dashboard. Backfills history from existing
CreatedAt timestamps on first boot after the migration.
This commit is contained in:
James Wampler
2026-08-19 17:39:13 -07:00
parent 51f3176bd0
commit 71953220aa
28 changed files with 2113 additions and 20 deletions
+3
View File
@@ -1,6 +1,7 @@
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Microsoft.EntityFrameworkCore;
using Novelly.Api.Activity;
using Novelly.Api.Agent;
using Novelly.Api.Beats;
using Novelly.Api.Chapters;
@@ -33,6 +34,7 @@ public class NovelDbContext(DbContextOptions<NovelDbContext> options) : Identity
public DbSet<ImportJob> ImportJobs => Set<ImportJob>();
public DbSet<Genre> Genres => Set<Genre>();
public DbSet<NovelMember> NovelMembers => Set<NovelMember>();
public DbSet<ActivityEvent> ActivityEvents => Set<ActivityEvent>();
Task<int> INovelDbContext.SaveChangesAsync(CancellationToken cancellationToken) => base.SaveChangesAsync(cancellationToken);
@@ -62,6 +64,7 @@ public interface INovelDbContext
DbSet<Genre> Genres { get; }
DbSet<NovellyUser> Users { get; }
DbSet<NovelMember> NovelMembers { get; }
DbSet<ActivityEvent> ActivityEvents { get; }
Task<int> SaveChangesAsync(CancellationToken cancellationToken = default);
}