30 lines · 1.2 KB
import { createServerFn } from "@tanstack/react-start";
import { viewerMiddleware } from "./middleware";
import { limitBrowse } from "~/server/limits";
import { requireRepoAccess } from "~/server/repos";
import { loadIssueTemplates } from "~/server/issue-templates";
import { renderMarkdown } from "~/server/markdown";
import { repoRef } from "~/lib/validation";

export const listIssueTemplates = createServerFn({ method: "GET" })
  .middleware([viewerMiddleware])
  .validator(repoRef)
  .handler(async ({ data, context }) => {
    await limitBrowse(context.viewer);
    const { repo } = await requireRepoAccess(data.owner, data.repo, context.viewer, "read");
    const { templates, config } = await loadIssueTemplates(repo);
    const mdContext = { owner: repo.owner_name, repo: repo.name, ref: repo.default_branch, basePath: "" };
    return {
      config,
      templates: templates.map((template) => ({
        ...template,
        markdownHtml:
          template.kind === "form"
            ? template.fields.flatMap((field) =>
                field.type === "markdown" ? [renderMarkdown(field.attributes.value, mdContext)] : [],
              )
            : [],
      })),
    };
  });