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";
import { listAdminAudit, recordAdminAction } from "~/server/admin-audit";
import { resolveAbuseTarget } from "~/server/abuse-targets";
import { setModerationHidden } from "~/server/moderation";
import { badRequest } from "~/server/errors";
import { approveWaitlistEntry, listWaitlist, MAX_SIGNUP_CAP, setSignupCap, waitlistSummary } from "~/server/waitlist";
import { listSiteAdmins, setSiteAdmin } from "~/server/site-admins";
export const getAdminOverview = createServerFn({ method: "GET" })
.middleware([viewerMiddleware])
.handler(async ({ context }) => {
requireSiteAdmin(requireViewer(context.viewer));
const [overview, suspensions, ceilingHit, disabledAccounts, waitlist] = await Promise.all([
adminOverview(),
listHostingSuspensions(),
globalCeilingHit(),
listDisabledAccounts(),
waitlistSummary(),
]);
const siteAdmins = await listSiteAdmins();
return { ...overview, hosting: { suspensions, ceilingHit }, disabledAccounts, waitlist, siteAdmins };
});
/** Caps user accounts (null lifts the cap); any newly free seats go to the waitlist in order. */
export const adminSetSignupCap = createServerFn({ method: "POST" })
.middleware([viewerMiddleware])
.validator(z.object({ cap: z.number().int().min(1).max(MAX_SIGNUP_CAP).nullable() }))
.handler(async ({ data, context }) => {
const viewer = requireViewer(context.viewer);
requireSiteAdmin(viewer);
await limitWrite(viewer);