220 lines · 8.1 KB
import { createServerFn } from "@tanstack/react-start";
import { z } from "zod";
import { requireViewer, viewerMiddleware } from "./middleware";
import { badRequest } from "~/server/errors";
import { limitWrite } from "~/server/limits";
import { assertNotArchived, requireRepoAccess } from "~/server/repos";
import { listRefs } from "~/server/git/refs";
import { customDomainsEnabled, customDomainsTarget } from "~/server/sites/domains";
import { labelUrl, sitesDomain } from "~/server/sites/config";
import { listSiteDeployments, loadSiteForRepo, rollbackSite } from "~/server/sites/deploy";
import { deploySiteRef } from "~/server/sites/api";
import { siteUsageToday } from "~/server/sites/usage";
import { siteLabel } from "~/server/sites/naming";
import {
  deleteEnv,
  disableSite,
  listEnv,
  refreshSiteDomain,
  saveAccess,
  saveSite,
  setEnv,
  setSiteDomain,
} from "~/server/sites/site";
import { repoRef } from "~/lib/validation";
import type { Viewer } from "~/lib/types";

const refName = z.string().min(1).max(255);

async function adminSite(owner: string, name: string, viewer: Viewer | null, write = false) {
  const { repo } = await requireRepoAccess(owner, name, requireViewer(viewer), "admin");
  if (write) assertNotArchived(repo);
  return { repo, site: await loadSiteForRepo(repo.id) };
}

async function requireSite(owner: string, name: string, viewer: Viewer | null, write = true) {
  const { repo, site } = await adminSite(owner, name, viewer, write);
  if (!site) throw badRequest("Enable the site first");
  await limitWrite(requireViewer(viewer));
  return { repo, site };
}