feat(#178): Mail -> Candidate (Phase 3 von #360) #365

Merged
admin-mrrm merged 1 commit from feat/178-mail-candidate-writer into main 2026-05-20 22:09:43 +02:00
Owner

Summary

Phase 3 von Epic #360 (Day-Planner Multi-Source-Todo). Mail wird die erste neue Source auf dem Candidate-Pattern aus Phase 1/2.

Minimal-Variante ohne die volle Rule-Engine aus #177:

  • Neuer Boolean mail_tags.creates_candidate (default false, Migration 0018)
  • MailCandidateWriterService schreibt einen Candidate (source='mail', sourceRef=messageId) wenn ein Tag mit createsCandidate=true bestätigt wird
  • Hook in MailTagsService.assignTag(confirmed) und confirmTag
  • PATCH /mail/tags/:tagId akzeptiert nun name und/oder createsCandidate
  • ON CONFLICT DO NOTHING → idempotent pro Mail (erster aktionabler Tag gewinnt, zweite Confirmation ist No-op)
  • Kommentar im Schema dokumentiert: #177 ersetzt das durch eine (tagId, actionType, config)-Tabelle

Out of scope (gehört in #177)

  • Rule-Editor-UI (für jetzt nur via API/PATCH zu setzen)
  • Mehrere Aktionstypen pro Tag, konfigurierbare Aktionen

Test plan

  • Unit-Tests: MailCandidateWriterService (5 Tests) + Hook-Tests in MailTagsService (2 Tests)
  • Integration-Tests (4 Tests): Confirm schreibt Candidate, createsCandidate=false schreibt nicht, Idempotenz bei mehreren Tags, PATCH-Endpoint setzt Flag
  • pnpm lint / pnpm typecheck / pnpm test / pnpm test:integration grün

🤖 Generated with Claude Code

## Summary Phase 3 von Epic #360 (Day-Planner Multi-Source-Todo). Mail wird die erste neue Source auf dem Candidate-Pattern aus Phase 1/2. Minimal-Variante ohne die volle Rule-Engine aus #177: - Neuer Boolean `mail_tags.creates_candidate` (default `false`, Migration `0018`) - `MailCandidateWriterService` schreibt einen Candidate (`source='mail'`, `sourceRef=messageId`) wenn ein Tag mit `createsCandidate=true` bestätigt wird - Hook in `MailTagsService.assignTag(confirmed)` und `confirmTag` - `PATCH /mail/tags/:tagId` akzeptiert nun `name` und/oder `createsCandidate` - `ON CONFLICT DO NOTHING` → idempotent pro Mail (erster aktionabler Tag gewinnt, zweite Confirmation ist No-op) - Kommentar im Schema dokumentiert: #177 ersetzt das durch eine `(tagId, actionType, config)`-Tabelle ## Out of scope (gehört in #177) - Rule-Editor-UI (für jetzt nur via API/PATCH zu setzen) - Mehrere Aktionstypen pro Tag, konfigurierbare Aktionen ## Test plan - [x] Unit-Tests: `MailCandidateWriterService` (5 Tests) + Hook-Tests in `MailTagsService` (2 Tests) - [x] Integration-Tests (4 Tests): Confirm schreibt Candidate, `createsCandidate=false` schreibt nicht, Idempotenz bei mehreren Tags, PATCH-Endpoint setzt Flag - [x] `pnpm lint` / `pnpm typecheck` / `pnpm test` / `pnpm test:integration` grün 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(#178): Mail -> Candidate (Phase 3 von #360)
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
78e7158471
Mail wird die erste neue Source auf dem Candidate-Pattern. Minimal-Variante
ohne die volle Rule-Engine aus #177:

- Neuer Boolean mail_tags.creates_candidate (default false, Migration 0018)
- MailCandidateWriterService schreibt einen Candidate (source='mail',
  sourceRef=messageId) wenn ein Tag mit createsCandidate=true bestaetigt wird
- Hook in MailTagsService.assignTag(confirmed) und confirmTag
- PATCH /mail/tags/:tagId akzeptiert nun name und/oder createsCandidate
- ON CONFLICT DO NOTHING -> idempotent pro Mail (erster aktionabler Tag
  gewinnt, zweite Confirmation ist No-op)
- Stop-gap-Kommentar im Schema: #177 ersetzt das durch eine
  (tagId, actionType, config)-Tabelle

Tests: 5 Unit-Tests fuer den Writer, 2 zusaetzliche fuer den Hook in
MailTagsService, 4 Integration-Tests fuer den End-to-End-Flow.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
admin-mrrm/mrrmlabapp!365
No description provided.