feat(email): add Correspondence.Provider discriminator #13

Merged
cesnimda merged 1 commits from feat/correspondence-provider-discriminator into main 2026-07-11 19:53:33 +02:00
Owner

b4 of the multi-provider email roadmap. Manual/free-text correspondence entry already existed (CorrespondenceController.Create); this slice tags every Correspondence row with its source provider (gmail | manual today) via a new nullable Provider column, reconciled SQLite+MySQL with an idempotent backfill. Both write sites use a fixed literal, no injection surface. 148/148 green.

b4 of the multi-provider email roadmap. Manual/free-text correspondence entry already existed (CorrespondenceController.Create); this slice tags every Correspondence row with its source provider (gmail | manual today) via a new nullable Provider column, reconciled SQLite+MySQL with an idempotent backfill. Both write sites use a fixed literal, no injection surface. 148/148 green.
cesnimda added 1 commit 2026-07-11 19:48:40 +02:00
feat(email): add Correspondence.Provider discriminator
CI and Deploy / test (pull_request) Successful in 2m2s
CI and Deploy / deploy (pull_request) Has been skipped
cb2715c323
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>
cesnimda force-pushed feat/correspondence-provider-discriminator from 6a19a9f70d to cb2715c323 2026-07-11 19:48:40 +02:00 Compare
cesnimda merged commit c0d620f528 into main 2026-07-11 19:53:33 +02:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: cesnimda/jobtrackingapp#13