import { string } from 'alga-js' import refreshTokenHelper from "../../../utils/refreshTokenHelper" import forceLogoutHelper from "../../../utils/forceLogoutHelper" import errorHandlingHelper from "../../../utils/errorHandlingHelper" import fetchHelper from "../../../utils/fetchHelper" /** * Look up a product by exact Value match * Used for CSV import to match SKUs to products */ const handleFunc = async (event: any, authToken: any = null) => { let data: any = { records: [] } const token = authToken ?? await getTokenHelper(event) const query = getQuery(event) const value = query.value || '' if (!value) { return data } // Escape single quotes in value const escapedValue = (value as string).replace(/'/g, "''") console.log('[by-value] Looking up product:', escapedValue) // Try Value → SKU → mpn → UPC in order for a given (quote-escaped) term const lookupChain = async (term: string) => { let chainRes: any = null for (const field of ['Value', 'SKU', 'mpn', 'UPC']) { const searchFilter = `${field} eq '${term}' and isActive eq true` const apiUrl = `models/m_product?$filter=${string.urlEncode(searchFilter)}&$select=m_product_id,Value,Name,SKU,mpn,UPC&$top=1` console.log(`[by-value] Trying ${field} field for "${term}"...`) chainRes = await fetchHelper(event, apiUrl, 'GET', token, null) if (chainRes?.records?.length) break } return chainRes } let res: any = await lookupChain(escapedValue) // No exact match anywhere → retry the chain with separators stripped, so a // printed barcode "PZN-15821889" / "PZN - 15821889" finds stored "PZN15821889". if (!res?.records?.length) { const strippedValue = escapedValue.replace(/[\s-]+/g, '') if (strippedValue && strippedValue !== escapedValue) { console.log('[by-value] No exact match, retrying with separators stripped:', strippedValue) res = await lookupChain(strippedValue) } } console.log('[by-value] Response records:', res?.records?.length || 0) if (res?.records?.length > 0) { console.log('[by-value] Found:', res.records[0].Value, res.records[0].Name) } else { console.log('[by-value] No product found for:', escapedValue) } if (res?.records) { // Map m_product_id to id for consistency data.records = res.records.map((r: any) => ({ id: r.m_product_id || r.M_Product_ID || r.id, Value: r.Value, Name: r.Name, SKU: r.SKU, MPN: r.mpn, UPC: r.UPC })) } return data } export default defineEventHandler(async (event) => { let data: any = {} try { data = await handleFunc(event) } catch (err: any) { try { let 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 })