import { json } from '@sveltejs/kit'; import type { RequestHandler } from './$types'; import { apiBody, apiFailure, pageInput } from '#lib/server/api-http.js'; import { createPiece, getPiece, listPieces, savePiece, type PieceStatus } from '#lib/server/content.js'; import { auditTechnical, authenticateTechnical, idempotentResponse } from '#lib/server/technical-access.js'; export const GET: RequestHandler = ({ request, url }) => { try { authenticateTechnical(request); const { limit, offset } = pageInput(url); const status = url.searchParams.get('status') as PieceStatus | null; const statuses = status ? [status] : (['inbox', 'preparing', 'ready'] as PieceStatus[]); const all = listPieces({ statuses, query: url.searchParams.get('q') ?? '' }); return json({ data: all.slice(offset, offset + limit), pagination: { limit, offset, total: all.length } }); } catch (cause) { return apiFailure(cause); } }; export const POST: RequestHandler = async ({ request }) => { try { const actor = authenticateTechnical(request, true); const body = await apiBody(request); const result = idempotentResponse(actor, request, body, () => { const id = createPiece('blank'); const piece = getPiece(id)!; savePiece(id, piece.revision, { ...piece, title: String(body.title ?? ''), summary: String(body.summary ?? ''), status: ['inbox', 'preparing', 'ready'].includes(String(body.status)) ? (body.status as 'inbox' | 'preparing' | 'ready') : 'preparing', durationSeconds: Number(body.durationSeconds ?? 0), sources: Array.isArray(body.sources) ? body.sources.map((source) => ({ label: String((source as Record).label ?? ''), url: String((source as Record).url ?? ''), timecodeSeconds: (source as Record).timecodeSeconds == null ? null : Number((source as Record).timecodeSeconds) })) : [] }); auditTechnical(actor, 'piece.create', 'piece', id); return { status: 201, body: { data: getPiece(id) } }; }); return json(result.body, { status: result.status, headers: { 'Idempotency-Replayed': result.duplicate ? 'true' : 'false' } }); } catch (cause) { return apiFailure(cause); } };