Paginate beta history and refresh pages from events
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user