173 lines · 6.6 KB
import { createServerFn } from "@tanstack/react-start";
import { z } from "zod";
import { requireViewer, viewerMiddleware } from "./middleware";
import { first } from "~/server/db";
import { badRequest, notFoundError } from "~/server/errors";
import { limitWrite } from "~/server/limits";
import { assertNotArchived, requireRepoAccess } from "~/server/repos";
import { branchSha, listRefs } from "~/server/git/refs";
import { pagesDomain, siteUrl } from "~/server/pages/config";
import { customDomainsEnabled } from "~/server/pages/domains";
import { createDeployment, loadSite, removePreview, rollbackTo } from "~/server/pages/deploy";
import { disableSite, listDeployments, refreshDomain, saveSite, setDomain } from "~/server/pages/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);
  const site = await loadSite(repo.id);
  return { repo, site };
}

export const getPages = createServerFn({ method: "GET" })
  .middleware([viewerMiddleware])
  .validator(repoRef)
  .handler(async ({ data, context }) => {
    const { repo, site } = await adminSite(data.owner, data.repo, context.viewer);
    const refs = await listRefs(repo);
    return {
      enabled: pagesDomain() !== null,
      public: repo.visibility === "public",
      customDomainsEnabled: customDomainsEnabled(),
      defaultBranch: repo.default_branch,
      branches: refs.branches.slice(0, 200).map((branch) => branch.name),
      url: siteUrl(repo.owner_name, repo.name, null),
      site: site
        ? {
            source: site.source,