/** * Preview Router — start, stop, list, status for Docker-based preview deployments */ import { z } from 'zod'; import type { ProcedureBuilder } from '../trpc.js'; import { requirePreviewManager } from './_helpers.js'; export function previewProcedures(publicProcedure: ProcedureBuilder) { return { startPreview: publicProcedure .input(z.object({ initiativeId: z.string().min(1), phaseId: z.string().min(1).optional(), projectId: z.string().min(1), branch: z.string().min(1), })) .mutation(async ({ ctx, input }) => { const previewManager = requirePreviewManager(ctx); return previewManager.start(input); }), stopPreview: publicProcedure .input(z.object({ previewId: z.string().min(1), })) .mutation(async ({ ctx, input }) => { const previewManager = requirePreviewManager(ctx); await previewManager.stop(input.previewId); return { success: true }; }), listPreviews: publicProcedure .input(z.object({ initiativeId: z.string().min(1).optional(), }).optional()) .query(async ({ ctx, input }) => { const previewManager = requirePreviewManager(ctx); return previewManager.list(input?.initiativeId); }), getPreviewStatus: publicProcedure .input(z.object({ previewId: z.string().min(1), })) .query(async ({ ctx, input }) => { const previewManager = requirePreviewManager(ctx); return previewManager.getStatus(input.previewId); }), }; }