1 | import request from 'superagent-bluebird-promise'
|
2 | import { HttpMethod } from 'api/const'
|
3 | import moment from 'moment'
|
4 |
|
5 | class 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 |
|
262 | export default PromiseHttpResourceExecutor
|