fix(email): preserve draft send identity
Persist and export each draft's idempotency UUID so refresh and edits cannot create a fresh delivery identity. Add reversible provider-specific migration SQL.
This commit is contained in:
@@ -100,6 +100,7 @@ namespace JobTrackerApi.Controllers
|
||||
draft.Subject,
|
||||
draft.BodyText,
|
||||
draft.ThreadId,
|
||||
draft.ClientRequestId,
|
||||
draft.Revision,
|
||||
draft.CreatedAtUtc,
|
||||
draft.UpdatedAtUtc))
|
||||
|
||||
@@ -25,6 +25,7 @@ public sealed class EmailDraftsController(
|
||||
string Subject,
|
||||
string BodyText,
|
||||
string? ThreadId,
|
||||
string ClientRequestId,
|
||||
long Revision,
|
||||
DateTime CreatedAtUtc,
|
||||
DateTime UpdatedAtUtc);
|
||||
@@ -41,15 +42,17 @@ public sealed class EmailDraftsController(
|
||||
|
||||
[HttpGet]
|
||||
public async Task<ActionResult<IReadOnlyList<DraftDto>>> List(
|
||||
[FromQuery] int jobApplicationId,
|
||||
[FromQuery] int? jobApplicationId,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
var ownerUserId = GetOwnerUserId();
|
||||
if (ownerUserId is null) return Unauthorized();
|
||||
if (jobApplicationId <= 0) return BadRequest("A valid job application is required.");
|
||||
if (jobApplicationId is <= 0) return BadRequest("A valid job application is required.");
|
||||
|
||||
return Ok(await db.EmailDrafts.AsNoTracking()
|
||||
.Where(draft => draft.OwnerUserId == ownerUserId && draft.JobApplicationId == jobApplicationId)
|
||||
var query = db.EmailDrafts.AsNoTracking().Where(draft => draft.OwnerUserId == ownerUserId);
|
||||
if (jobApplicationId.HasValue)
|
||||
query = query.Where(draft => draft.JobApplicationId == jobApplicationId.Value);
|
||||
return Ok(await query
|
||||
.OrderByDescending(draft => draft.UpdatedAtUtc)
|
||||
.Select(draft => new DraftDto(
|
||||
draft.Id,
|
||||
@@ -59,6 +62,7 @@ public sealed class EmailDraftsController(
|
||||
draft.Subject,
|
||||
draft.BodyText,
|
||||
draft.ThreadId,
|
||||
draft.ClientRequestId,
|
||||
draft.Revision,
|
||||
draft.CreatedAtUtc,
|
||||
draft.UpdatedAtUtc))
|
||||
@@ -103,6 +107,7 @@ public sealed class EmailDraftsController(
|
||||
Subject = subject,
|
||||
BodyText = bodyText,
|
||||
ThreadId = threadId,
|
||||
ClientRequestId = Guid.NewGuid().ToString("D"),
|
||||
Revision = 1,
|
||||
CreatedAtUtc = now,
|
||||
UpdatedAtUtc = now,
|
||||
@@ -193,6 +198,7 @@ public sealed class EmailDraftsController(
|
||||
draft.Subject,
|
||||
draft.BodyText,
|
||||
draft.ThreadId,
|
||||
draft.ClientRequestId,
|
||||
draft.Revision,
|
||||
draft.CreatedAtUtc,
|
||||
draft.UpdatedAtUtc);
|
||||
|
||||
Reference in New Issue
Block a user