71 lines · 3.0 KB
import { createServerFn } from "@tanstack/react-start";
import { z } from "zod";
import { requireViewer, viewerMiddleware } from "./middleware";
import { adminOverview } from "~/server/admin-overview";
import { requireSiteAdmin } from "~/server/metering/access";
import { limitWrite } from "~/server/limits";
import { globalCeilingHit } from "~/server/sites/caps";
import { listHostingSuspensions, resumeHosting, suspendHosting } from "~/server/sites/suspend";
import { listDisabledAccounts } from "~/server/account-disable";
import { adminDisableAccount, enableAccount } from "~/server/account-disable-actions";

export const getAdminOverview = createServerFn({ method: "GET" })
  .middleware([viewerMiddleware])
  .handler(async ({ context }) => {
    requireSiteAdmin(requireViewer(context.viewer));
    const [overview, suspensions, ceilingHit, disabledAccounts] = await Promise.all([
      adminOverview(),
      listHostingSuspensions(),
      globalCeilingHit(),
      listDisabledAccounts(),
    ]);
    return { ...overview, hosting: { suspensions, ceilingHit }, disabledAccounts };
  });

/** Operator kill switch for one account's Sites and Pages. */
export const adminSuspendHosting = createServerFn({ method: "POST" })
  .middleware([viewerMiddleware])
  .validator(z.object({ name: z.string().min(1).max(100) }))
  .handler(async ({ data, context }) => {
    const viewer = requireViewer(context.viewer);
    requireSiteAdmin(viewer);
    await limitWrite(viewer);
    await suspendHosting(data.name);
    return { ok: true };
  });

export const adminResumeHosting = createServerFn({ method: "POST" })
  .middleware([viewerMiddleware])
  .validator(z.object({ accountId: z.string().min(1).max(100) }))
  .handler(async ({ data, context }) => {