@@ -50,8 +50,8 @@ koaRouter.use(bodyParser())
50
50
51
51
function extractErrorCode ( e : unknown ) : number {
52
52
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 ) {
55
55
return e . errorCode
56
56
} else if ( ( e as Meteor . Error ) . error && typeof ( e as Meteor . Error ) . error === 'number' ) {
57
57
return ( e as Meteor . Error ) . error as number
@@ -60,10 +60,18 @@ function extractErrorCode(e: unknown): number {
60
60
}
61
61
}
62
62
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 {
64
72
if ( ClientAPI . isClientResponseError ( e ) ) {
65
73
return translateMessage ( e . error . userMessage , interpollateTranslation )
66
- } else if ( UserError . isUserError ( e ) ) {
74
+ } else if ( UserError . isSerializedUserErrorObject ( e ) || e instanceof UserError ) {
67
75
return translateMessage ( e . userMessage , interpollateTranslation )
68
76
} else if ( ( e as Meteor . Error ) . reason && typeof ( e as Meteor . Error ) . reason === 'string' ) {
69
77
return ( e as Meteor . Error ) . reason as string
@@ -119,7 +127,7 @@ interface APIRequestError {
119
127
function sofieAPIRequest < API , Params , Body , Response > (
120
128
method : 'get' | 'post' | 'put' | 'delete' ,
121
129
route : string ,
122
- errMsgs : Map < number , UserErrorMessage [ ] > ,
130
+ errMsgFallbacks : Map < number , UserErrorMessage [ ] > ,
123
131
serverAPIFactory : APIFactory < API > ,
124
132
handler : (
125
133
serverAPI : API ,
@@ -140,27 +148,36 @@ function sofieAPIRequest<API, Params, Body, Response>(
140
148
ctx . params as unknown as Params ,
141
149
ctx . request . body as unknown as Body
142
150
)
143
- if ( ClientAPI . isClientResponseError ( response ) ) throw response . error
151
+ if ( ClientAPI . isClientResponseError ( response ) ) {
152
+ throw UserError . fromSerialized ( response . error )
153
+ }
144
154
ctx . body = JSON . stringify ( { status : response . success , result : response . result } )
145
155
ctx . status = response . success
146
156
} catch ( e ) {
157
+ const userError = validateUserError ( e )
147
158
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.
151
165
const msgConcat = {
152
- key : msgs
166
+ key : fallbackMsgs
153
167
. 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 ) ,
155
169
}
156
170
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 } ` : '' } `
161
174
}
162
175
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
+
164
181
ctx . type = 'application/json'
165
182
const bodyObj : APIRequestError = { status : errCode , message : errMsg }
166
183
const details = extractErrorDetails ( e )
0 commit comments