mirror of
https://github.com/skoelle/icloud-contacts-sync.git
synced 2026-09-17 15:30:24 +00:00
fix: group_members beim Kontakt-Löschen bereinigen
Neue Funktion delete_group_members_by_uids in db.py entfernt Member-Einträge aus group_members wenn ein Kontakt gelöscht wird. Nutzt JOIN über groups Tabelle für Account-Scoping. Doku in README.md aktualisiert.
This commit is contained in:
@@ -163,9 +163,9 @@ Gruppen sind über die API abrufbar:
|
||||
- `GET /api/contacts/{id}` — Enthält `groups`-Feld mit Gruppennamen
|
||||
|
||||
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.
|
||||
entfernt (`ON DELETE CASCADE`). Wird ein Mitglied-Kontakt gelöscht,
|
||||
wird der Member-Eintrag in allen Gruppen ebenfalls entfernt (manueller
|
||||
Cleanup im Sync-Code). Die Gruppe selbst bleibt erhalten.
|
||||
|
||||
### Migration bei erstem Deploy
|
||||
|
||||
|
||||
@@ -130,6 +130,20 @@ def delete_contacts_by_href_uids(conn, account: str, uids: list[str]):
|
||||
conn.commit()
|
||||
|
||||
|
||||
def delete_group_members_by_uids(conn, account: str, uids: list[str]):
|
||||
if not uids:
|
||||
return
|
||||
with conn.cursor() as cur:
|
||||
placeholders = ", ".join(["%s"] * len(uids))
|
||||
cur.execute(
|
||||
f"""DELETE gm FROM group_members gm
|
||||
JOIN `groups` g ON g.id = gm.group_id
|
||||
WHERE g.account = %s AND gm.member_uid IN ({placeholders})""",
|
||||
[account] + uids,
|
||||
)
|
||||
conn.commit()
|
||||
|
||||
|
||||
def _build_full_name(row: dict) -> str | None:
|
||||
parts = [
|
||||
row.get("prefix"),
|
||||
|
||||
@@ -86,6 +86,7 @@ def sync_account(conn, account, href_to_uid_cache: dict):
|
||||
else:
|
||||
logger.warning("[%s] Konnte UID nicht aus href extrahieren: %s", account.name, href)
|
||||
db.delete_contacts_by_href_uids(conn, account.name, deleted_uids)
|
||||
db.delete_group_members_by_uids(conn, account.name, deleted_uids)
|
||||
db.delete_groups_by_uids(conn, account.name, deleted_uids)
|
||||
|
||||
if new_token:
|
||||
|
||||
Reference in New Issue
Block a user