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