Paginate beta history and refresh pages from events

This commit is contained in:
2026-10-06 14:50:47 -04:00
parent daefb22be6
commit d99e5979fa
13 changed files with 239 additions and 35 deletions
+5 -9
View File
@@ -1,6 +1,5 @@
import { json } from '@sveltejs/kit';
import {
listBetas,
openBeta,
BetaError
} from '$lib/server/fleet/beta.js';
@@ -10,15 +9,12 @@ import type { BetaServerRow } from '$lib/server/fleet/beta.js';
import type { StoredPlan } from '$lib/server/fleet/beta-tests.js';
import { kick } from '$lib/server/pipeline/worker.js';
import { parseBetaPlan, type BetaPlan } from '$lib/beta-plan.js';
import { betaListPage } from '$lib/server/fleet/beta-pages.js';
export async function GET({ url }: { url: URL }) {
const stateFilter = url.searchParams.get('state') as
| 'running'
| 'ready-promote'
| 'promoted'
| 'rolled-back'
| null;
const betas = listBetas(stateFilter ?? undefined);
const state = url.searchParams.get('state');
if (state && !['running','ready-promote','promoted','rolled-back'].includes(state)) return json({ error: 'Invalid beta state.' }, { status: 400 });
const { betas, ...pagination } = betaListPage(url.searchParams);
const ids = JSON.stringify(betas.map(beta => beta.id));
const bundles = betaScriptMetadata(betas.map(beta => beta.id));
const plans = new Map((db().prepare(`SELECT p.*, COALESCE((SELECT started_at FROM beta_revisions r
@@ -39,7 +35,7 @@ export async function GET({ url }: { url: URL }) {
servers: members.filter(member => member.beta_id === b.id)
};
});
return json({ betas: rows });
return json({ betas: rows, ...pagination });
}
// POST body accepts either:
+3 -2
View File
@@ -4,6 +4,7 @@ import { getBeta, listBetaServers } from '$lib/server/fleet/beta.js';
import { betaScriptMetadata } from '$lib/server/fleet/library-metadata.js';
import { testView } from '$lib/server/fleet/beta-tests.js';
import { betaRevisionHistory, currentBetaRevision } from '$lib/server/fleet/beta-revisions.js';
import { betaActivityPage } from '$lib/server/fleet/beta-pages.js';
function parseId(raw: string): number | null {
const n = Number.parseInt(raw, 10);
@@ -19,13 +20,13 @@ export async function GET({ params }: { params: { id: string } }) {
const scripts = betaScriptMetadata([id]).get(id) ?? [];
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 { events, nextBefore: eventsNextBefore } = betaActivityPage(id);
const campaign = 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 = campaign ? { ...campaign,
pending: (db().prepare("SELECT COUNT(*) n FROM deployment_servers WHERE deployment_id = ? AND server_deleted_at IS NULL AND restart_state NOT IN ('done','failed','cancelled','skipped')").get(campaign.id) as { n: number }).n,
failed: (db().prepare("SELECT COUNT(*) n FROM deployment_servers WHERE deployment_id = ? AND server_deleted_at IS NULL AND restart_state = 'failed'").get(campaign.id) as { n: number }).n } : null;
const rollback = db().prepare("SELECT id FROM deployments WHERE beta_id = ? AND action = 'rollback' ORDER BY started_at DESC LIMIT 1")
.get(id) as { id: string } | undefined;
return json({ beta, scripts, servers, events, test: testView(id), promotion, rollback: rollback ?? null,
return json({ beta, scripts, servers, events, eventsNextBefore, test: testView(id), promotion, rollback: rollback ?? null,
revision: currentBetaRevision(id), revisions: betaRevisionHistory(id) });
}
@@ -0,0 +1,10 @@
import { json } from '@sveltejs/kit';
import { getBeta } from '$lib/server/fleet/beta.js';
import { betaActivityPage } from '$lib/server/fleet/beta-pages.js';
export function GET({ params, url }: { params: { id: string }; url: URL }) {
const id = Number(params.id);
if (!Number.isSafeInteger(id) || id < 1) return json({ error: 'Invalid beta ID.' }, { status: 400 });
if (!getBeta(id)) return json({ error: 'Beta not found.' }, { status: 404 });
return json(betaActivityPage(id, url.searchParams));
}
+1 -1
View File
@@ -21,7 +21,7 @@ export async function GET() {
event.type === 'server-state' ||
event.type === 'deployment-opened' ||
event.type === 'server-changed' ||
event.type === 'sweep-tick' || event.type === 'fleet-invalidated'
event.type === 'sweep-tick' || event.type === 'fleet-invalidated' || event.type === 'beta-changed'
) {
send(controller, event);
}