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);