294 lines · 11.7 KB
import { createServerFn } from "@tanstack/react-start";
import { z } from "zod";
import { requireViewer, viewerMiddleware } from "./middleware";
import { all, first } from "~/server/db";
import { accountDb, repoDb } from "~/server/scoped-db";
import { randomId } from "~/server/crypto";
import { assertNotArchived, requireRepoAccess } from "~/server/repos";
import { accountsById } from "~/server/people";
import { assertBelowCap, CAPS, limitWrite } from "~/server/limits";
import { badRequest, notFoundError } from "~/server/errors";
import {
  deleteConfigValue,
  listSecretNames,
  listVariables,
  ownerRepoIds,
  requireOwnerAdmin,
  upsertSecret,
  upsertVariable,
} from "~/server/ci/config-admin";
import type { ConfigScope } from "~/server/ci/config-admin";
import type { EnvironmentRow } from "~/server/ci/deployments";
import { repoRef, secretName } from "~/lib/validation";

const MAX_VALUE_BYTES = 48 * 1024;
const MAX_WAIT_MINUTES = 43_200;
const MAX_REVIEWERS = 6;
const MAX_BRANCH_PATTERNS = 20;

const configValue = z.object({
  kind: z.enum(["secret", "variable"]),
  name: secretName,
  value: z.string().min(1).max(MAX_VALUE_BYTES),
});
const environmentName = z
  .string()
  .trim()
  .regex(/^[A-Za-z0-9 ._-]{1,100}$/, "Use letters, numbers, spaces, '.', '-' and '_'");

function stringList(raw: string): string[] {
  const value: unknown = JSON.parse(raw);