@@ -50,8 +50,8 @@ koaRouter.use(bodyParser())
5050
5151function extractErrorCode ( e : unknown ) : number {
5252 if ( ClientAPI . isClientResponseError ( e ) ) {
53- return e . errorCode
54- } else if ( UserError . isUserError ( e ) ) {
53+ return e . error . errorCode
54+ } else if ( UserError . isSerializedUserErrorObject ( e ) || e instanceof UserError ) {
5555 return e . errorCode
5656 } else if ( ( e as Meteor . Error ) . error && typeof ( e as Meteor . Error ) . error === 'number' ) {
5757 return ( e as Meteor . Error ) . error as number
@@ -60,10 +60,18 @@ function extractErrorCode(e: unknown): number {
6060 }
6161}
6262
63- function extractErrorMessage ( e : unknown ) : string {
63+ function validateUserError ( e : unknown ) : UserError | undefined {
64+ if ( e instanceof UserError ) {
65+ return e
66+ } else if ( UserError . isSerializedUserErrorObject ( e ) ) {
67+ return UserError . fromUnknown ( e )
68+ }
69+ }
70+
71+ function extractErrorUserMessage ( e : unknown ) : string {
6472 if ( ClientAPI . isClientResponseError ( e ) ) {
6573 return translateMessage ( e . error . userMessage , interpollateTranslation )
66- } else if ( UserError . isUserError ( e ) ) {
74+ } else if ( UserError . isSerializedUserErrorObject ( e ) || e instanceof UserError ) {
6775 return translateMessage ( e . userMessage , interpollateTranslation )
6876 } else if ( ( e as Meteor . Error ) . reason && typeof ( e as Meteor . Error ) . reason === 'string' ) {
6977 return ( e as Meteor . Error ) . reason as string
@@ -119,7 +127,7 @@ interface APIRequestError {
119127function sofieAPIRequest < API , Params , Body , Response > (
120128 method : 'get' | 'post' | 'put' | 'delete' ,
121129 route : string ,
122- errMsgs : Map < number , UserErrorMessage [ ] > ,
130+ errMsgFallbacks : Map < number , UserErrorMessage [ ] > ,
123131 serverAPIFactory : APIFactory < API > ,
124132 handler : (
125133 serverAPI : API ,
@@ -140,27 +148,36 @@ function sofieAPIRequest<API, Params, Body, Response>(
140148 ctx . params as unknown as Params ,
141149 ctx . request . body as unknown as Body
142150 )
143- if ( ClientAPI . isClientResponseError ( response ) ) throw response . error
151+ if ( ClientAPI . isClientResponseError ( response ) ) {
152+ throw UserError . fromSerialized ( response . error )
153+ }
144154 ctx . body = JSON . stringify ( { status : response . success , result : response . result } )
145155 ctx . status = response . success
146156 } catch ( e ) {
157+ const userError = validateUserError ( e )
147158 const errCode = extractErrorCode ( e )
148- let errMsg = extractErrorMessage ( e )
149- const msgs = errMsgs . get ( errCode )
150- if ( msgs ) {
159+ let errMsg = extractErrorUserMessage ( e )
160+ // Get the fallback messages of the endpoint
161+ const fallbackMsgs = errMsgFallbacks . get ( errCode )
162+
163+ if ( fallbackMsgs && ( userError ?. message === errMsg || userError ?. message === '' ) ) {
164+ // If no detailed error message is provided then return the fallback error messages.
151165 const msgConcat = {
152- key : msgs
166+ key : fallbackMsgs
153167 . map ( ( msg ) => UserError . create ( msg , undefined , errCode ) . userMessage . key )
154- . reduce ( ( acc , msg ) => acc + ( acc . length ? ' or ' : '' ) + msg , '' ) ,
168+ . reduce ( ( acc , msg ) => acc + ( acc . length ? ' or ' : '' ) + msg , errMsg ) ,
155169 }
156170 errMsg = translateMessage ( msgConcat , interpollateTranslation )
157- } else {
158- logger . error (
159- `${ method . toUpperCase ( ) } for route ${ route } returned unexpected error code ${ errCode } - ${ errMsg } `
160- )
171+ } else if ( userError ?. message ) {
172+ // If we have a detailed arbitrary error message then return that together with the standard error message.
173+ errMsg = `${ errMsg } ${ userError . message !== errMsg && userError . message !== '' ? ` - ${ userError ?. message } ` : '' } `
161174 }
162175
163- logger . error ( `${ method . toUpperCase ( ) } failed for route ${ route } : ${ errCode } - ${ errMsg } ` )
176+ // Log unknown error codes
177+ logger . error (
178+ `${ method . toUpperCase ( ) } failed for route ${ route } :${ ! fallbackMsgs ? ' returned unexpected error code' : '' } ${ errCode } - ${ errMsg } `
179+ )
180+
164181 ctx . type = 'application/json'
165182 const bodyObj : APIRequestError = { status : errCode , message : errMsg }
166183 const details = extractErrorDetails ( e )
0 commit comments