import { z } from "zod"; import { apiJson, withApiHandler } from "@/lib/api-handler"; import { createShareLinkForScope, listShareLinksForScope, listShareableEntityTypes, } from "@/modules/_core/share-api"; const createShareLinkInput = z.object({ entityType: z.string().trim().min(1), entityId: z.string().uuid(), expiresAt: z.string().datetime().nullable().optional(), capabilities: z .object({ read: z.boolean().optional(), write: z.boolean().optional(), }) .optional(), }); export async function GET(request: Request) { return withApiHandler(request, async (scope, req) => { const url = new URL(req.url); const entityType = url.searchParams.get("entityType") ?? undefined; const entityId = url.searchParams.get("entityId") ?? undefined; if (url.searchParams.get("entityTypes") === "true") { return apiJson(listShareableEntityTypes()); } const links = await listShareLinksForScope(scope, { entityType, entityId }); return apiJson(links); }); } export async function POST(request: Request) { return withApiHandler(request, async (scope, req) => { const body: unknown = await req.json(); const parsed = createShareLinkInput.parse(body); const expiresAt = parsed.expiresAt ? new Date(parsed.expiresAt) : null; const result = await createShareLinkForScope(scope, parsed.entityType, parsed.entityId, { expiresAt, capabilities: parsed.capabilities, }); return apiJson( { url: result.url, expiresAt: result.expiresAt?.toISOString() ?? null, }, 201, ); }); }