import { createServerFn } from "@tanstack/react-start"; import { z } from "zod"; import { requireViewer, viewerMiddleware } from "./middleware"; import { limitAccountWrite } from "~/server/limits"; import { addSigningKey, deleteSigningKey, listSigningKeys } from "~/server/security/signatures"; export const getSigningKeys = createServerFn({ method: "GET" }) .middleware([viewerMiddleware]) .handler(async ({ context }) => listSigningKeys(requireViewer(context.viewer).id)); export const createSigningKey = createServerFn({ method: "POST" }) .middleware([viewerMiddleware]) .validator( z.object({ kind: z.enum(["ssh", "gpg"]), title: z.string().trim().min(1, "Title is required").max(100), publicKey: z .string() .trim() .min(1, "Paste a public key") .max(64 * 1024), }), ) .handler(async ({ data, context }) => { const viewer = requireViewer(context.viewer); await limitAccountWrite(viewer); return addSigningKey(viewer.id, data.kind, data.title, data.publicKey); }); export const removeSigningKey = createServerFn({ method: "POST" }) .middleware([viewerMiddleware]) .validator(z.object({ id: z.string().min(1).max(64) })) .handler(async ({ data, context }) => { const viewer = requireViewer(context.viewer); await limitAccountWrite(viewer); await deleteSigningKey(viewer.id, data.id); return { ok: true }; });