46 lines
2.0 KiB
TypeScript
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 }
|
|
);
|
|
}
|
|
}
|