Complete provisioning job detail pages and lifecycle evidence

This commit is contained in:
2026-09-28 14:17:19 -04:00
parent 5b65520bbc
commit 3fb59cd598
41 changed files with 2866 additions and 346 deletions
@@ -0,0 +1,24 @@
import { json, error } from '@sveltejs/kit';
import { db } from '$lib/server/db/index.js';
import { deploymentActivity } from '$lib/server/provisioning/index.js';
function integer(params: URLSearchParams, key: string): number | undefined {
const raw = params.get(key);
if (raw === null) return undefined;
if (!/^\d+$/.test(raw)) error(400, `${key} must be a nonnegative integer.`);
const value = Number(raw);
if (!Number.isSafeInteger(value)) error(400, `${key} must be a nonnegative integer.`);
return value;
}
export function GET({ params, url }: { params: { id: string }; url: URL }) {
if (!db().prepare('SELECT 1 FROM server_deployments WHERE id = ?').get(params.id)) error(404, 'Provisioning operation not found.');
const order = url.searchParams.get('order') ?? 'newest';
if (order !== 'newest' && order !== 'oldest') error(400, 'Choose newest or oldest activity order.');
const query = url.searchParams.get('query') ?? '';
if (query.length > 500) error(400, 'Activity search must be 500 characters or fewer.');
const limit = integer(url.searchParams, 'limit');
if (limit === 0) error(400, 'Activity limit must be at least 1.');
return json(deploymentActivity(params.id, { order, query, limit,
cursor: integer(url.searchParams, 'cursor'), watermark: integer(url.searchParams, 'watermark') }));
}