import getTokenHelper from "../../../utils/getTokenHelper" import refreshTokenHelper from "../../../utils/refreshTokenHelper" import errorHandlingHelper from "../../../utils/errorHandlingHelper" import { resolveMerchantPartner, resolveOwnUserId } from "../../../utils/merchantPartner" import { EMAIL_FIELDS } from "../../../utils/emailVerification" import { cancelActivePending } from "../../../utils/emailVerifyDb" /** * Cancels an outstanding (unconfirmed) e-mail change — body { fieldKey }. * The target is resolved from the caller's own identity, so a merchant can * only ever cancel pending changes on their own ad_user row / their own * company's c_bpartner row. */ const handleFunc = async (event: any, authToken: string | null = null) => { const config = useRuntimeConfig() const serviceToken = (config.api as any)?.idempieretoken const token = serviceToken || authToken || await getTokenHelper(event) const body = await readBody(event) const fieldKey = String(body?.fieldKey || '') const def = EMAIL_FIELDS[fieldKey] if (!def) return { status: 400, message: 'Unknown e-mail field' } const userId = resolveOwnUserId(event) if (!userId) return { status: 401, message: 'No user session' } let targetId: number if (def.kind === 'aduser') { targetId = userId } else { const partner = await resolveMerchantPartner(event, token) if (!partner) return { status: 404, message: 'No business partner is linked to this account' } targetId = partner.id } cancelActivePending(def.kind, targetId, fieldKey) return { status: 200 } } export default defineEventHandler(async (event) => { let data: any = {} try { data = await handleFunc(event) } catch (err: any) { try { const authToken: any = await refreshTokenHelper(event) data = await handleFunc(event, authToken) } catch (error: any) { data = errorHandlingHelper(err?.data ?? err, error?.data ?? error) } } return data })