/** * Standard route wrapper for the SIS listing routes: caller token → handler; * on failure one refresh+retry (unless the error came from Amazon), then the * app's error shape. Keeps the 11 small routes free of the boilerplate. */ import refreshTokenHelper from '../refreshTokenHelper' import forceLogoutHelper from '../forceLogoutHelper' import errorHandlingHelper from '../errorHandlingHelper' import getTokenHelper from '../getTokenHelper' import { eventFetch, type IdempiereFetch } from './listingStore' export interface SisRouteCtx { event: any; token: string; f: IdempiereFetch; userLabel: string } export const userLabelOf = (event: any): string => { try { const raw = getCookie(event, 'logship_user') const user = raw ? JSON.parse(raw) : null return String(user?.Name || user?.email || getCookie(event, 'logship_user_id') || 'unknown') } catch { return String(getCookie(event, 'logship_user_id') || 'unknown') } } export const defineSisHandler = (handler: (ctx: SisRouteCtx) => Promise) => defineEventHandler(async (event) => { const run = async (authToken: string | null = null) => { const token = String(authToken ?? (await getTokenHelper(event)) ?? '') return handler({ event, token, f: eventFetch(event, token), userLabel: userLabelOf(event) }) } try { return await run() } catch (err: any) { if (err?.isAmazonError) return errorHandlingHelper(err?.data ?? err, err?.data ?? err) if (Number(err?.status) >= 400 && Number(err?.status) < 500 && err?.message && !err?.data) return { status: Number(err.status), message: err.message } try { const authToken: any = await refreshTokenHelper(event) return await run(authToken) } catch (error: any) { const data = errorHandlingHelper(err?.data ?? err, error?.data ?? error) forceLogoutHelper(event, data) return data } } })