import { defineQuery, InvalidRequestError } from "$hatk"; import type { Gallery } from "$hatk"; import { hydrateGalleries } from "../hydrate/galleries.ts"; import { resolveAtUri } from "../helpers/resolveHandle.ts"; export default defineQuery("social.grain.unspecced.getGallery", async (ctx) => { const { ok, params, db, getRecords } = ctx; let { gallery: galleryUri } = params; // Resolve handle in AT URI if needed const resolved = await resolveAtUri(db, galleryUri); if (resolved) galleryUri = resolved; const recordsMap = await getRecords("social.grain.gallery", [galleryUri]); const galleryRow = recordsMap.get(galleryUri); if (!galleryRow) throw new InvalidRequestError("Gallery not found"); // Taken-down, deactivated and deleted accounts are hidden from everyone, // matching every feed — a direct deep link must not bypass that. const [repos] = (await db.query( `SELECT 1 FROM _repos WHERE did = $1 AND status IN ('takendown', 'deactivated', 'deleted') LIMIT 1`, [galleryRow.did], )) as unknown[]; if (repos) throw new InvalidRequestError("Gallery not found"); const [galleryView] = await hydrateGalleries(ctx, [galleryRow]); return ok({ gallery: galleryView }); });