Files
electric-cherry/src/routes/api/betas/[id]/revisions/+server.ts
T
2026-10-09 16:52:37 -04:00

46 lines
2.0 KiB
TypeScript

import { artifactFormBody, BETA_REVISION_FORM_LIMIT } from '$lib/server/request-body.js';
import { isHttpError, json } from '@sveltejs/kit';
import { BetaError, reviseBeta, type BetaRevisionUpload } from '$lib/server/fleet/beta.js';
import { ScriptError } from '$lib/server/fleet/scripts.js';
import { kick } from '$lib/server/pipeline/worker.js';
export async function POST({ params, request }: { params: { id: string }; request: Request }) {
const id = Number(params.id);
if (!Number.isSafeInteger(id) || id < 1)
return json({ ok: false, error: 'Invalid beta ID' }, { status: 400 });
try {
const form = await artifactFormBody(request, BETA_REVISION_FORM_LIMIT);
const expectedRevision = Number(form.get('expectedRevision'));
if (!Number.isSafeInteger(expectedRevision) || expectedRevision < 1)
throw new Error('A reviewed revision is required.');
const uploads: BetaRevisionUpload[] = [];
for (const [key, value] of form) {
if (!key.startsWith('file:')) continue;
const scriptId = Number(key.slice(5));
if (!Number.isSafeInteger(scriptId) || scriptId < 1 || !(value instanceof File))
throw new Error('Invalid replacement file.');
uploads.push({
scriptId,
content: Buffer.from(await value.arrayBuffer()),
releaseVersion: form.has(`release:${scriptId}`)
? String(form.get(`release:${scriptId}`))
: undefined
});
}
const result = await reviseBeta(
id,
expectedRevision,
uploads,
String(form.get('notes') ?? '')
);
void kick();
return json({ ok: true, result });
} catch (error) {
if (isHttpError(error)) throw error;
return json(
{ ok: false, error: (error as Error).message },
{ status: error instanceof BetaError || error instanceof ScriptError ? 409 : 400 }
);
}
}