import { createServerFn } from "@tanstack/react-start"; import { z } from "zod"; import { requireViewer, viewerMiddleware } from "./middleware"; import { limitWrite } from "~/server/limits"; import { repoRef } from "~/lib/validation"; import { accountContainers, repoContainers, requireContainerAccount, stopAccountContainer, stopRepoContainer, } from "~/server/editor/container-admin"; const org = z.string().min(1).max(100).nullable(); const sessionId = z.string().min(1).max(64); export const listAccountContainers = createServerFn({ method: "GET" }) .middleware([viewerMiddleware]) .validator(z.object({ org })) .handler(async ({ data, context }) => { const account = await requireContainerAccount(requireViewer(context.viewer), data.org); return { account: account.name, ...(await accountContainers(account.id)) }; }); export const stopAccountContainerFn = createServerFn({ method: "POST" }) .middleware([viewerMiddleware]) .validator(z.object({ org, sessionId })) .handler(async ({ data, context }) => { const viewer = requireViewer(context.viewer); await limitWrite(viewer); const account = await requireContainerAccount(viewer, data.org); return { seconds: await stopAccountContainer(account.id, data.sessionId) }; }); export const listRepoContainers = createServerFn({ method: "GET" }) .middleware([viewerMiddleware]) .validator(repoRef) .handler(({ data, context }) => repoContainers(data.owner, data.repo, context.viewer)); export const stopRepoContainerFn = createServerFn({ method: "POST" }) .middleware([viewerMiddleware]) .validator(repoRef.extend({ sessionId })) .handler(async ({ data, context }) => { const viewer = requireViewer(context.viewer); await limitWrite(viewer); return { seconds: await stopRepoContainer(data.owner, data.repo, viewer, data.sessionId) }; });