From 57739f99a4d3412010a1664c1e5efebc5d8505b1 Mon Sep 17 00:00:00 2001 From: Stefan Koelle Date: Fri, 7 Aug 2026 15:33:31 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20group=5Fmembers=20beim=20Kontakt-L=C3=B6?= =?UTF-8?q?schen=20bereinigen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- README.md | 6 +++--- src/db.py | 14 ++++++++++++++ src/sync.py | 1 + 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7d1f845..5740304 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/src/db.py b/src/db.py index 7e9136b..c082400 100644 --- a/src/db.py +++ b/src/db.py @@ -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"), diff --git a/src/sync.py b/src/sync.py index 00e7cdd..016817a 100644 --- a/src/sync.py +++ b/src/sync.py @@ -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: