feat(email): add MicrosoftGraphProvider (Outlook/365 via Graph OAuth) #10

Merged
cesnimda merged 1 commits from feat/microsoft-graph-provider into main 2026-07-11 18:33:18 +02:00
Owner

b2 of the multi-provider email roadmap. Mirrors GmailProvider/GmailOAuthService/GmailController: MicrosoftGraphConnection table, MicrosoftGraphOAuthService, MicrosoftGraphProvider implementing IEmailProvider, MicrosoftGraphController. 147/147 green.

b2 of the multi-provider email roadmap. Mirrors GmailProvider/GmailOAuthService/GmailController: MicrosoftGraphConnection table, MicrosoftGraphOAuthService, MicrosoftGraphProvider implementing IEmailProvider, MicrosoftGraphController. 147/147 green.
cesnimda added 1 commit 2026-07-11 18:08:55 +02:00
feat(email): add MicrosoftGraphProvider (Outlook/365 via Graph OAuth)
CI and Deploy / test (pull_request) Successful in 2m1s
CI and Deploy / deploy (pull_request) Has been skipped
cacad5cc94
b2 of the multi-provider email roadmap. Mirrors the Gmail provider's shape
end-to-end so the two stay structurally interchangeable:

- MicrosoftGraphConnection model + table (reconciler pattern, SQLite+MySQL,
  same shape as GmailConnection: encrypted refresh/access token, sync state).
- MicrosoftGraphOAuthService: auth-code + offline-access flow against
  login.microsoftonline.com, encrypted token storage via IDataProtector,
  message search/thread/detail fetch against Microsoft Graph (conversationId
  stands in for Gmail's threadId), attachment listing.
- MicrosoftGraphProvider implements IEmailProvider — no contract changes;
  the existing seam was already provider-neutral.
- MicrosoftGraphController: connect-url/oauth/callback/status/disconnect,
  mirrors GmailController's OAuth surface exactly (including the popup
  postMessage handshake). Job-matching/review endpoints stay Gmail-only for
  now, per the roadmap — generalising those needs the frontend provider
  picker work, not this slice.
- Registered in DI + IEmailProviderRegistry (multi-registration of
  IEmailProvider, resolved by ProviderKey).
- Config: Microsoft:ClientId/ClientSecret/TenantId/RedirectUri, wired through
  docker-compose.yml + .env.example alongside the existing Google:Gmail* keys.
- Tests: MicrosoftGraphControllerTests (OAuth lifecycle) +
  MicrosoftGraphProviderTests (DTO mapping onto the neutral contract).
  147/147 green (135 existing + 12 new).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
cesnimda merged commit 3eef06e906 into main 2026-07-11 18:33:18 +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#10