import getTokenHelper from "../../utils/getTokenHelper" import refreshTokenHelper from "../../utils/refreshTokenHelper" import errorHandlingHelper from "../../utils/errorHandlingHelper" import fetchHelper from "../../utils/fetchHelper" import { resolveMerchantPartner, pickMerchantFields, resolveOwnUserId } from "../../utils/merchantPartner" import { getActivePendingFor } from "../../utils/emailVerifyDb" /** * Merchant self-service read of the manageable e-mail addresses: * the whitelisted fields of the own company partner (C_BPartner) plus the * caller's own ad_user e-mail. Uses the iDempiere service token internally * (limited roles cannot read c_bpartner / ad_user) but returns ONLY the * whitelisted projection — never a raw record. * * Also returns `pending`: e-mail changes awaiting confirmation (the link * mailed to the new address has not been clicked yet), keyed by fieldKey. * The active value stays the old one until confirmation. */ 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 userId = resolveOwnUserId(event) if (!userId) { return { status: 401, message: 'No user session' } } const partner = await resolveMerchantPartner(event, token) let userEmail = '' try { const userRes: any = await fetchHelper(event, `models/ad_user/${userId}?$select=EMail`, 'GET', token, null) userEmail = userRes?.EMail || '' } catch (e) { /* non-fatal — the partner fields still render */ } return { status: 200, companyName: partner?.record?.Name || '', userEmail, ...(partner ? pickMerchantFields(partner.record) : {}), pending: getActivePendingFor(userId, partner?.id ?? null) } } 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 })