~ knotless Search/
↑↓ move↵ open⇧↵ all results

grain.social/grain

photography-focused photo sharing platform

grain.social
1 collaborator
0
2
26 lines · 1.1 KB Raw History
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 });
});