fix: Code-Review-Korrekturen für PR #1

- Cross-Tenant-Datenleck in get_group_members: Account-Filter im
  LEFT JOIN contacts hinzugefügt (c.account = g.account)
- CROSS JOIN in get_group durch sauberen JOIN ON g.id = gm.group_id
  ersetzt
- Leere Gruppen werden jetzt gespeichert (parse_group gibt auch
  leere member_uids-Listen zurück)
- ON DELETE CASCADE Doku korrigiert: CASCADE greift nur beim Löschen
  einer Gruppe, nicht beim Löschen eines Kontakts
- Migration für Bestands-DBs in README dokumentiert (sync_state
  leeren für vollen Re-Sync)
- Index idx_group_members_member_uid für get_groups_for_contact
- Unbenutzte is_admin-Variablen in neuen Endpoints bereinigt
This commit is contained in:
2026-08-07 15:30:17 +02:00
parent 94a279f207
commit cccb4217b0
4 changed files with 29 additions and 17 deletions
+17 -3
View File
@@ -162,9 +162,23 @@ Gruppen sind über die API abrufbar:
- `GET /api/groups/{id}/members` — Nur Members einer Gruppe
- `GET /api/contacts/{id}` — Enthält `groups`-Feld mit Gruppennamen
Wird ein Kontakt gelöscht, wird die Mitgliedschaft in Gruppen
automatisch entfernt (`ON DELETE CASCADE`). Die Gruppe selbst bleibt
erhalten.
Wird eine Gruppe gelöscht, werden zugehörige Memberschaften automatisch
entfernt (`ON DELETE CASCADE`). Gelöschte Mitglied-Kontakte verbleiben
als Member-Eintrag in der Gruppe (ohne aufgelöste Kontaktdaten). Beim
nächsten vollen Re-Sync werden tote Memberschaften bereinigt.
### Migration bei erstem Deploy
Bei Bestands-DBs lagen Gruppen bisher als normale Kontakte in der
`contacts`-Tabelle. Nach dem Deploy müssen diese einmalig bereinigt
werden:
1. Sync-Container stoppen: `docker compose stop icloud-contacts-sync`
2. Sync-State zurücksetzen: `DELETE FROM sync_state;` (erzwingt vollen Re-Sync)
3. Container neu starten: `docker compose start icloud-contacts-sync`
Beim nächsten Sync-Lauf werden alle vCards neu klassifiziziert —
Gruppen landen in `groups`, Kontakte bleiben in `contacts`.
## 11. Web-Ansicht und API (interner Zugriff über Authelia)