Skip to content

Commit 449e287

Browse files
Include @odata.deltaLink in retreiveAllRequest, closes #57
1 parent 4bb04e0 commit 449e287

File tree

7 files changed

+119
-15
lines changed

7 files changed

+119
-15
lines changed

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ savedQuery | String | `retrieveRequest` | A String representing the GUID value o
257257
select | Array | `retrieveRequest`, `retrieveMultipleRequest`, `retrieveAllRequest`, `updateRequest`, `upsertRequest` | An Array (of Strings) representing the $select OData System Query Option to control which attributes will be returned.
258258
token | String | All | Authorization Token. If set, onTokenRefresh will not be called.
259259
top | Number | `retrieveMultipleRequest`, `retrieveAllRequest` | Limit the number of results returned by using the $top system query option. Do not use $top with $count!
260-
trackChanges | Boolean | `retrieveMultipleRequest` | `v.1.5.11+` Sets Prefer header with value 'odata.track-changes' to request that a delta link be returned which can subsequently be used to retrieve entity changes. __Important!__ Change Tracking must be enabled for the entity. [More Info](https://docs.microsoft.com/en-us/powerapps/developer/common-data-service/use-change-tracking-synchronize-data-external-systems#enable-change-tracking-for-an-entity)
260+
trackChanges | Boolean | `retrieveMultipleRequest`, `retrieveAllRequest` | `v.1.5.11+` Sets Prefer header with value 'odata.track-changes' to request that a delta link be returned which can subsequently be used to retrieve entity changes. __Important!__ Change Tracking must be enabled for the entity. [More Info](https://docs.microsoft.com/en-us/powerapps/developer/common-data-service/use-change-tracking-synchronize-data-external-systems#enable-change-tracking-for-an-entity)
261261
userQuery | String | `retrieveRequest` | A String representing the GUID value of the user query.
262262

263263
Basic and Advanced functions also have differences in `expand` parameters. For Basic ones this parameter is a type of String
@@ -665,24 +665,24 @@ dynamicsWebApi.retrieveMultipleRequest(request).then(function (response) {
665665
var request = {
666666
collection: "leads",
667667
select: ["fullname", "subject"],
668-
trackChanges: true
668+
trackChanges: true
669669
};
670670

671671
//perform a multiple records retrieve operation (1)
672672
dynamicsWebApi.retrieveMultipleRequest(request).then(function (response) {
673673

674674
var deltaLink = response.oDataDeltaLink;
675675
//make other requests to Web API
676-
//...
676+
//...
677677

678-
//(2) only retrieve changes:
679-
return dynamicsWebApi.retrieveMultipleRequest(request, response.oDataDeltaLink);
678+
//(2) only retrieve changes:
679+
return dynamicsWebApi.retrieveMultipleRequest(request, response.oDataDeltaLink);
680680
})
681681
.then(function (response) {
682-
//here you will get changes between the first retrieveMultipleRequest (1) and the second one (2)
682+
//here you will get changes between the first retrieveMultipleRequest (1) and the second one (2)
683683
})
684684
.catch(function (error){
685-
//catch an error
685+
//catch an error
686686
});
687687
```
688688

lib/dynamics-web-api-callbacks.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -740,11 +740,20 @@ function DynamicsWebApi(config) {
740740
var internalSuccessCallback = function (response) {
741741
records = records.concat(response.value);
742742

743-
if (response.oDataNextLink) {
744-
_retrieveAllRequest(request, successCallback, errorCallback, response.oDataNextLink, records);
743+
var pageLink = response.oDataNextLink;
744+
745+
if (pageLink) {
746+
_retrieveAllRequest(request, successCallback, errorCallback, pageLink, records);
745747
}
746748
else {
747-
successCallback({ value: records });
749+
var result = { value: records };
750+
751+
if (response.oDataDeltaLink) {
752+
result["@odata.deltaLink"] = response.oDataDeltaLink;
753+
result.oDataDeltaLink = response.oDataDeltaLink;
754+
}
755+
756+
successCallback(result);
748757
}
749758
};
750759

lib/dynamics-web-api.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -584,11 +584,20 @@ function DynamicsWebApi(config) {
584584
return retrieveMultipleRequest(request, nextPageLink).then(function (response) {
585585
records = records.concat(response.value);
586586

587-
if (response.oDataNextLink) {
588-
return _retrieveAllRequest(request, response.oDataNextLink, records);
587+
var pageLink = response.oDataNextLink;
588+
589+
if (pageLink) {
590+
return _retrieveAllRequest(request, pageLink, records);
589591
}
590592

591-
return { value: records };
593+
var result = { value: records };
594+
595+
if (response.oDataDeltaLink) {
596+
result["@odata.deltaLink"] = response.oDataDeltaLink;
597+
result.oDataDeltaLink = response.oDataDeltaLink;
598+
}
599+
600+
return result;
592601
});
593602
};
594603

tests/callbacks-tests.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2511,6 +2511,49 @@ describe("callbacks -", function () {
25112511
expect(scope2.isDone()).to.be.true;
25122512
});
25132513
});
2514+
2515+
describe("multiple pages - delta link", function () {
2516+
var scope;
2517+
var scope2;
2518+
before(function () {
2519+
var response = mocks.responses.multipleWithLinkResponse;
2520+
var response2 = mocks.responses.multipleWithDeltaLinkResponse;
2521+
var linkQuery = mocks.responses.multipleWithLink().oDataNextLink.split('?');
2522+
var link = linkQuery[0].split('/');
2523+
var getLink = `/${link.pop()}?${linkQuery[1]}`;
2524+
2525+
scope = nock(mocks.webApiUrl)
2526+
.get(mocks.responses.collectionUrl + "?$select=name")
2527+
.reply(response.status, response.responseText, response.responseHeaders);
2528+
scope2 = nock(link.join('/'))
2529+
.get(getLink)
2530+
.reply(response2.status, response2.responseText, response2.responseHeaders);
2531+
});
2532+
2533+
after(function () {
2534+
nock.cleanAll();
2535+
});
2536+
2537+
it("returns a correct response", function (done) {
2538+
dynamicsWebApiTest.retrieveAll("tests", function (object) {
2539+
var multipleResponse = mocks.responses.multiple();
2540+
var checkResponse = { value: multipleResponse.value.concat(multipleResponse.value) };
2541+
checkResponse["@odata.deltaLink"] = mocks.responses.multipleWithDeltaLink()["@odata.deltaLink"];
2542+
checkResponse.oDataDeltaLink = mocks.responses.multipleWithDeltaLink()["@odata.deltaLink"];
2543+
2544+
expect(object).to.deep.equal(checkResponse);
2545+
done();
2546+
}, function (object) {
2547+
expect(object).to.be.undefined;
2548+
done(object);
2549+
}, ["name"]);
2550+
});
2551+
2552+
it("all requests have been made", function () {
2553+
expect(scope.isDone()).to.be.true;
2554+
expect(scope2.isDone()).to.be.true;
2555+
});
2556+
});
25142557
});
25152558

25162559
describe("dynamicsWebApi.retrieveMultipleRequest -", function () {

tests/main-tests.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2530,6 +2530,49 @@ describe("promises -", function () {
25302530
expect(scope2.isDone()).to.be.true;
25312531
});
25322532
});
2533+
2534+
describe("multiple pages - delta link", function () {
2535+
var scope;
2536+
var scope2;
2537+
before(function () {
2538+
var response = mocks.responses.multipleWithLinkResponse;
2539+
var response2 = mocks.responses.multipleWithDeltaLinkResponse;
2540+
var linkQuery = mocks.responses.multipleWithLink().oDataNextLink.split('?');
2541+
var link = linkQuery[0].split('/');
2542+
var getLink = `/${link.pop()}?${linkQuery[1]}`;
2543+
2544+
scope = nock(mocks.webApiUrl)
2545+
.get(mocks.responses.collectionUrl + "?$select=name")
2546+
.reply(response.status, response.responseText, response.responseHeaders);
2547+
scope2 = nock(link.join('/'))
2548+
.get(getLink)
2549+
.reply(response2.status, response2.responseText, response2.responseHeaders);
2550+
});
2551+
2552+
after(function () {
2553+
nock.cleanAll();
2554+
});
2555+
2556+
it("returns a correct response", function (done) {
2557+
dynamicsWebApiTest.retrieveAll("tests", ["name"])
2558+
.then(function (object) {
2559+
var multipleResponse = mocks.responses.multiple();
2560+
var checkResponse = { value: multipleResponse.value.concat(multipleResponse.value) };
2561+
checkResponse["@odata.deltaLink"] = mocks.responses.multipleWithDeltaLink()["@odata.deltaLink"];
2562+
checkResponse.oDataDeltaLink = mocks.responses.multipleWithDeltaLink()["@odata.deltaLink"];
2563+
2564+
expect(object).to.deep.equal(checkResponse);
2565+
done();
2566+
}).catch(function (object) {
2567+
done(object);
2568+
});
2569+
});
2570+
2571+
it("all requests have been made", function () {
2572+
expect(scope.isDone()).to.be.true;
2573+
expect(scope2.isDone()).to.be.true;
2574+
});
2575+
});
25332576
});
25342577

25352578
describe("dynamicsWebApi.retrieveMultipleRequest -", function () {

types/dynamics-web-api-callbacks.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Type definitions for dynamics-web-api-callbacks v1.5.11
1+
// Type definitions for dynamics-web-api-callbacks v1.5.12
22
// Project: https://github.com/AleksandrRogov/DynamicsWebApi
33
// Definitions by: Aleksandr Rogov https://github.com/AleksandrRogov/
44

types/dynamics-web-api.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Type definitions for dynamics-web-api v1.5.11
1+
// Type definitions for dynamics-web-api v1.5.12
22
// Project: https://github.com/AleksandrRogov/DynamicsWebApi/
33
// Definitions by: Aleksandr Rogov https://github.com/AleksandrRogov/
44

0 commit comments

Comments
 (0)