import { createServerFn } from "@tanstack/react-start"; import { z } from "zod"; import { requireViewer, viewerMiddleware } from "./middleware"; import { limitAccountWrite } from "~/server/limits"; import { confirmPassword } from "~/server/account-security"; import { destroySession } from "~/server/auth"; import { deleteUserAccount, soleOwnedOrgs } from "~/server/account-delete"; import { currentExport, readAccountExport, requestAccountExport } from "~/server/account-export"; import { notFoundError } from "~/server/errors"; export const getAccountDataSettings = createServerFn({ method: "GET" }) .middleware([viewerMiddleware]) .handler(async ({ context }) => { const viewer = requireViewer(context.viewer); const [orgs, pendingExport] = await Promise.all([soleOwnedOrgs(viewer.id), currentExport(viewer.id)]); return { soleOwnedOrgs: orgs, pendingExport }; }); export const deleteAccount = createServerFn({ method: "POST" }) .middleware([viewerMiddleware]) .validator(z.object({ password: z.string().max(1024), confirm: z.string().max(100) })) .handler(async ({ data, context }) => { const viewer = requireViewer(context.viewer); await limitAccountWrite(viewer); await confirmPassword(viewer.id, data.password); const result = await deleteUserAccount({ viewer, confirm: data.confirm }); await destroySession(); return result; }); export const requestDataExport = createServerFn({ method: "POST" }) .middleware([viewerMiddleware]) .handler(async ({ context }) => { const viewer = requireViewer(context.viewer); await limitAccountWrite(viewer); return requestAccountExport(viewer); }); export const downloadDataExport = createServerFn({ method: "GET" }) .middleware([viewerMiddleware]) .validator(z.object({ id: z.string().min(1).max(64) })) .handler(async ({ data, context }) => { const viewer = requireViewer(context.viewer); const body = await readAccountExport(viewer, data.id); if (body === null) throw notFoundError("This export has expired; request a new one tomorrow"); return { filename: `${viewer.name}-gitfor-export.json`, body }; });