From 899039b3ee720e8712be9f00d8ba1bd013b83d14 Mon Sep 17 00:00:00 2001 From: Moritz Date: Thu, 23 Oct 2025 13:13:12 +0200 Subject: [PATCH] add docs --- docs/email-sync.md | 49 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 docs/email-sync.md diff --git a/docs/email-sync.md b/docs/email-sync.md new file mode 100644 index 0000000..c191ff4 --- /dev/null +++ b/docs/email-sync.md @@ -0,0 +1,49 @@ +## Core Rules + +1. **User.email is source of truth** - Always overrides member email when linking +2. **DB constraints** - Prevent duplicates within same table (users.email, members.email) +3. **Custom validations** - Prevent cross-table conflicts only for linked entities +4. **Sync is bidirectional**: User ↔ Member (but User always wins on link) + +--- + +## Decision Tree + +``` +Action: Create/Update/Link Entity with Email X +│ +├─ Does Email X violate DB constraint (same table)? +│ └─ YES → ❌ FAIL (two users or two members with same email) +│ +├─ Is Entity currently linked? (or being linked?) +│ │ +│ ├─ NO (unlinked entity) +│ │ └─ ✅ SUCCESS (no custom validation) +│ │ +│ └─ YES (linked or linking) +│ │ +│ ├─ Action: Update Linked User Email +│ │ ├─ Email used by other member? → ❌ FAIL (validation) +│ │ └─ Email unique? → ✅ SUCCESS + sync to member +│ │ +│ ├─ Action: Update Linked Member Email +│ │ ├─ Email used by other user? → ❌ FAIL (validation) +│ │ └─ Email unique? → ✅ SUCCESS + sync to user +│ │ +│ ├─ Action: Link User to Member (both directions) +│ │ ├─ User email used by other member? → ❌ FAIL (validation) +│ │ └─ Otherwise → ✅ SUCCESS + override member email + +``` + +## Sync Triggers + +| Action | Sync Direction | When | +|--------|---------------|------| +| Update linked user email | User → Member | Email changed | +| Update linked member email | Member → User | Email changed | +| Link user to member | User → Member | Always (override) | +| Link member to user | User → Member | Always (override) | +| Unlink | None | Emails stay as-is | + +