import { json } from '@sveltejs/kit'; import { db } from '$lib/server/db/index.js'; import { getBeta, listBetaServers, listBetaScripts } from '$lib/server/fleet/beta.js'; import { getScript, getVersion } from '$lib/server/fleet/scripts.js'; import { testView } from '$lib/server/fleet/beta-tests.js'; function parseId(raw: string): number | null { const n = Number.parseInt(raw, 10); return Number.isFinite(n) ? n : null; } export async function GET({ params }: { params: { id: string } }) { const id = parseId(params.id); if (id === null) return json({ ok: false, error: 'bad id' }, { status: 400 }); const beta = getBeta(id); if (!beta) return json({ ok: false, error: 'not found' }, { status: 404 }); const scripts = listBetaScripts(id).map((bs) => { const script = getScript(bs.script_id); const version = getVersion(bs.script_version_id); return { id: bs.script_id, name: script?.name ?? '(deleted)', target_rel_path: script?.target_rel_path ?? '', kind: script?.kind ?? bs.kind ?? 'script', version: version ? { id: version.id, version: version.version, release_version: version.release_version, sha256: version.sha256 } : null }; }); const servers = listBetaServers(id); const events = db().prepare('SELECT id, created_at, message FROM beta_events WHERE beta_id = ? ORDER BY id').all(id); const rollout = db().prepare("SELECT id FROM deployments WHERE beta_id = ? AND action = 'promote' ORDER BY started_at DESC LIMIT 1").get(id) as { id: string } | undefined; const promotion = rollout ? { ...rollout, pending: (db().prepare("SELECT COUNT(*) n FROM deployment_servers WHERE deployment_id = ? AND restart_state NOT IN ('done','failed','cancelled')").get(rollout.id) as { n: number }).n, failed: (db().prepare("SELECT COUNT(*) n FROM deployment_servers WHERE deployment_id = ? AND restart_state = 'failed'").get(rollout.id) as { n: number }).n } : null; return json({ beta, scripts, servers, events, test: testView(id), promotion }); }