UNPKG

10.5 kBJavaScriptView Raw
1import request from 'superagent-bluebird-promise'
2import { HttpMethod } from 'api/const'
3import moment from 'moment'
4
5class PromiseHttpResourceExecutor {
6 constructor () {
7 this._forbiddenHeadersInClient = ['cookie']
8 }
9
10 validate (resourceExecutionSpec) {
11 return true
12 }
13
14 execute (resourceExecutionSpec, offlineCallback, errorCallback, successCallback, attachments, onProgressListener) {
15 switch (resourceExecutionSpec.method) {
16 case HttpMethod.POST:
17 return this._executePOSTResourceExecution(resourceExecutionSpec, offlineCallback, errorCallback, successCallback, attachments, onProgressListener)
18 case HttpMethod.GET:
19 return this._executeGETResourceExecution(resourceExecutionSpec, offlineCallback, errorCallback, successCallback)
20 }
21 }
22
23 _handleBadGateway (err, result, offlineCallback, errorCallback, successCallback) {
24 if (err) {
25 errorCallback(err, null)
26 } else {
27 errorCallback(new Error('[ERROR_CODE_502] An error occurred when trying to execute resource. Error code: 502 - Bad Gateway.', null))
28 }
29 }
30
31 _handleServerError (err, result, offlineCallback, errorCallback, successCallback) {
32 if (err) {
33 errorCallback(err, null)
34 } else {
35 errorCallback(new Error('[ERROR_CODE_500] An error occurred when trying to execute resource. Error code: 500 - Internal server error.', null))
36 }
37 }
38
39 _handleServerUnavailable (err, result, offlineCallback, errorCallback, successCallback) {
40 if (err) {
41 errorCallback(err, null)
42 } else {
43 errorCallback(new Error('[ERROR_CODE_503] An error occurred when trying to execute resource. Error code: 503 - Server Unavailable.', null))
44 }
45 }
46
47 _handleBadRequest (err, result, offlineCallback, errorCallback, successCallback) {
48 if (err) {
49 errorCallback(err, null)
50 } else {
51 errorCallback(new Error('[ERROR_CODE_400] An error occurred when trying to execute resource. Error code: 400 - Bad Request.', null))
52 }
53 }
54
55 _handleUnauthorized (err, result, offlineCallback, errorCallback, successCallback) {
56 if (err) {
57 errorCallback(err, null)
58 } else {
59 errorCallback(new Error('[ERROR_CODE_401] An error occurred when trying to execute resource. Error code: 401 - Bad Gateway.', null))
60 }
61 }
62
63 _handleForbidden (err, result, offlineCallback, errorCallback, successCallback) {
64 if (err) {
65 errorCallback(err, null)
66 } else {
67 errorCallback(new Error('[ERROR_CODE_403] An error occurred when trying to execute resource. Error code: 403 - Forbidden.', null))
68 }
69 }
70
71 _handleSuccess (err, result, offlineCallback, errorCallback, successCallback) {
72 if (err) {
73 errorCallback(err, null)
74 } else {
75 let resourceExecutionResult = {
76 status: result.status,
77 body: result.body,
78 headers: result.headers
79 }
80 successCallback(null, resourceExecutionResult)
81 }
82 }
83
84 _handleNoContent (err, result, offlineCallback, errorCallback, successCallback) {
85 if (err) {
86 errorCallback(err, null)
87 } else {
88 let resourceExecutionResult = {
89 status: result.status,
90 data: null,
91 headers: result.headers
92 }
93 successCallback(null, resourceExecutionResult)
94 }
95 }
96
97 _handleUnprocessableEntity (err, result, offlineCallback, errorCallback, successCallback) {
98 if (err) {
99 errorCallback(err, null)
100 } else {
101 errorCallback(new Error('[ERROR_CODE_422] An error occurred when trying to execute resource. Error code: 422 - Unprocessable entity.', null))
102 }
103 }
104
105 _handleUnsupportedMediaType (err, result, offlineCallback, errorCallback, successCallback) {
106 if (err) {
107 errorCallback(err, null)
108 } else {
109 errorCallback(new Error('[ERROR_CODE_415] An error occurred when trying to execute resource. Error code: 415 - Unsupported media type.', null))
110 }
111 }
112
113 _isProcessOnNode () {
114 return (typeof window === 'undefined' && typeof document === 'undefined')
115 }
116
117 _executeGETResourceExecution (resourceExecutionSpec, offlineCallback, errorCallback, successCallback) {
118 let getRequest = request.get(resourceExecutionSpec.uri).withCredentials()
119
120 if (resourceExecutionSpec.headers != null && typeof resourceExecutionSpec !== 'undefined') {
121 if (__SERVER__) {
122 Object.keys(resourceExecutionSpec.headers).forEach((h) => {
123 getRequest.set(h, resourceExecutionSpec.headers[h])
124 })
125 } else {
126 Object.keys(resourceExecutionSpec.headers).forEach((h) => {
127 if (this._forbiddenHeadersInClient.indexOf(h.toLowerCase()) < 0) {
128 getRequest.set(h, resourceExecutionSpec.headers[h])
129 }
130 })
131 }
132 }
133
134 if (resourceExecutionSpec.timeout != null && typeof resourceExecutionSpec.timeout !== 'undefined') {
135 getRequest.timeout(resourceExecutionSpec.timeout)
136 }
137
138 const now = moment().format('YYYY-MM-DD HH:mm:ss')
139 const uri = resourceExecutionSpec.uri
140 const timeStart = new Date().getTime()
141
142 getRequest.end((err, result) => {
143 const timeElapsed = new Date().getTime() - timeStart
144
145 if (err) {
146 if (this._isProcessOnNode())
147 console.log(`INFO [${now}] [GET] ${uri} [ERROR] [MARKER] -> ${timeElapsed}ms`)
148 return this._handleServerError(err, result, offlineCallback, errorCallback, successCallback)
149 } else {
150 if (this._isProcessOnNode()) {
151 const status = result.status
152 console.log(`INFO [${now}] [GET] ${uri} [STATUS: ${status}] [MARKER] -> ${timeElapsed}ms`)
153 }
154 switch (result.status) {
155 case 502:
156 return this._handleBadGateway(err, result, offlineCallback, errorCallback, successCallback)
157 case 500:
158 return this._handleServerError(err, result, offlineCallback, errorCallback, successCallback)
159 case 503:
160 return this._handleServerUnavailable(err, result, offlineCallback, errorCallback, successCallback)
161 case 400:
162 return this._handleBadRequest(err, result, offlineCallback, errorCallback, successCallback)
163 case 401:
164 return this._handleUnauthorized(err, result, offlineCallback, errorCallback, successCallback)
165 case 403:
166 return this._handleForbidden(err, result, offlineCallback, errorCallback, successCallback)
167 case 200:
168 return this._handleSuccess(null, result, offlineCallback, errorCallback, successCallback)
169 case 204:
170 return this._handleNoContent(err, result, offlineCallback, errorCallback, successCallback)
171 case 422:
172 return this._handleUnprocessableEntity(err, result, offlineCallback, errorCallback, successCallback)
173 case 415:
174 return this._handleUnsupportedMediaType(err, result, offlineCallback, errorCallback, successCallback)
175 }
176 }
177 })
178 }
179
180 _executePOSTResourceExecution (resourceExecutionSpec, offlineCallback, errorCallback, successCallback, attachments, onProgressListener) {
181 let postRequest = request.post(resourceExecutionSpec.uri).withCredentials()
182
183 if (attachments) {
184 Object.keys(attachments).forEach((key) => {
185 postRequest.attach(key, attachments[key])
186 })
187 }
188
189 if (onProgressListener) {
190 postRequest.on('progress', onProgressListener)
191 }
192
193 if (resourceExecutionSpec.body != null && typeof resourceExecutionSpec.body !== 'undefined') {
194 if (!attachments) {
195 postRequest.send(JSON.stringify(resourceExecutionSpec.body))
196 }
197 }
198 if (resourceExecutionSpec.contentType != null && typeof resourceExecutionSpec.contentType !== 'undefined') {
199 postRequest.set('Content-Type', resourceExecutionSpec.contentType)
200 }
201 if (resourceExecutionSpec.timeout != null && typeof resourceExecutionSpec.timeout !== 'undefined') {
202 postRequest.timeout(resourceExecutionSpec.timeout)
203 }
204
205 if (resourceExecutionSpec.headers != null && typeof resourceExecutionSpec !== 'undefined') {
206 if (__SERVER__) {
207 Object.keys(resourceExecutionSpec.headers).forEach((h) => {
208 postRequest.set(h, resourceExecutionSpec.headers[h])
209 })
210 } else {
211 Object.keys(resourceExecutionSpec.headers).forEach((h) => {
212 if (this._forbiddenHeadersInClient.indexOf(h.toLowerCase()) < 0) {
213 postRequest.set(h, resourceExecutionSpec.headers[h])
214 }
215 })
216 }
217 }
218
219 const now = moment().format('YYYY-MM-DD HH:mm:ss')
220 const uri = resourceExecutionSpec.uri
221 const timeStart = new Date().getTime()
222
223 postRequest.end((err, result) => {
224 const timeElapsed = new Date().getTime() - timeStart
225
226 if (err) {
227 if (this._isProcessOnNode())
228 console.log(`INFO [${now}] [POST] ${uri} [ERROR] [MARKER] -> ${timeElapsed}ms`)
229 return this._handleServerError(err, result, offlineCallback, errorCallback, successCallback)
230 } else {
231 if (this._isProcessOnNode()) {
232 const status = result.status
233 console.log(`INFO [${now}] [POST] ${uri} [STATUS: ${status}] [MARKER] -> ${timeElapsed}ms`)
234 }
235 switch (result.status) {
236 case 502:
237 return this._handleBadGateway(err, result, offlineCallback, errorCallback, successCallback)
238 case 500:
239 return this._handleServerError(err, result, offlineCallback, errorCallback, successCallback)
240 case 503:
241 return this._handleServerUnavailable(err, result, offlineCallback, errorCallback, successCallback)
242 case 400:
243 return this._handleBadRequest(err, result, offlineCallback, errorCallback, successCallback)
244 case 401:
245 return this._handleUnauthorized(err, result, offlineCallback, errorCallback, successCallback)
246 case 403:
247 return this._handleForbidden(err, result, offlineCallback, errorCallback, successCallback)
248 case 200:
249 return this._handleSuccess(null, result, offlineCallback, errorCallback, successCallback)
250 case 204:
251 return this._handleNoContent(err, result, offlineCallback, errorCallback, successCallback)
252 case 422:
253 return this._handleUnprocessableEntity(err, result, offlineCallback, errorCallback, successCallback)
254 case 415:
255 return this._handleUnsupportedMediaType(err, result, offlineCallback, errorCallback, successCallback)
256 }
257 }
258 })
259 }
260}
261
262export default PromiseHttpResourceExecutor