48 lines · 1.8 KB
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" })