feat(email): add Correspondence.Provider discriminator
b4 of the multi-provider email roadmap. The manual/free-text correspondence entry path already existed (CorrespondenceController.Create) -- this slice was narrower than the roadmap wording suggests: tag every Correspondence row with which provider it came from (gmail | manual today; microsoft | imap once those providers grow an import-into-Correspondence path of their own), not build a new endpoint. - Correspondence.Provider (nullable string), reconciled via the existing EnsureColumn pattern (SQLite + MySQL). - Idempotent backfill: rows with an ExternalThreadId (historically only ever written by Gmail import) get 'gmail'; everything else gets 'manual'. - GmailController.ImportSingleMessageAsync now tags Provider = "gmail". - CorrespondenceController.Create now tags Provider = "manual". - Both write sites use a fixed literal, not request input -- no injection surface introduced. Backfill SQL is static, no interpolation. 148/148 green (147 existing + 1 new CorrespondenceControllerTests; the GmailController import test gained a Provider assertion in place). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -288,6 +288,7 @@ public sealed class GmailControllerTests
|
||||
|
||||
var storedMessages = await db.Correspondences.Where(message => message.JobApplicationId == job.Id).ToListAsync();
|
||||
Assert.Single(storedMessages);
|
||||
Assert.Equal("gmail", storedMessages[0].Provider);
|
||||
gmail.Verify(service => service.GetMessageAsync("user-1", "msg-1", It.IsAny<CancellationToken>()), Times.Once);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user