/** * GET /api/offers/software-catalog * The software-offer catalog (packages, feature matrix, add-ons) read from the * iDempiere tables CUST_SoftwarePlan / CUST_SoftwareCatalogItem — fail-soft to * the code defaults (see server/utils/offers/softwareCatalog.ts). `?refresh=1` * bypasses the 5-min cache. Token gate only (every staff user may read it). */ import refreshTokenHelper from '../../../utils/refreshTokenHelper' import errorHandlingHelper from '../../../utils/errorHandlingHelper' import forceLogoutHelper from '../../../utils/forceLogoutHelper' import { loadSoftwareCatalog } from '../../../utils/offers/softwareCatalog' const handleFunc = async (event: any, authToken: string | null = null) => { const token = authToken ?? await getTokenHelper(event) if (!token) return { status: 401, message: 'Not authenticated' } const force = String(getQuery(event)?.refresh || '') === '1' const catalog = await loadSoftwareCatalog(event, token, force) return { status: 200, catalog } } 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) forceLogoutHelper(event, data) } } return data })