import refreshTokenHelper from "../../../utils/refreshTokenHelper" import fetchHelper from "../../../utils/fetchHelper" import getTokenHelper from "../../../utils/getTokenHelper" export default defineEventHandler(async (event) => { const body = await readBody(event) const { orderSourceId, ebayEnvironment } = body if (!orderSourceId) { return { success: false, message: 'Missing order source ID.' } } // Fetch fresh order source from iDempiere to get the raw marketplace_token let orderSource: any = null try { const token = await getTokenHelper(event) orderSource = await fetchHelper(event, `models/c_ordersource/${orderSourceId}`, 'GET', token, null) } catch (err: any) { try { const authToken = await refreshTokenHelper(event) orderSource = await fetchHelper(event, `models/c_ordersource/${orderSourceId}`, 'GET', authToken, null) } catch (error: any) { return { success: false, message: 'Failed to fetch order source.' } } } const rawToken = orderSource?.marketplace_token if (!rawToken) { return { success: false, message: 'No token found. Please connect your eBay account first.' } } // Parse token — handle string, object, or truncated JSON let tokens: any if (typeof rawToken === 'object') { tokens = rawToken } else if (typeof rawToken === 'string') { try { tokens = JSON.parse(rawToken) if (typeof tokens === 'string') tokens = JSON.parse(tokens) } catch (e) { // JSON may be truncated due to field length limit — extract access_token via regex const accessMatch = rawToken.match(/"access_token"\s*:\s*"([^"]+)"/) if (accessMatch) { tokens = { access_token: accessMatch[1] } } else { return { success: false, message: `Token JSON is truncated or invalid. The marketplace_token field in iDempiere may be too small. Current length: ${rawToken.length} chars.` } } } } else { return { success: false, message: 'Unexpected token type: ' + typeof rawToken } } if (!tokens.access_token) { return { success: false, message: 'No access_token found in stored credentials.' } } const env = ebayEnvironment || orderSource?.ebay_environment || 'production' const apiBase = env === 'sandbox' ? 'https://apiz.sandbox.ebay.com' : 'https://apiz.ebay.com' try { const res: any = await $fetch(`${apiBase}/commerce/identity/v1/user/`, { headers: { 'Authorization': `Bearer ${tokens.access_token}`, 'Content-Type': 'application/json', }, }) return { success: true, message: `Connected as ${res.username || res.userId || 'eBay user'}`, username: res.username || res.userId, accountType: res.accountType || null, email: res.email || null, registrationMarketplaceId: res.registrationMarketplaceId || null, status: res.status || null, individualAccount: res.individualAccount || null, businessAccount: res.businessAccount || null, } } catch (err: any) { const status = err?.statusCode || err?.status const ebayError = err?.data?.errors?.[0]?.message || err?.data?.error_description || err?.message if (status === 401) { return { success: false, message: 'Access token expired. Try reconnecting your eBay account.' } } return { success: false, message: ebayError || 'Failed to connect to eBay API.' } } })