48 lines · 2.1 KB
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])