104 lines · 4.2 KB
import { createServerFn } from "@tanstack/react-start";
import { z } from "zod";
import { requireViewer, viewerMiddleware } from "./middleware";
import { repoDb } from "~/server/scoped-db";
import { randomId } from "~/server/crypto";
import { limitWrite } from "~/server/limits";
import { convertIssue, repoCategories, requireDiscussionAccess } from "~/server/discussions";
import { loadIssue, setIssueState } from "~/server/issues";
import { assertCount, PLANNING_CAPS } from "~/server/planning";
import { badRequest, notFoundError } from "~/server/errors";
import { repoRef } from "~/lib/validation";

const issueRef = repoRef.extend({ number: z.number().int().positive() });

export const saveDiscussionCategory = createServerFn({ method: "POST" })
  .middleware([viewerMiddleware])
  .validator(
    repoRef.extend({
      id: z.string().max(64).nullable(),
      name: z.string().trim().min(1).max(40),
      emoji: z.string().max(8),
      description: z.string().max(200),
      answerable: z.boolean(),
    }),
  )
  .handler(async ({ data, context }) => {
    const viewer = requireViewer(context.viewer);
    await limitWrite(viewer);
    const { repo } = await requireDiscussionAccess(data, viewer, "write", true);
    if (data.id) {
      await repoDb(repo.id).run(
        "UPDATE discussion_categories SET name = ?, emoji = ?, description = ?, answerable = ? WHERE id = ? AND repo_id = ?",
        data.name,
        data.emoji,
        data.description,
        data.answerable ? 1 : 0,
        data.id,
        repo.id,
      );
      return { ok: true };