70 lines
2.2 KiB
TypeScript
70 lines
2.2 KiB
TypeScript
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<string, unknown>).label ?? ''),
|
|
url: String((source as Record<string, unknown>).url ?? ''),
|
|
timecodeSeconds:
|
|
(source as Record<string, unknown>).timecodeSeconds == null
|
|
? null
|
|
: Number((source as Record<string, unknown>).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);
|
|
}
|
|
};
|