feat(email): include drafts in user exports
Export readable private draft content only through existing owner-filtered encrypted and daily export boundaries, with cross-tenant regression coverage.
This commit is contained in:
@@ -89,6 +89,21 @@ namespace JobTrackerApi.Controllers
|
||||
attempt.StartedAtUtc,
|
||||
attempt.CompletedAtUtc))
|
||||
.ToListAsync(cancellationToken);
|
||||
var emailDrafts = await _db.EmailDrafts.AsNoTracking()
|
||||
.Where(draft => jobIds.Contains(draft.JobApplicationId))
|
||||
.OrderBy(draft => draft.UpdatedAtUtc)
|
||||
.Select(draft => new EmailDraftExport(
|
||||
draft.Id,
|
||||
draft.JobApplicationId,
|
||||
draft.Provider,
|
||||
draft.To,
|
||||
draft.Subject,
|
||||
draft.BodyText,
|
||||
draft.ThreadId,
|
||||
draft.Revision,
|
||||
draft.CreatedAtUtc,
|
||||
draft.UpdatedAtUtc))
|
||||
.ToListAsync(cancellationToken);
|
||||
var rules = await _db.RuleSettings.AsNoTracking().FirstOrDefaultAsync(cancellationToken);
|
||||
|
||||
return new
|
||||
@@ -99,6 +114,7 @@ namespace JobTrackerApi.Controllers
|
||||
Attachments = attachments,
|
||||
Events = events,
|
||||
EmailSendAttempts = emailSendAttempts,
|
||||
EmailDrafts = emailDrafts,
|
||||
Rules = rules
|
||||
};
|
||||
}
|
||||
|
||||
@@ -15,3 +15,15 @@ public sealed class EmailDraft
|
||||
public DateTime CreatedAtUtc { get; set; }
|
||||
public DateTime UpdatedAtUtc { get; set; }
|
||||
}
|
||||
|
||||
public sealed record EmailDraftExport(
|
||||
Guid Id,
|
||||
int JobApplicationId,
|
||||
string Provider,
|
||||
string To,
|
||||
string Subject,
|
||||
string BodyText,
|
||||
string? ThreadId,
|
||||
long Revision,
|
||||
DateTime CreatedAtUtc,
|
||||
DateTime UpdatedAtUtc);
|
||||
|
||||
@@ -77,6 +77,21 @@ public sealed class DailyExportHostedService(
|
||||
attempt.StartedAtUtc,
|
||||
attempt.CompletedAtUtc))
|
||||
.ToListAsync(cancellationToken),
|
||||
EmailDrafts = await db.EmailDrafts.AsNoTracking()
|
||||
.Where(draft => jobIds.Contains(draft.JobApplicationId))
|
||||
.OrderBy(draft => draft.UpdatedAtUtc)
|
||||
.Select(draft => new EmailDraftExport(
|
||||
draft.Id,
|
||||
draft.JobApplicationId,
|
||||
draft.Provider,
|
||||
draft.To,
|
||||
draft.Subject,
|
||||
draft.BodyText,
|
||||
draft.ThreadId,
|
||||
draft.Revision,
|
||||
draft.CreatedAtUtc,
|
||||
draft.UpdatedAtUtc))
|
||||
.ToListAsync(cancellationToken),
|
||||
Rules = await RulesEngine.GetSettings(db, cancellationToken),
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user