Skip to content

Commit d98d3e9

Browse files
add: parse response parameters
1 parent 1329ec1 commit d98d3e9

File tree

8 files changed

+150
-141
lines changed

8 files changed

+150
-141
lines changed

lib/dynamics-web-api-callbacks.js

Lines changed: 22 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ function DynamicsWebApi(config) {
113113
returnRepresentation: null
114114
};
115115

116+
var _isBatch = false;
117+
116118
if (!config) {
117119
config = _internalConfig;
118120
}
@@ -170,8 +172,9 @@ function DynamicsWebApi(config) {
170172

171173
this.setConfig(config);
172174

173-
var _makeRequest = function (method, request, functionName, successCallback, errorCallback) {
174-
Request.makeRequest(method, request, functionName, _internalConfig, successCallback, errorCallback);
175+
var _makeRequest = function (method, request, functionName, successCallback, errorCallback, responseParams) {
176+
request.isBatch = _isBatch;
177+
Request.makeRequest(method, request, functionName, _internalConfig, responseParams, successCallback, errorCallback);
175178
};
176179

177180
/**
@@ -204,16 +207,7 @@ function DynamicsWebApi(config) {
204207
ErrorHelper.callbackParameterCheck(errorCallback, "DynamicsWebApi.create", "errorCallback");
205208

206209
var onSuccess = function (response) {
207-
if (response.data) {
208-
successCallback(response.data);
209-
}
210-
else {
211-
var entityUrl = response.headers['OData-EntityId']
212-
? response.headers['OData-EntityId']
213-
: response.headers['odata-entityid'];
214-
var id = /([0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12})\)$/i.exec(entityUrl)[1];
215-
successCallback(id);
216-
}
210+
successCallback(response.data);
217211
};
218212

219213
_makeRequest("POST", request, 'create', onSuccess, errorCallback);
@@ -625,34 +619,27 @@ function DynamicsWebApi(config) {
625619
* @param {string} [filter] - Use the $filter system query option to set criteria for which entities will be returned.
626620
*/
627621
this.count = function (collection, successCallback, errorCallback, filter) {
622+
ErrorHelper.stringParameterCheck(collection, "DynamicsWebApi.count", "collection");
623+
ErrorHelper.callbackParameterCheck(successCallback, "DynamicsWebApi.count", "successCallback");
624+
ErrorHelper.callbackParameterCheck(errorCallback, "DynamicsWebApi.count", "errorCallback");
628625

629-
if (filter == null || (filter != null && !filter.length)) {
630-
ErrorHelper.stringParameterCheck(collection, "DynamicsWebApi.count", "collection");
631-
ErrorHelper.callbackParameterCheck(successCallback, "DynamicsWebApi.count", "successCallback");
632-
ErrorHelper.callbackParameterCheck(errorCallback, "DynamicsWebApi.count", "errorCallback");
633-
634-
//if filter has not been specified then simplify the request
635-
636-
var onSuccess = function (response) {
637-
successCallback(response.data ? parseInt(response.data) : 0);
638-
};
639-
640-
var request = {
641-
collection: collection,
642-
navigationProperty: '$count'
643-
};
626+
var request = {
627+
collection: collection
628+
};
644629

645-
_makeRequest('GET', request, 'count', onSuccess, errorCallback);
630+
if (filter == null || (filter != null && !filter.length)) {
631+
request.navigationProperty = '$count';
646632
}
647633
else {
648-
this.retrieveMultipleRequest({
649-
collection: collection,
650-
filter: filter,
651-
count: true
652-
}, function (response) {
653-
successCallback(response.oDataCount ? response.oDataCount : 0);
654-
}, errorCallback);
634+
request.filter = filter;
635+
request.count = true;
655636
}
637+
638+
var onSuccess = function (response) {
639+
successCallback(response.data);
640+
};
641+
642+
_makeRequest('GET', request, 'count', onSuccess, errorCallback, { toCount: request.count });
656643
};
657644

658645
/**
@@ -722,14 +709,7 @@ function DynamicsWebApi(config) {
722709
request.url = nextPageLink;
723710
}
724711

725-
//copy locally
726-
var toCount = request.count;
727-
728712
var onSuccess = function (response) {
729-
if (toCount) {
730-
response.data.oDataCount = response.data.oDataCount || 0;
731-
}
732-
733713
successCallback(response.data);
734714
};
735715

lib/dynamics-web-api.js

Lines changed: 24 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,10 @@ function DynamicsWebApi(config) {
175175

176176
this.setConfig(config);
177177

178-
var _makeRequest = function (method, request, functionName) {
178+
var _makeRequest = function (method, request, functionName, responseParams) {
179179
request.isBatch = _isBatch;
180180
return new Promise(function (resolve, reject) {
181-
Request.makeRequest(method, request, functionName, _internalConfig, resolve, reject);
181+
Request.makeRequest(method, request, functionName, _internalConfig, responseParams, resolve, reject);
182182
});
183183
};
184184

@@ -210,15 +210,7 @@ function DynamicsWebApi(config) {
210210

211211
return _makeRequest('POST', request, 'create')
212212
.then(function (response) {
213-
if (response.data) {
214-
return response.data;
215-
}
216-
217-
var entityUrl = response.headers['OData-EntityId']
218-
? response.headers['OData-EntityId']
219-
: response.headers['odata-entityid'];
220-
var id = /([0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12})\)$/i.exec(entityUrl)[1];
221-
return id;
213+
return response.data;
222214
});
223215
};
224216

@@ -288,11 +280,11 @@ function DynamicsWebApi(config) {
288280
ErrorHelper.parameterCheck(request, 'DynamicsWebApi.retrieve', 'request');
289281

290282
//copy locally
291-
var select = request.select;
292-
return _makeRequest('GET', request, 'retrieve').then(function (response) {
293-
if (select != null && select.length === 1 && select[0].endsWith("/$ref") && response.data["@odata.id"] != null) {
294-
return Utility.convertToReferenceObject(response.data);
295-
}
283+
var isRef = request.select != null && request.select.length === 1 && request.select[0].endsWith("/$ref");
284+
return _makeRequest('GET', request, 'retrieve', { isRef: isRef }).then(function (response) {
285+
//if (select != null && select.length === 1 && select[0].endsWith("/$ref") && response.data["@odata.id"] != null) {
286+
// return Utility.convertToReferenceObject(response.data);
287+
//}
296288

297289
return response.data;
298290
});
@@ -347,7 +339,7 @@ function DynamicsWebApi(config) {
347339

348340
//Metadata definitions, cannot be updated using "PATCH" method
349341
var method = /EntityDefinitions|RelationshipDefinitions|GlobalOptionSetDefinitions/.test(request.collection)
350-
? 'PUT' : 'PATCH';
342+
? 'PUT' : 'PATCH';
351343

352344
//copy locally
353345
var ifmatch = request.ifmatch;
@@ -515,16 +507,7 @@ function DynamicsWebApi(config) {
515507
var ifmatch = request.ifmatch;
516508
return _makeRequest("PATCH", request, 'upsert')
517509
.then(function (response) {
518-
if (response.headers['OData-EntityId'] || response.headers['odata-entityid']) {
519-
var entityUrl = response.headers['OData-EntityId']
520-
? response.headers['OData-EntityId']
521-
: response.headers['odata-entityid'];
522-
var id = /[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}/i.exec(entityUrl)[0];
523-
return id;
524-
}
525-
else if (response.data) {
526-
return response.data;
527-
}
510+
return response.data;
528511
}).catch(function (error) {
529512
if (ifnonematch && error.status === 412) {
530513
//if prevent update
@@ -583,16 +566,8 @@ function DynamicsWebApi(config) {
583566
request.url = nextPageLink;
584567
}
585568

586-
//copy locally
587-
var toCount = request.count;
588-
589569
return _makeRequest("GET", request, 'retrieveMultiple')
590570
.then(function (response) {
591-
592-
if (toCount) {
593-
response.data.oDataCount = response.data.oDataCount || 0;
594-
}
595-
596571
return response.data;
597572
});
598573
};
@@ -638,29 +613,23 @@ function DynamicsWebApi(config) {
638613
* @returns {Promise} D365 Web Api result
639614
*/
640615
this.count = function (collection, filter) {
616+
var request = {
617+
collection: collection
618+
};
619+
641620
if (filter == null || (filter != null && !filter.length)) {
642-
var request = {
643-
collection: collection,
644-
navigationProperty: '$count'
645-
};
646-
//if filter has not been specified then simplify the request
647-
return _makeRequest('GET', request, 'count')
648-
.then(function (response) {
649-
return response.data ? parseInt(response.data) : 0;
650-
});
621+
request.navigationProperty = '$count';
651622
}
652623
else {
653-
return this.retrieveMultipleRequest({
654-
collection: collection,
655-
filter: filter,
656-
count: true
657-
}, null)
658-
.then(function (response) {
659-
/// <param name="response" type="DWA.Types.MultipleResponse">Request response</param>
660-
661-
return response.oDataCount ? response.oDataCount : 0;
662-
});
624+
request.filter = filter;
625+
request.count = true;
663626
}
627+
628+
//if filter has not been specified then simplify the request
629+
return _makeRequest('GET', request, 'count', { toCount: request.count })
630+
.then(function (response) {
631+
return response.data;
632+
});
664633
};
665634

666635
/**
@@ -1015,7 +984,7 @@ function DynamicsWebApi(config) {
1015984
}
1016985
};
1017986

1018-
987+
1019988
return _makeRequest("POST", request, 'executeAction').then(onSuccess);
1020989
};
1021990

lib/requests/helpers/parseResponse.js

Lines changed: 64 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var DWA = require('../../dwa');
2+
var Utility = require('../../utilities/Utility');
23
var dateReviver = require('./dateReviver');
34

45
//string es6 polyfill
@@ -38,7 +39,23 @@ function getFormattedKeyValue(keyName, value) {
3839
return [newKey, value];
3940
}
4041

41-
function parseData(object) {
42+
/**
43+
*
44+
* @param {any} object - parsed JSON object
45+
* @param {any} parseParams - parameters for parsing the response
46+
* @returns {any} parsed batch response
47+
*/
48+
function parseData(object, parseParams) {
49+
if (parseParams) {
50+
if (parseParams.isRef && object["@odata.id"] != null) {
51+
return Utility.convertToReferenceObject(object);
52+
}
53+
54+
if (parseParams.toCount) {
55+
return getFormattedKeyValue('@odata.count', object['@odata.count'])[1] || 0;
56+
}
57+
}
58+
4259
var keys = Object.keys(object);
4360

4461
for (var i = 0; i < keys.length; i++) {
@@ -84,7 +101,14 @@ function parseData(object) {
84101
}
85102

86103
//partially taken from https://github.com/emiltholin/google-api-batch-utils
87-
function parseBatchResponse(response) {
104+
/**
105+
*
106+
* @param {string} response - response that needs to be parsed
107+
* @param {Array} parseParams - parameters for parsing the response
108+
* @param {Number} [requestNumber] - number of the request
109+
* @returns {any} parsed batch response
110+
*/
111+
function parseBatchResponse(response, parseParams, requestNumber) {
88112
// Not the same delimiter in the response as we specify ourselves in the request,
89113
// so we have to extract it.
90114
var delimiter = response.substr(0, response.indexOf('\r\n'));
@@ -94,6 +118,8 @@ function parseBatchResponse(response) {
94118
// The last part will be the "--". Just remove it.
95119
batchResponseParts.pop();
96120

121+
requestNumber = requestNumber || 0;
122+
97123
var result = [];
98124
for (var i = 0; i < batchResponseParts.length; i++) {
99125
var batchResponse = batchResponseParts[i];
@@ -102,32 +128,62 @@ function parseBatchResponse(response) {
102128
var batchToProcess = batchResponse
103129
.substring(batchResponse.indexOf('\r\n') + 1).trim();
104130

105-
result = result.concat(parseBatchResponse(batchToProcess));
131+
result = result.concat(parseBatchResponse(batchToProcess, requestNumber));
106132
}
107133
else {
108134
var responseData = batchResponse.substring(batchResponse.indexOf("{"), batchResponse.lastIndexOf("}") + 1);
109-
result.push(parseData(JSON.parse(responseData, dateReviver)));
135+
136+
if (!responseData) {
137+
var entityUrl = /OData-EntityId.+/i.exec(responseData);
138+
139+
if (entityUrl.length) {
140+
result.push(/([0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12})\)$/i.exec(entityUrl[0])[1]);
141+
}
142+
}
143+
else {
144+
result.push(parseData(JSON.parse(responseData, dateReviver), parseParams[requestNumber]));
145+
}
110146
}
147+
148+
requestNumber++;
111149
}
150+
112151
return result;
113152
}
114153

115154
/**
116155
*
117156
* @param {string} response - response that needs to be parsed
157+
* @param {Array} responseHeaders - response headers
158+
* @param {Array} parseParams - parameters for parsing the response
118159
* @returns {any} parsed response
119160
*/
120-
module.exports = function parseResponse(response, convertedToBatch) {
161+
module.exports = function parseResponse(response, responseHeaders, parseParams) {
162+
var parseResult = undefined;
163+
121164
if (response.length) {
122165
if (response.indexOf('--batchresponse_') > -1) {
123-
var batch = parseBatchResponse(response);
166+
var batch = parseBatchResponse(response, parseParams);
124167

125-
return convertedToBatch
168+
parseResult = parseParams.length === 1 && parseParams[0].convertedToBatch
126169
? batch[0]
127170
: batch;
128171
}
129172
else {
130-
return parseData(JSON.parse(response, dateReviver));
173+
parseResult = parseData(JSON.parse(response, dateReviver), parseParams[0]);
174+
}
175+
}
176+
else {
177+
if (responseHeaders['OData-EntityId'] || responseHeaders['odata-entityid']) {
178+
var entityUrl = responseHeaders['OData-EntityId']
179+
? responseHeaders['OData-EntityId']
180+
: responseHeaders['odata-entityid'];
181+
parseResult = /([0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12})\)$/i.exec(entityUrl)[1];
131182
}
132183
}
184+
185+
//clear response parse parameters array
186+
parseParams.length = 0;
187+
188+
return parseResult;
133189
};

lib/requests/http.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ var parseResponse = require('./helpers/parseResponse');
88
*
99
* @param {string} method - Method of the request.
1010
* @param {string} uri - Request URI.
11+
* @param {any} responseParams - parameters for parsing the response
1112
* @param {Function} successCallback - A callback called on success of the request.
1213
* @param {Function} errorCallback - A callback called when a request failed.
1314
* @param {string} [data] - Data to send in the request.
1415
* @param {Object} [additionalHeaders] - Additional headers. IMPORTANT! This object does not contain default headers needed for every request.
1516
*/
16-
var httpRequest = function (method, uri, data, additionalHeaders, successCallback, errorCallback, async, convertedToBatch) {
17+
var httpRequest = function (method, uri, data, additionalHeaders, responseParams, successCallback, errorCallback) {
1718
var headers = {};
1819

1920
if (data) {
@@ -53,7 +54,7 @@ var httpRequest = function (method, uri, data, additionalHeaders, successCallbac
5354
case 201: // Success with content returned in response body.
5455
case 204: // Success with no content returned in response body.
5556
case 304: {// Success with Not Modified
56-
var responseData = parseResponse(rawData, convertedToBatch);
57+
var responseData = parseResponse(rawData, res.headers, responseParams);
5758

5859
var response = {
5960
data: responseData,

0 commit comments

Comments
 (0)