aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/src/meshbay_hub/tasks
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/tasks')
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/tasks/cleanup.py17
1 files changed, 9 insertions, 8 deletions
diff --git a/packages/meshbay-hub/src/meshbay_hub/tasks/cleanup.py b/packages/meshbay-hub/src/meshbay_hub/tasks/cleanup.py
index 6fa62a4..7f8a5f2 100644
--- a/packages/meshbay-hub/src/meshbay_hub/tasks/cleanup.py
+++ b/packages/meshbay-hub/src/meshbay_hub/tasks/cleanup.py
@@ -7,7 +7,7 @@ from datetime import datetime, timedelta, timezone
from sqlalchemy import delete, select
from sqlalchemy.ext.asyncio import AsyncSession
-from meshbay_hub.db.models import EmailVerification, Group, GroupMember, IPLog, User
+from meshbay_hub.db.models import EmailVerification, Group, IPLog, User
log = logging.getLogger(__name__)
@@ -90,18 +90,19 @@ async def prune_unhosted_groups(db: AsyncSession, grace_days: int = UNHOSTED_GRA
dry_run: bool = False) -> list[tuple[str, str]]:
"""Delete abandoned groups. Returns [(id, name)] of what was (or would be) removed.
- Memberships go with the group — there is no cascade configured, and leaving
- orphan rows behind would keep the group in everyone's /mine query through the
- join. Nothing on a node is touched: the hub does not command those machines,
- and by definition no node ever claimed this group anyway.
+ Everything on the hub that points at the group goes with it (`purge_groups`):
+ there is no cascade configured, an orphan membership would keep the group in
+ everyone's /mine query through the join, and on PostgreSQL any remaining
+ reference refuses the deletion outright. Nothing on a node is touched: the
+ hub does not command those machines, and by definition no node ever claimed
+ this group anyway.
"""
doomed = await find_unhosted_groups(db, grace_days)
if not doomed or dry_run:
return [(g.id, g.name) for g in doomed]
- ids = [g.id for g in doomed]
- await db.execute(delete(GroupMember).where(GroupMember.group_id.in_(ids)))
- await db.execute(delete(Group).where(Group.id.in_(ids)))
+ from meshbay_hub.db.purge import purge_groups
+ await purge_groups(db, [g.id for g in doomed])
await db.commit()
log.info("Pruned %d group(s) that no node ever hosted", len(doomed))
return [(g.id, g.name) for g in doomed]