UNPKG

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