11import dayjs from '../../lib/dayjs'
22import isPlainObject from 'lodash/isPlainObject'
33import { fullFormats } from 'ajv-formats/dist/formats'
4- import { ErrorCodes , MultiStatusResponse , type RequestClient } from '@segment/actions-core'
4+ import { ErrorCodes , MultiStatusResponse , RequestClient } from '@segment/actions-core'
55import { CUSTOMERIO_TRACK_API_VERSION } from './versioning-info'
66
77const isEmail = ( value : string ) : boolean => {
@@ -208,30 +208,43 @@ export const sendBatch = async <Payload extends BasePayload>(
208208 const [ { settings } ] = options
209209 const batch = options . map ( ( opts ) => buildPayload ( opts ) )
210210
211- const response = await request ( `${ trackApiEndpoint ( settings ) } /api/${ CUSTOMERIO_TRACK_API_VERSION } /batch` , {
212- method : 'post' ,
213- json : {
214- batch
215- }
216- } )
211+ try {
212+ const response = await request < CustomerIOBatchResponse > (
213+ `${ trackApiEndpoint ( settings ) } /api/${ CUSTOMERIO_TRACK_API_VERSION } /batch` ,
214+ {
215+ method : 'post' ,
216+ json : {
217+ batch
218+ }
219+ }
220+ )
217221
218- const responseBody = getResponseBody ( response )
222+ const responseBody = getResponseBody ( response )
219223
220- if ( response ?. status === 207 && responseBody ) {
221- const parsedResults = parseTrackApiMultiStatusResponse ( responseBody , batch . length )
222- if ( parsedResults ) {
223- return parsedResults
224+ if ( ( response ?. status === 200 || response ?. status === 207 ) && responseBody ) {
225+ const parsedResults = parseTrackApiMultiStatusResponse ( responseBody , options , batch )
226+ if ( parsedResults ) {
227+ return parsedResults
228+ }
224229 }
225- }
226230
227- if ( response ?. status === 200 && responseBody ) {
228- const parsedResults = parseTrackApiMultiStatusResponse ( responseBody , batch . length )
229- if ( parsedResults ) {
230- return parsedResults
231+ return response
232+ } catch ( err ) {
233+ const error = err as { message ?: string ; response ?: { status ?: number } }
234+ const status = error . response ?. status ?? 500
235+ const message = error . message ?? 'Unknown error'
236+
237+ const multiStatusResponse = new MultiStatusResponse ( )
238+ for ( let i = 0 ; i < options . length ; i ++ ) {
239+ multiStatusResponse . setErrorResponseAtIndex ( i , {
240+ status,
241+ errormessage : message ,
242+ body : options [ i ] . payload ,
243+ sent : batch [ i ]
244+ } )
231245 }
246+ return multiStatusResponse
232247 }
233-
234- return response
235248}
236249
237250interface TrackApiError {
@@ -241,7 +254,7 @@ interface TrackApiError {
241254 message ?: string
242255}
243256
244- interface TrackApiResponse {
257+ interface CustomerIOBatchResponse {
245258 errors ?: TrackApiError [ ]
246259}
247260
@@ -266,7 +279,7 @@ function mapTrackApiReasonToErrorCode(reason: string | undefined) {
266279 }
267280}
268281
269- function getResponseBody ( response : RequestResponse ) : unknown {
282+ function getResponseBody ( response : RequestResponse ) : CustomerIOBatchResponse | string | undefined {
270283 const body = response . data ?? response . content ?? response . body
271284
272285 if ( typeof body !== 'string' ) {
@@ -285,7 +298,11 @@ function getResponseBody(response: RequestResponse): unknown {
285298 }
286299}
287300
288- export function parseTrackApiErrors ( errors : TrackApiError [ ] , totalItems : number ) : MultiStatusResponse {
301+ export function parseTrackApiErrors < Payload extends BasePayload > (
302+ errors : TrackApiError [ ] ,
303+ options : RequestPayload < Payload > [ ] ,
304+ batch : Record < string , unknown > [ ]
305+ ) : MultiStatusResponse {
289306 const multiStatusResponse = new MultiStatusResponse ( )
290307 const errorMap = new Map < number , TrackApiError > ( )
291308
@@ -295,14 +312,14 @@ export function parseTrackApiErrors(errors: TrackApiError[], totalItems: number)
295312 }
296313 }
297314
298- for ( let i = 0 ; i < totalItems ; i ++ ) {
315+ for ( let i = 0 ; i < options . length ; i ++ ) {
299316 const error = errorMap . get ( i )
300317
301318 if ( ! error ) {
302319 multiStatusResponse . setSuccessResponseAtIndex ( i , {
303320 status : 200 ,
304- body : { } ,
305- sent : { }
321+ body : options [ i ] . payload ,
322+ sent : batch [ i ]
306323 } )
307324 continue
308325 }
@@ -311,27 +328,29 @@ export function parseTrackApiErrors(errors: TrackApiError[], totalItems: number)
311328 status : 400 ,
312329 errormessage : error . message || `${ error . reason || 'ERROR' } : ${ error . field || 'unknown field' } ` ,
313330 errortype : mapTrackApiReasonToErrorCode ( error . reason ) ,
314- body : error
331+ body : options [ i ] . payload ,
332+ sent : batch [ i ]
315333 } )
316334 }
317335
318336 return multiStatusResponse
319337}
320338
321- export function parseTrackApiMultiStatusResponse (
322- responseBody : unknown ,
323- totalItems : number
339+ export function parseTrackApiMultiStatusResponse < Payload extends BasePayload > (
340+ responseBody : CustomerIOBatchResponse | string | undefined ,
341+ options : RequestPayload < Payload > [ ] ,
342+ batch : Record < string , unknown > [ ]
324343) : MultiStatusResponse | null {
325344 if ( ! isRecord ( responseBody ) ) {
326345 return null
327346 }
328347
329- const { errors } = responseBody as TrackApiResponse
348+ const { errors } = responseBody as CustomerIOBatchResponse
330349 if ( ! Array . isArray ( errors ) || errors . length === 0 ) {
331350 return null
332351 }
333352
334- return parseTrackApiErrors ( errors , totalItems )
353+ return parseTrackApiErrors ( errors , options , batch )
335354}
336355
337356export const sendSingle = < Payload extends BasePayload > ( request : RequestClient , options : RequestPayload < Payload > ) => {
0 commit comments