import { defineQuery } from "$hatk"; import { hydrateGroups } from "../hydrate/groups.ts"; import { groupsOf } from "../helpers/membership.ts"; export default defineQuery("social.grain.unspecced.listGroups", async (ctx) => { const { params, ok, db } = ctx; const limit = params.limit ?? 50; // Every declared group, the ones whose pool moved most recently first; // a group with an empty pool still lists, or nobody could ever submit to it. const rows = (await db.query( `SELECT d.did FROM "fyi.opensocial.declaration" d LEFT JOIN _repos r ON r.did = d.did LEFT JOIN (SELECT did, MAX(created_at) AS last FROM "social.grain.group.item" GROUP BY did) p ON p.did = d.did WHERE (r.status IS NULL OR r.status NOT IN ('takendown', 'deactivated', 'deleted')) ORDER BY p.last DESC NULLS LAST, d.created_at DESC LIMIT $1`, [limit], )) as { did: string }[]; const mine = ctx.viewer ? await groupsOf(db, ctx, ctx.viewer.did).catch(() => []) : []; const groups = await hydrateGroups( ctx, rows.map((r) => r.did), { gallery: params.gallery, mine }, ); return ok({ groups }); });