// Seed a confirmed payment_session for the test customer and fire a general blast. // Used by Maestro flows that drive the mitra side and need a customer's // request to arrive without running a second app. // // Required env: BACKEND_URL, TEST_CUSTOMER_JWT (from .maestro/config.yaml) // // Replaces customer_blast_now.sh (Maestro's runScript only supports JS, not shell). const backend = BACKEND_URL || 'http://localhost:3000' const internal = BACKEND_INTERNAL_URL || 'http://localhost:3001' if (!TEST_CUSTOMER_JWT || TEST_CUSTOMER_JWT.startsWith('REPLACE')) { // Test customer creds aren't set — create an anonymous customer instead so the // suite still works on a fresh dev machine. const auth = http.post(`${backend}/api/shared/auth/anonymous`, { headers: { 'Content-Type': 'application/json' }, body: '{}', }) if (auth.status !== 201 && auth.status !== 200) { throw new Error(`anonymous auth failed (${auth.status}): ${auth.body}`) } const ad = json(auth.body) output.TEST_CUSTOMER_JWT = ad.data.access_token // give the anonymous customer a display name so the chat-request endpoint accepts http.post(`${backend}/api/client/auth/profile`, { headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${ad.data.access_token}` }, body: JSON.stringify({ display_name: 'BlastTester' }), method: 'PATCH', }) } const token = output.TEST_CUSTOMER_JWT || TEST_CUSTOMER_JWT // Step 1: create a payment session (5 min chat) const psResp = http.post(`${backend}/api/client/payment-sessions`, { headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ duration_minutes: 5, mode: 'chat' }), }) if (psResp.status !== 200 && psResp.status !== 201) { throw new Error(`create-payment failed (${psResp.status}): ${psResp.body}`) } const ps = json(psResp.body) output.PAYMENT_SESSION_ID = ps.data.id // Step 2: force-confirm via internal test endpoint (skip real Xendit) const confirmResp = http.post(`${internal}/internal/_test/force-confirm-payment`, { headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ latest: true }), }) if (confirmResp.status !== 200) { throw new Error(`force-confirm-payment failed (${confirmResp.status}): ${confirmResp.body}`) } // Step 3: fire the chat request (general blast) const brResp = http.post(`${backend}/api/client/chat/request`, { headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ payment_session_id: ps.data.id, topic_sensitivity: 'regular' }), }) if (brResp.status !== 200 && brResp.status !== 201) { throw new Error(`fire-blast failed (${brResp.status}): ${brResp.body}`) } const br = json(brResp.body) output.SESSION_ID = br.data.id console.log('blast fired — session_id:', br.data.id)