From 3772a6db5642da523729835affca03cff8c62e2e Mon Sep 17 00:00:00 2001 From: Werner Sembach Date: Tue, 3 Dec 2019 13:16:07 +0100 Subject: [PATCH 1/3] Automatically delete empty groups/communities Signed-off-by: Werner Sembach --- AUTHORS.rst | 3 ++ synapse/groups/groups_server.py | 5 ++++ .../56/nuke_empty_communities_from_db.sql | 29 +++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 synapse/storage/data_stores/main/schema/delta/56/nuke_empty_communities_from_db.sql diff --git a/AUTHORS.rst b/AUTHORS.rst index b8b31a5b47cf..014f16d4a2b2 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -46,3 +46,6 @@ Joseph Weston Benjamin Saunders * Documentation improvements + +Werner Sembach + * Automatically remove a group/community when it is empty diff --git a/synapse/groups/groups_server.py b/synapse/groups/groups_server.py index 29e8ffc295f2..1415d5ad43c6 100644 --- a/synapse/groups/groups_server.py +++ b/synapse/groups/groups_server.py @@ -773,6 +773,11 @@ def remove_user_from_group(self, group_id, user_id, requester_user_id, content): if not self.hs.is_mine_id(user_id): yield self.store.maybe_delete_remote_profile_cache(user_id) + # Delete group if last user has left + users = yield self.store.get_users_in_group(group_id, include_private=True) + if not users: + yield self.store.delete_group(group_id) + return {} @defer.inlineCallbacks diff --git a/synapse/storage/data_stores/main/schema/delta/56/nuke_empty_communities_from_db.sql b/synapse/storage/data_stores/main/schema/delta/56/nuke_empty_communities_from_db.sql new file mode 100644 index 000000000000..791c0d897ca1 --- /dev/null +++ b/synapse/storage/data_stores/main/schema/delta/56/nuke_empty_communities_from_db.sql @@ -0,0 +1,29 @@ +/* Copyright 2019 Matrix.org Foundation CIC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +-- Groups/communities now get deleted when the last member leaves. This is a one time cleanup to remove old groups/communities that were already empty before that change was made. +DELETE FROM group_attestations_remote WHERE group_id IN (SELECT group_id FROM groups WHERE NOT EXISTS (SELECT group_id FROM group_users WHERE group_id = groups.group_id)); +DELETE FROM group_attestations_renewals WHERE group_id IN (SELECT group_id FROM groups WHERE NOT EXISTS (SELECT group_id FROM group_users WHERE group_id = groups.group_id)); +DELETE FROM group_invites WHERE group_id IN (SELECT group_id FROM groups WHERE NOT EXISTS (SELECT group_id FROM group_users WHERE group_id = groups.group_id)); +DELETE FROM group_roles WHERE group_id IN (SELECT group_id FROM groups WHERE NOT EXISTS (SELECT group_id FROM group_users WHERE group_id = groups.group_id)); +DELETE FROM group_room_categories WHERE group_id IN (SELECT group_id FROM groups WHERE NOT EXISTS (SELECT group_id FROM group_users WHERE group_id = groups.group_id)); +DELETE FROM group_rooms WHERE group_id IN (SELECT group_id FROM groups WHERE NOT EXISTS (SELECT group_id FROM group_users WHERE group_id = groups.group_id)); +DELETE FROM group_summary_roles WHERE group_id IN (SELECT group_id FROM groups WHERE NOT EXISTS (SELECT group_id FROM group_users WHERE group_id = groups.group_id)); +DELETE FROM group_summary_room_categories WHERE group_id IN (SELECT group_id FROM groups WHERE NOT EXISTS (SELECT group_id FROM group_users WHERE group_id = groups.group_id)); +DELETE FROM group_summary_rooms WHERE group_id IN (SELECT group_id FROM groups WHERE NOT EXISTS (SELECT group_id FROM group_users WHERE group_id = groups.group_id)); +DELETE FROM group_summary_users WHERE group_id IN (SELECT group_id FROM groups WHERE NOT EXISTS (SELECT group_id FROM group_users WHERE group_id = groups.group_id)); +DELETE FROM local_group_membership WHERE group_id IN (SELECT group_id FROM groups WHERE NOT EXISTS (SELECT group_id FROM group_users WHERE group_id = groups.group_id)); +DELETE FROM local_group_updates WHERE group_id IN (SELECT group_id FROM groups WHERE NOT EXISTS (SELECT group_id FROM group_users WHERE group_id = groups.group_id)); +DELETE FROM groups WHERE group_id IN (SELECT group_id FROM groups WHERE NOT EXISTS (SELECT group_id FROM group_users WHERE group_id = groups.group_id)); From baadb88a179e26c96489a3b8bf8e4322774a109d Mon Sep 17 00:00:00 2001 From: Werner Sembach Date: Tue, 3 Dec 2019 13:26:41 +0100 Subject: [PATCH 2/3] Add newsfragment Signed-off-by: Werner Sembach --- changelog.d/6453.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/6453.feature diff --git a/changelog.d/6453.feature b/changelog.d/6453.feature new file mode 100644 index 000000000000..e7bb801c6a0a --- /dev/null +++ b/changelog.d/6453.feature @@ -0,0 +1 @@ +Automatically delete empty groups/communities. From a6130bb4ef517e7433cbb3e66f9bf9f933b8e41b Mon Sep 17 00:00:00 2001 From: Werner Sembach Date: Wed, 11 Dec 2019 15:34:43 +0100 Subject: [PATCH 3/3] Implement changes requested by anoadragon453 --- synapse/groups/groups_server.py | 2 +- .../main/schema/delta/56/nuke_empty_communities_from_db.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/synapse/groups/groups_server.py b/synapse/groups/groups_server.py index 1415d5ad43c6..0ec9be3cb518 100644 --- a/synapse/groups/groups_server.py +++ b/synapse/groups/groups_server.py @@ -773,7 +773,7 @@ def remove_user_from_group(self, group_id, user_id, requester_user_id, content): if not self.hs.is_mine_id(user_id): yield self.store.maybe_delete_remote_profile_cache(user_id) - # Delete group if last user has left + # Delete group if the last user has left users = yield self.store.get_users_in_group(group_id, include_private=True) if not users: yield self.store.delete_group(group_id) diff --git a/synapse/storage/data_stores/main/schema/delta/56/nuke_empty_communities_from_db.sql b/synapse/storage/data_stores/main/schema/delta/56/nuke_empty_communities_from_db.sql index 791c0d897ca1..4f24c1405dfe 100644 --- a/synapse/storage/data_stores/main/schema/delta/56/nuke_empty_communities_from_db.sql +++ b/synapse/storage/data_stores/main/schema/delta/56/nuke_empty_communities_from_db.sql @@ -1,4 +1,4 @@ -/* Copyright 2019 Matrix.org Foundation CIC +/* Copyright 2019 Werner Sembach * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License.