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

grain.social/grain

photography-focused photo sharing platform

grain.social
1 collaborator
0
2
29 lines · 1.2 KB Raw History
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<Gallery>("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 });
});