137 lines · 6.1 KB
import { createServerFn } from "@tanstack/react-start";
import { limitWrite } from "~/server/limits";
import { z } from "zod";
import { requireViewer, viewerMiddleware } from "./middleware";
import { all, placeholders } from "~/server/db";
import { repoDb, stmt } from "~/server/scoped-db";
import { deleteLabel as deleteRepoLabel, listRepoLabels, saveLabel as saveRepoLabel } from "~/server/label-write";
import { requireRepoAccess, requireRepoMutation } from "~/server/repos";
import { assertAssignable } from "~/server/assignable";
import { canListOrgMembers } from "~/server/accounts";
import { loadIssue, applyLabels, issueUrl } from "~/server/issues";
import { addIssueEvent } from "~/server/pulls";
import { emitNotification } from "~/server/events/emit";
import { notFoundError } from "~/server/errors";
import { labelColor, repoRef } from "~/lib/validation";
import type { LabelInfo } from "./issues";
import { issuesChanged } from "~/server/repo-state";

export const setIssueLabels = createServerFn({ method: "POST" })
  .middleware([viewerMiddleware])
  .validator(repoRef.extend({ number: z.number().int(), labels: z.array(z.string()).max(50) }))
  .handler(async ({ data, context }) => {
    const viewer = requireViewer(context.viewer);
    await limitWrite(viewer);
    const access = await requireRepoMutation(data.owner, data.repo, viewer, "write");
    const issue = await loadIssue(access.repo.id, data.number);
    if (!issue) throw notFoundError("Issue not found");
    await applyLabels(access.repo.id, issue.id, data.labels);
    await addIssueEvent(issue, viewer.id, "labeled", { labels: data.labels });
    return { ok: true };
  });

export const setIssueAssignees = createServerFn({ method: "POST" })
  .middleware([viewerMiddleware])
  .validator(repoRef.extend({ number: z.number().int(), usernames: z.array(z.string()).max(10) }))
  .handler(async ({ data, context }) => {
    const viewer = requireViewer(context.viewer);
    await limitWrite(viewer);
    const access = await requireRepoMutation(data.owner, data.repo, viewer, "write");
    const issue = await loadIssue(access.repo.id, data.number);