feat(email): add tenant draft persistence
CI and Deploy / test (pull_request) Successful in 4m15s
CI and Deploy / deploy (pull_request) Has been skipped

Add owner-filtered, job-cascading private draft storage with reversible SQLite and MariaDB migration paths. No API or UI exposes draft content yet.
This commit is contained in:
cesnimda
2026-08-10 09:55:16 +02:00
parent ee8efd361d
commit 14b396a452
6 changed files with 2960 additions and 0 deletions
+16
View File
@@ -62,6 +62,7 @@ namespace JobTrackerApi.Data
public DbSet<UserOperation> UserOperations => Set<UserOperation>();
public DbSet<UserNotification> UserNotifications => Set<UserNotification>();
public DbSet<EmailSendAttempt> EmailSendAttempts => Set<EmailSendAttempt>();
public DbSet<EmailDraft> EmailDrafts => Set<EmailDraft>();
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
@@ -280,6 +281,21 @@ namespace JobTrackerApi.Data
.HasForeignKey(x => x.JobApplicationId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<EmailDraft>()
.HasQueryFilter(x => CurrentUserId != null && x.OwnerUserId == CurrentUserId);
modelBuilder.Entity<EmailDraft>().Property(x => x.OwnerUserId).HasMaxLength(255);
modelBuilder.Entity<EmailDraft>().Property(x => x.Provider).HasMaxLength(32);
modelBuilder.Entity<EmailDraft>().Property(x => x.To).HasMaxLength(320);
modelBuilder.Entity<EmailDraft>().Property(x => x.Subject).HasMaxLength(998);
modelBuilder.Entity<EmailDraft>().Property(x => x.ThreadId).HasMaxLength(512);
modelBuilder.Entity<EmailDraft>()
.HasIndex(x => new { x.OwnerUserId, x.JobApplicationId, x.UpdatedAtUtc });
modelBuilder.Entity<EmailDraft>()
.HasOne(x => x.JobApplication)
.WithMany()
.HasForeignKey(x => x.JobApplicationId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<TailoredCvDraft>()
.HasQueryFilter(x => CurrentUserId != null && x.OwnerUserId == CurrentUserId);