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 }) => { const viewer = requireViewer(context.viewer); requireSiteAdmin(viewer); await limitWrite(viewer); await resumeHosting(data.accountId); return { ok: true }; }); /** Disables an account: sign-in and every credential stop working, billing and hosting stop, repos go read-only. */ export const adminDisable = createServerFn({ method: "POST" }) .middleware([viewerMiddleware]) .validator(z.object({ name: z.string().min(1).max(100), note: z.string().max(500).nullable() })) .handler(async ({ data, context }) => { const viewer = requireViewer(context.viewer); requireSiteAdmin(viewer); await limitWrite(viewer); await adminDisableAccount(data.name, data.note?.trim() || null, viewer.id); return { ok: true }; }); /** Re-enables an account and resumes hosting; cancelled subscriptions are not re-created. */ export const adminEnable = createServerFn({ method: "POST" }) .middleware([viewerMiddleware]) .validator(z.object({ accountId: z.string().min(1).max(100) })) .handler(async ({ data, context }) => { const viewer = requireViewer(context.viewer); requireSiteAdmin(viewer); await limitWrite(viewer); await enableAccount(data.accountId, `admin:${viewer.id}`); return { ok: true }; });