-
Notifications
You must be signed in to change notification settings - Fork 104
/
Copy pathgateway.js
110 lines (93 loc) · 3.72 KB
/
gateway.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
'use strict';
let ErrorResponse = require('./error_response').ErrorResponse;
let SearchResponse = require('./search_response').SearchResponse;
let exceptions = require('./exceptions');
let _ = require('underscore');
class Gateway {
createResponseHandler(attributeKlassMap, Klass) {
return function (response) { // eslint-disable-line consistent-return
if (response.apiErrorResponse) {
return Promise.resolve(new ErrorResponse(response.apiErrorResponse));
}
response.success = true;
if (attributeKlassMap === null) {
return Promise.resolve(response);
} else if (typeof attributeKlassMap === 'string') {
let attributeName = attributeKlassMap;
if (response[attributeName]) {
if (Klass != null) { response[attributeName] = new Klass(response[attributeName]); }
}
return Promise.resolve(response);
}
let unknown = true;
for (let attributeName in attributeKlassMap) {
if (!attributeKlassMap.hasOwnProperty(attributeName)) {
continue;
}
Klass = attributeKlassMap[attributeName];
if (response[attributeName]) {
unknown = false;
if (Klass != null) { response[attributeName] = new Klass(response[attributeName]); }
return Promise.resolve(response);
}
}
if (unknown) {
return Promise.resolve(response);
}
};
}
createSearchResponse(url, search, pagingFunction, callback) {
if (callback != null) {
return this.gateway.http.post(url, {search: search.toHash()}, this.searchResponseHandler(pagingFunction, callback));
}
let searchResponse = new SearchResponse();
this.gateway.http.post(url, {search: search.toHash()}, function (err, response) {
if (err != null) {
searchResponse.setFatalError(err);
} else if (response.searchResults) {
searchResponse.setResponse(response);
searchResponse.setPagingFunction(pagingFunction);
} else if (response.apiErrorResponse) {
searchResponse.setFatalError(new ErrorResponse(response.apiErrorResponse));
} else {
searchResponse.setFatalError(exceptions.DownForMaintenanceError('Down for Maintenance')); // eslint-disable-line new-cap
}
return searchResponse.ready();
});
return searchResponse.stream;
}
searchResponseHandler(pagingFunction, callback) {
return function (err, response) {
if (err) { return callback(err, response); }
if (response.searchResults) {
let container = new SearchResponse(pagingFunction, response);
return callback(null, container);
} else if (response.apiErrorResponse) {
return callback(null, new ErrorResponse(response.apiErrorResponse));
}
return callback(exceptions.DownForMaintenanceError('Down for Maintenance'), null); // eslint-disable-line new-cap
};
}
pagingFunctionGenerator(search, url, SubjectType, pagedResultsKey, getSubject) {
return (ids, callback) => {
search.ids().in(ids);
this.gateway.http.post(`${this.config.baseMerchantPath()}/` + url + '/advanced_search', {search: search.toHash()}, function (err, response) {
if (err) {
callback(err, null);
return;
} else if (pagedResultsKey in response) {
if (_.isArray(getSubject(response))) {
getSubject(response).map((subject) => {
callback(null, new SubjectType(subject));
});
return;
}
callback(null, new SubjectType(getSubject(response)));
return;
}
callback(exceptions.DownForMaintenanceError('Down for Maintenance'), null); // eslint-disable-line new-cap
});
};
}
}
module.exports = {Gateway: Gateway};