1
1
import { RESTDataSource } from '@apollo/datasource-rest'
2
- import { StatusCodes } from 'http-status-codes'
2
+ import { GraphQLError } from 'graphql'
3
+ import StatusCodes from 'http-status-codes'
3
4
import fetch from 'node-fetch'
4
5
import qs from 'qs'
5
- import { logger } from '../../utils/logger.js'
6
+ import { APIM_REQUEST_ACCESS_TOKEN_001 , APIM_REQUEST_RURAL_PAYMENTS_REQUEST_001 , RURALPAYMENTS_REQUEST_ALL_001 } from '../../logger/codes.js'
7
+ import { logger } from '../../logger/logger.js'
6
8
7
9
const defaultHeaders = {
8
10
'Ocp-Apim-Subscription-Key' : process . env . RP_INTERNAL_APIM_SUBSCRIPTION_KEY
@@ -20,33 +22,56 @@ export class RuralPayments extends RESTDataSource {
20
22
}
21
23
22
24
async fetch ( path , incomingRequest ) {
23
- logger . debug ( '#RuralPayments - new request' , {
25
+ logger . verbose ( '#RuralPayments - new request' , {
24
26
path,
25
27
method : incomingRequest . method
26
28
} )
27
29
28
30
const doRequest = async ( count = 1 ) => {
29
31
try {
32
+ const requestStart = Date . now ( )
30
33
const result = await super . fetch ( path , incomingRequest )
31
- logger . debug ( '#RuralPayments - response ' , {
34
+ const requestEnd = ( Date . now ( ) - requestStart )
35
+ logger . verbose ( '#RuralPayments - response ' , {
32
36
path,
33
- status : result . response ?. status ,
34
- body : result . response ?. parsedBody
37
+ status : result . response ?. status
38
+ } )
39
+ logger . health ( '#RuralPayments - request success' , {
40
+ code : RURALPAYMENTS_REQUEST_ALL_001 ,
41
+ requestTimeMs : requestEnd
42
+ } )
43
+ logger . health ( '#APIM - request success' , {
44
+ code : APIM_REQUEST_RURAL_PAYMENTS_REQUEST_001
35
45
} )
36
46
return result
37
47
} catch ( error ) {
38
48
// Handle occasionally 500 error produced by APIM
39
- // TODO: Once APIM has been fixed remove retry logic
49
+ // TODO: Once APIM has been fixed, remove retry logic
40
50
if ( error ?. extensions ?. response ?. status === StatusCodes . INTERNAL_SERVER_ERROR && count < maximumRetries ) {
41
- logger . error ( `#RuralPayments - Error, Retrying request (${ count } )` , {
51
+ logger . warn ( `#RuralPayments - Error, Retrying request (${ count } )` , { error } )
52
+ return doRequest ( count + 1 )
53
+ }
54
+ // if response is text, then the error is from RoralPayments
55
+ if ( error ?. extensions ?. response ?. headers ?. get ( 'Content-Type' ) ?. includes ( 'text/html' ) ) {
56
+ logger . error ( '#RuralPayments - error' , {
57
+ error,
42
58
path,
43
59
method : incomingRequest . method ,
44
60
count,
45
- error
61
+ response : error ?. extensions ?. response ,
62
+ code : RURALPAYMENTS_REQUEST_ALL_001
63
+ } )
64
+ } else {
65
+ // if response is json, then the error is from APIM
66
+ logger . error ( '#APIM - error' , {
67
+ error,
68
+ path,
69
+ method : incomingRequest . method ,
70
+ count,
71
+ response : error ?. extensions ?. response ,
72
+ code : APIM_REQUEST_RURAL_PAYMENTS_REQUEST_001
46
73
} )
47
- return doRequest ( count + 1 )
48
74
}
49
- logger . error ( '#RuralPayments - Error fetching data' , { error } )
50
75
throw error
51
76
}
52
77
}
@@ -59,19 +84,17 @@ export class RuralPayments extends RESTDataSource {
59
84
if ( response . ok ) {
60
85
return
61
86
}
62
- logger . error ( '#RuralPayments - error' , {
63
- status : response ?. status ,
64
- url : response ?. url ,
65
- error : response ?. error
87
+
88
+ throw new GraphQLError ( `${ options . response . status } : ${ options . response . statusText } ` , {
89
+ extensions : options
66
90
} )
67
- throw await this . errorFromResponse ( options )
68
91
}
69
92
70
93
async willSendRequest ( _path , request ) {
71
94
if ( ! this . apimAccessToken ) {
72
- logger . debug ( 'Getting APIM access token' )
95
+ logger . verbose ( 'Getting APIM access token' )
73
96
await this . getApimAccessToken ( )
74
- logger . debug ( 'APIM access token' , {
97
+ logger . verbose ( 'APIM access token' , {
75
98
apimAccessToken : this . apimAccessToken
76
99
} )
77
100
}
@@ -105,7 +128,7 @@ export class RuralPayments extends RESTDataSource {
105
128
}
106
129
107
130
try {
108
- logger . debug (
131
+ logger . verbose (
109
132
`Token request url: ${ process . env . RP_INTERNAL_APIM_ACCESS_TOKEN_URL } ${ process . env . RP_INTERNAL_APIM_TENANT_ID } /oauth2/v2.0/token`
110
133
)
111
134
const response = await fetch (
@@ -123,9 +146,10 @@ export class RuralPayments extends RESTDataSource {
123
146
throw new Error ( 'No access token returned' )
124
147
}
125
148
149
+ logger . health ( 'Successfully got APIM access token' , { code : APIM_REQUEST_ACCESS_TOKEN_001 } )
126
150
this . apimAccessToken = data . access_token
127
151
} catch ( error ) {
128
- logger . error ( 'Error getting APIM access token' , { error } )
152
+ logger . error ( 'Error getting APIM access token' , { error, code : APIM_REQUEST_ACCESS_TOKEN_001 } )
129
153
throw error
130
154
}
131
155
}
0 commit comments