import { createContext, DomainError } from "@tailor-platform/erp-kit/app"; import { createResolver, t } from "@tailor-platform/sdk"; import { getDB } from "@/generated/kysely-tailordb"; import { umModules } from "@/modules"; export default createResolver({ name: "deactivateUser", operation: "mutation", input: { userId: t.string().description("ID of the user to deactivate"), }, body: async (context) => { const ctx = createContext(context); if (context.input.userId === context.caller?.id) { throw new DomainError("Cannot deactivate your own account"); } const db = getDB("main-db"); const result = await db .transaction() .execute(async (trx) => { const cmdResult = await umModules.commands.deactivateUser( trx, { userId: context.input.userId }, ctx, ); if (!cmdResult.ok) { switch (cmdResult.error.code) { case "USER_MANAGEMENT_USER_NOT_FOUND": throw new DomainError(`User ${context.input.userId} does not exist`); case "USER_MANAGEMENT_INVALID_STATUS_TRANSITION": throw new DomainError("User is not in ACTIVE status"); case "UNAUTHENTICATED": throw new DomainError("Authentication is required"); case "INSUFFICIENT_PERMISSION": throw new DomainError("You do not have permission to perform this action"); default: throw cmdResult.error satisfies never; } } return { id: cmdResult.value.user.id, status: cmdResult.value.user.status, }; }) .catch((err: unknown) => { if (err instanceof DomainError) throw err; throw new Error("Failed to deactivate the user", { cause: err }); }); return result; }, output: t .object({ id: t.string().description("User ID"), status: t.string().description("Updated status"), }) .description("Deactivated user"), });