@progress/sitefinity-webservices-sdk 0.2.72 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +4 -0
- package/.eslintrc.js +19 -0
- package/ci/pipelines/ci.yml +219 -0
- package/config/helpers.js +0 -6
- package/config/webpack.common.js +1 -3
- package/config/webpack.dev.js +2 -9
- package/config/webpack.prod.js +5 -6
- package/dist/docs/.nojekyll +1 -0
- package/dist/docs/assets/highlight.css +57 -0
- package/dist/docs/assets/icons.css +1043 -0
- package/dist/docs/assets/icons.png +0 -0
- package/dist/docs/assets/icons@2x.png +0 -0
- package/dist/docs/assets/main.js +52 -0
- package/dist/docs/assets/search.js +1 -0
- package/dist/docs/assets/style.css +1413 -0
- package/dist/docs/assets/{images/widgets.png → widgets.png} +0 -0
- package/dist/docs/assets/{images/widgets@2x.png → widgets@2x.png} +0 -0
- package/dist/docs/classes/BlobBuilder.BlobBuilder-1.html +7 -0
- package/dist/docs/classes/Data.Data-1.html +65 -0
- package/dist/docs/classes/Expression.BinaryExpression.html +1 -0
- package/dist/docs/classes/Expression.ComplexExpression.html +1 -0
- package/dist/docs/classes/Expression.ExpressionBase.html +1 -0
- package/dist/docs/classes/OrderProperty.OrderProperty-1.html +1 -0
- package/dist/docs/classes/Query.Query-1.html +33 -0
- package/dist/docs/classes/QueryBase.QueryBase-1.html +7 -0
- package/dist/docs/classes/QueryBuilder.QueryBuilder-1.html +1 -0
- package/dist/docs/classes/Requests_BatchRequest.BatchRequest.html +17 -0
- package/dist/docs/classes/Requests_BatchRequest.Transaction.html +17 -0
- package/dist/docs/classes/Requests_ExecutableRequest.ExecutableRequest.html +1 -0
- package/dist/docs/classes/Requests_Request.CreateRelatedRequest.html +1 -0
- package/dist/docs/classes/Requests_Request.CreateRequest.html +1 -0
- package/dist/docs/classes/Requests_Request.DeleteRelatedByIdRequest.html +1 -0
- package/dist/docs/classes/Requests_Request.DeleteRelatedRequest.html +1 -0
- package/dist/docs/classes/Requests_Request.DeleteRequest.html +1 -0
- package/dist/docs/classes/Requests_Request.GetByIdRequest.html +1 -0
- package/dist/docs/classes/Requests_Request.GetRelatedByIdRequest.html +1 -0
- package/dist/docs/classes/Requests_Request.GetRelatedRequest.html +1 -0
- package/dist/docs/classes/Requests_Request.GetRequest.html +1 -0
- package/dist/docs/classes/Requests_Request.UpdateRequest.html +1 -0
- package/dist/docs/classes/Requests_Request.UploadRequest.html +1 -0
- package/dist/docs/classes/Requests_RequestBase.RequestBase.html +1 -0
- package/dist/docs/classes/Requests_RequestFactory.RequestFactory.html +1 -0
- package/dist/docs/classes/Sitefinity.Sitefinity-1.html +5 -0
- package/dist/docs/classes/WhereQuery.WhereQuery-1.html +31 -0
- package/dist/docs/classes/utils.utils-1.html +1 -0
- package/dist/docs/index.html +54 -242
- package/dist/docs/interfaces/Data.CreateRelatedRequestOptions.html +1 -0
- package/dist/docs/interfaces/Data.CreateRequestOptions.html +1 -0
- package/dist/docs/interfaces/Data.OperationsRequestOptions.html +1 -0
- package/dist/docs/interfaces/Data.PropertyRequestOptions.html +1 -0
- package/dist/docs/interfaces/Data.RequestOptionsBase.html +1 -0
- package/dist/docs/interfaces/Data.SingleRelatedItemRequestOptions.html +1 -0
- package/dist/docs/interfaces/Data.UpdateRequestOptions.html +1 -0
- package/dist/docs/interfaces/Data.UploadRequestOptions.html +1 -0
- package/dist/docs/interfaces/Requests_BatchRequest.BatchCreateRelatedRequestOptions.html +1 -0
- package/dist/docs/interfaces/Requests_BatchRequest.BatchCreateRequestOptions.html +1 -0
- package/dist/docs/interfaces/Requests_BatchRequest.BatchPropertyRequestOptions.html +1 -0
- package/dist/docs/interfaces/Requests_BatchRequest.BatchRequestOptionsBase.html +1 -0
- package/dist/docs/interfaces/Requests_BatchRequest.BatchRequestOptionsExtended.html +1 -0
- package/dist/docs/interfaces/Requests_BatchRequest.BatchSingleItemRequestOptions.html +1 -0
- package/dist/docs/interfaces/Requests_BatchRequest.BatchSingleRelatedItemRequestOptions.html +1 -0
- package/dist/docs/interfaces/Requests_BatchRequest.BatchUpdateRequestOptions.html +1 -0
- package/dist/docs/interfaces/Requests_ExecutableRequest.ResponseHandlers.html +5 -0
- package/dist/docs/interfaces/Requests_Request.PostRequestOptionsExtended.html +1 -0
- package/dist/docs/interfaces/Requests_Request.PutRequestOptionsExtended.html +1 -0
- package/dist/docs/interfaces/Requests_Request.RelatedByIdRequestOptionsExtended.html +1 -0
- package/dist/docs/interfaces/Requests_Request.RelatedRequestOptionsExtended.html +1 -0
- package/dist/docs/interfaces/Requests_Request.UploadRequestOptionsExtended.html +1 -0
- package/dist/docs/interfaces/Requests_RequestBase.RequestOptionsBaseExtended.html +1 -0
- package/dist/docs/interfaces/Sitefinity.SDKOptions.html +9 -0
- package/dist/docs/interfaces/Sitefinity.Token.html +1 -0
- package/dist/docs/interfaces/Sitefinity.TypeOptions.html +13 -0
- package/dist/docs/modules/BlobBuilder.html +1 -0
- package/dist/docs/modules/Data.html +1 -0
- package/dist/docs/modules/Expression.html +1 -0
- package/dist/docs/modules/OrderProperty.html +1 -0
- package/dist/docs/modules/Query.html +1 -0
- package/dist/docs/modules/QueryBase.html +1 -0
- package/dist/docs/modules/QueryBuilder.html +1 -0
- package/dist/docs/modules/Requests_BatchRequest.html +1 -0
- package/dist/docs/modules/Requests_ExecutableRequest.html +1 -0
- package/dist/docs/modules/Requests_Request.html +1 -0
- package/dist/docs/modules/Requests_RequestBase.html +1 -0
- package/dist/docs/modules/Requests_RequestFactory.html +1 -0
- package/dist/docs/modules/Sitefinity.html +1 -0
- package/dist/docs/modules/WhereQuery.html +1 -0
- package/dist/docs/modules/constants.html +1 -0
- package/dist/docs/modules/utils.html +1 -0
- package/dist/docs/modules.html +1 -0
- package/dist/samples.html +33 -81
- package/dist/sitefinity-webservices-sdk.d.ts +16 -0
- package/dist/sitefinity-webservices-sdk.js +1159 -1734
- package/dist/sitefinity-webservices-sdk.js.map +1 -1
- package/dist/sitefinity-webservices-sdk.min.js +2 -16
- package/dist/sitefinity-webservices-sdk.min.js.LICENSE.txt +14 -0
- package/dist/src/BlobBuilder.d.ts +14 -0
- package/dist/src/Data.d.ts +144 -0
- package/dist/src/Expression.d.ts +19 -0
- package/dist/src/OrderProperty.d.ts +8 -0
- package/dist/src/Query.d.ts +59 -0
- package/dist/src/QueryBase.d.ts +18 -0
- package/dist/src/QueryBuilder.d.ts +13 -0
- package/dist/src/Requests/BatchRequest.d.ts +146 -0
- package/dist/src/Requests/ExecutableRequest.d.ts +20 -0
- package/dist/src/Requests/Request.d.ts +88 -0
- package/dist/src/Requests/RequestBase.d.ts +28 -0
- package/dist/src/Requests/RequestFactory.d.ts +22 -0
- package/dist/src/Sitefinity.d.ts +66 -0
- package/dist/src/WhereQuery.d.ts +68 -0
- package/dist/src/constants.d.ts +55 -0
- package/dist/src/utils.d.ts +16 -0
- package/karma.conf.js +29 -0
- package/package-lock.json +16108 -6805
- package/package.json +28 -10
- package/sitefinity-webservices-sdk.ts +16 -0
- package/src/BlobBuilder.ts +7 -12
- package/src/Data.spec.ts +160 -0
- package/src/Data.ts +132 -207
- package/src/Expression.ts +6 -3
- package/src/OrderProperty.ts +4 -5
- package/src/Query.ts +52 -78
- package/src/QueryBase.ts +21 -47
- package/src/QueryBuilder.ts +76 -82
- package/src/Requests/BatchRequest.ts +312 -335
- package/src/Requests/ExecutableRequest.ts +46 -73
- package/src/Requests/Request.ts +134 -260
- package/src/Requests/RequestBase.ts +161 -0
- package/src/Requests/RequestFactory.ts +36 -54
- package/src/Requests/request.spec.ts +92 -0
- package/src/Sitefinity.spec.ts +418 -0
- package/src/Sitefinity.ts +77 -146
- package/src/WhereQuery.ts +55 -112
- package/src/constants.ts +58 -39
- package/src/utils.ts +17 -14
- package/template.html +33 -35
- package/tsconfig.json +8 -1
- package/type.txt +1 -1
- package/version.txt +1 -1
- package/config/html.conf.json +0 -5
- package/dist/docs/assets/css/main.css +0 -865
- package/dist/docs/assets/css/main.css.map +0 -7
- package/dist/docs/assets/images/icons.png +0 -0
- package/dist/docs/assets/images/icons@2x.png +0 -0
- package/dist/docs/assets/js/main.js +0 -5
- package/dist/docs/assets/js/search.js +0 -3
- package/dist/docs/classes/_authentication_.authentication.html +0 -527
- package/dist/docs/classes/_blobbuilder_.blobbuilder.html +0 -351
- package/dist/docs/classes/_data_.data.html +0 -974
- package/dist/docs/classes/_expression_.binaryexpression.html +0 -412
- package/dist/docs/classes/_expression_.complexexpression.html +0 -374
- package/dist/docs/classes/_expression_.expressionbase.html +0 -336
- package/dist/docs/classes/_orderproperty_.orderproperty.html +0 -381
- package/dist/docs/classes/_query_.query.html +0 -896
- package/dist/docs/classes/_querybase_.querybase.html +0 -518
- package/dist/docs/classes/_querybuilder_.querybuilder.html +0 -466
- package/dist/docs/classes/_requests_batchrequest_.batchrequest.html +0 -1511
- package/dist/docs/classes/_requests_batchrequest_.transaction.html +0 -804
- package/dist/docs/classes/_requests_executablerequest_.executablerequest.html +0 -549
- package/dist/docs/classes/_requests_request_.createrelatedrequest.html +0 -689
- package/dist/docs/classes/_requests_request_.createrequest.html +0 -680
- package/dist/docs/classes/_requests_request_.deleterelatedbyidrequest.html +0 -687
- package/dist/docs/classes/_requests_request_.deleterelatedrequest.html +0 -673
- package/dist/docs/classes/_requests_request_.deleterequest.html +0 -666
- package/dist/docs/classes/_requests_request_.getbyidrequest.html +0 -666
- package/dist/docs/classes/_requests_request_.getrelatedbyidrequest.html +0 -687
- package/dist/docs/classes/_requests_request_.getrelatedrequest.html +0 -673
- package/dist/docs/classes/_requests_request_.getrequest.html +0 -658
- package/dist/docs/classes/_requests_request_.requestbase.html +0 -687
- package/dist/docs/classes/_requests_request_.updaterequest.html +0 -686
- package/dist/docs/classes/_requests_request_.uploadrequest.html +0 -715
- package/dist/docs/classes/_requests_requestfactory_.requestfactory.html +0 -724
- package/dist/docs/classes/_sitefinity_.sitefinity.html +0 -521
- package/dist/docs/classes/_utils_.utils.html +0 -597
- package/dist/docs/classes/_wherequery_.wherequery.html +0 -971
- package/dist/docs/globals.html +0 -238
- package/dist/docs/modules/_authentication_.html +0 -225
- package/dist/docs/modules/_blobbuilder_.html +0 -225
- package/dist/docs/modules/_constants_.html +0 -528
- package/dist/docs/modules/_contenttypes_.html +0 -248
- package/dist/docs/modules/_data_.html +0 -225
- package/dist/docs/modules/_expression_.html +0 -233
- package/dist/docs/modules/_headers_.html +0 -328
- package/dist/docs/modules/_httpmethods_.html +0 -288
- package/dist/docs/modules/_main_.html +0 -209
- package/dist/docs/modules/_orderproperty_.html +0 -225
- package/dist/docs/modules/_query_.html +0 -225
- package/dist/docs/modules/_querybase_.html +0 -225
- package/dist/docs/modules/_querybuilder_.html +0 -247
- package/dist/docs/modules/_requests_batchrequest_.html +0 -265
- package/dist/docs/modules/_requests_executablerequest_.html +0 -296
- package/dist/docs/modules/_requests_request_.html +0 -333
- package/dist/docs/modules/_requests_requestfactory_.html +0 -247
- package/dist/docs/modules/_sitefinity_.html +0 -225
- package/dist/docs/modules/_utils_.html +0 -225
- package/dist/docs/modules/_wherequery_.html +0 -247
- package/dist/index.html +0 -474
- package/src/Authentication.ts +0 -96
- package/src/ContentTypes.ts +0 -5
- package/src/Headers.ts +0 -12
- package/src/HttpMethods.ts +0 -9
- package/src/main.ts +0 -2
|
@@ -1,261 +1,226 @@
|
|
|
1
1
|
import { RequestFactory } from "./RequestFactory";
|
|
2
|
-
import { RequestBase } from './Request';
|
|
3
2
|
import { BlobBuilder } from '../BlobBuilder';
|
|
4
3
|
import { utils } from '../utils';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
import { HEADER_NAMES, HTTP_METHODS } from "../constants";
|
|
5
|
+
import { ExecutableRequest } from "./ExecutableRequest";
|
|
6
|
+
import { SDKOptions, Token, TypeOptions } from "../Sitefinity";
|
|
7
|
+
import { RequestBase, RequestOptionsBaseExtended } from "./RequestBase";
|
|
8
|
+
import { CreateRelatedRequestOptions, RequestOptionsBase, PropertyRequestOptions, SingleRelatedItemRequestOptions, CreateRequestOptions, UpdateRequestOptions } from "../Data";
|
|
9
|
+
import { PostRequestOptionsExtended, PutRequestOptionsExtended, RelatedByIdRequestOptionsExtended, RelatedRequestOptionsExtended, UploadRequestOptionsExtended } from "./Request";
|
|
10
|
+
import { Query } from "../Query";
|
|
8
11
|
|
|
9
12
|
/**
|
|
10
|
-
*
|
|
11
|
-
* @class Transaction
|
|
12
|
-
* @param {object} urlOptions - The url options that are passed to the {@link _factory} object.
|
|
13
|
-
* @param {object} _factory - The factory object used for request generation.
|
|
13
|
+
* The transaction class is used to group operations that involve data manipulation together and execute them as a single atomic operation.
|
|
14
14
|
*/
|
|
15
|
-
class Transaction {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
constructor(urlOptions,
|
|
15
|
+
export class Transaction {
|
|
16
|
+
id: number;
|
|
17
|
+
counter: number;
|
|
18
|
+
requests: TransactionRequest[];
|
|
19
|
+
private urlOptions: TypeOptions;
|
|
20
|
+
private factory: RequestFactory;
|
|
21
|
+
|
|
22
|
+
constructor(urlOptions: TypeOptions, factory: RequestFactory) {
|
|
23
23
|
this.urlOptions = urlOptions;
|
|
24
|
-
this.
|
|
25
|
-
this.
|
|
26
|
-
this.
|
|
24
|
+
this.factory = factory;
|
|
25
|
+
this.requests = [];
|
|
26
|
+
this.counter = 0;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
upload(parameters: any) {
|
|
30
|
-
|
|
29
|
+
upload(parameters: any): number {
|
|
30
|
+
const urlOptions = this.urlParametersClone(parameters.entitySet);
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
const options: UploadRequestOptionsExtended = {
|
|
33
33
|
urlOptions: urlOptions,
|
|
34
34
|
data: parameters.data,
|
|
35
35
|
contentType: parameters.contentType,
|
|
36
36
|
fileName: parameters.fileName,
|
|
37
37
|
key: parameters.key,
|
|
38
|
-
uploadProperties:
|
|
38
|
+
uploadProperties: parameters.uploadProperties
|
|
39
39
|
};
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
const request = this.factory.upload(options);
|
|
42
42
|
|
|
43
|
-
return this.addRequest(
|
|
43
|
+
return this.addRequest(request);
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
/**
|
|
47
47
|
* Adds a POST request to create a single item.
|
|
48
|
-
* @memberOf Transaction
|
|
49
|
-
* @instance
|
|
50
|
-
* @param {object} parameters - The parameters for the request.
|
|
51
|
-
* @param {object} parameters.data - The payload of the request.
|
|
52
48
|
*/
|
|
53
|
-
create(parameters:
|
|
49
|
+
create(parameters: BatchCreateRequestOptions) {
|
|
54
50
|
if (!(parameters || parameters.entitySet))
|
|
55
51
|
throw "entitySet is required!";
|
|
56
52
|
|
|
57
|
-
|
|
53
|
+
const urlOptions = this.urlParametersClone(parameters.entitySet);
|
|
58
54
|
|
|
59
|
-
|
|
55
|
+
const options: PostRequestOptionsExtended = {
|
|
60
56
|
key: parameters.key,
|
|
61
57
|
action: parameters.action,
|
|
62
58
|
urlOptions: urlOptions,
|
|
63
|
-
data:
|
|
59
|
+
data: parameters.data
|
|
64
60
|
};
|
|
65
61
|
|
|
66
|
-
|
|
62
|
+
const request = this.factory.create(options);
|
|
67
63
|
|
|
68
|
-
return this.addRequest(
|
|
64
|
+
return this.addRequest(request);
|
|
69
65
|
}
|
|
70
66
|
|
|
71
67
|
/**
|
|
72
68
|
* Adds a POST request to execute an operation on single item.
|
|
73
|
-
* @memberOf Transaction
|
|
74
|
-
* @instance
|
|
75
|
-
* @param {object} parameters - The parameters for the request.
|
|
76
|
-
* @param {string} parameters.key - The identifier of the item to be updated.
|
|
77
|
-
* @param {object} parameters.data - The payload of the request.
|
|
78
69
|
*/
|
|
79
|
-
|
|
70
|
+
// TODO: Remove
|
|
71
|
+
operation(parameters: BatchCreateRequestOptions) {
|
|
80
72
|
if (!(parameters || parameters.entitySet || parameters.key || parameters.data))
|
|
81
73
|
throw "parameters: entitySet, key and data are required!";
|
|
82
74
|
|
|
83
|
-
|
|
75
|
+
const urlOptions = this.urlParametersClone(parameters.entitySet);
|
|
84
76
|
|
|
85
|
-
|
|
77
|
+
const options: PostRequestOptionsExtended = {
|
|
86
78
|
urlOptions: urlOptions,
|
|
87
79
|
key: parameters.key,
|
|
88
80
|
action: 'operation',
|
|
89
|
-
data:
|
|
81
|
+
data: parameters.data
|
|
90
82
|
};
|
|
91
83
|
|
|
92
|
-
|
|
84
|
+
const request = this.factory.create(options);
|
|
93
85
|
|
|
94
|
-
this.
|
|
95
|
-
this.addRequest(
|
|
86
|
+
this.overrideUrlGeneration(request, parameters.key, 'operation', options.urlOptions, options.query);
|
|
87
|
+
this.addRequest(request);
|
|
96
88
|
}
|
|
97
89
|
|
|
98
90
|
/**
|
|
99
91
|
* Adds a PATCH request to update a single item.
|
|
100
|
-
* @memberOf Transaction
|
|
101
|
-
* @instance
|
|
102
|
-
* @param {object} parameters - The parameters for the request.
|
|
103
|
-
* @param {bool} parameters.saveTemp - A flag indicating whether to save in temp.
|
|
104
|
-
* @param {string} parameters.key - The identifier of the item to be updated.
|
|
105
|
-
* @param {object} parameters.data - The payload of the request.
|
|
106
92
|
*/
|
|
107
|
-
update(parameters:
|
|
93
|
+
update(parameters: BatchUpdateRequestOptions) {
|
|
108
94
|
if (!(parameters || parameters.entitySet || parameters.key || parameters.data))
|
|
109
95
|
throw "parameters: entitySet, key and data are required!";
|
|
110
96
|
|
|
111
|
-
|
|
97
|
+
const urlOptions = this.urlParametersClone(parameters.entitySet);
|
|
112
98
|
|
|
113
|
-
|
|
99
|
+
const options: PutRequestOptionsExtended = {
|
|
114
100
|
urlOptions: urlOptions,
|
|
115
101
|
saveTemp: parameters.saveTemp,
|
|
116
102
|
key: parameters.key,
|
|
117
|
-
data:
|
|
103
|
+
data: parameters.data
|
|
118
104
|
};
|
|
119
105
|
|
|
120
|
-
|
|
106
|
+
const request = this.factory.update(options);
|
|
121
107
|
|
|
122
|
-
this.
|
|
123
|
-
this.addRequest(
|
|
108
|
+
this.overrideUrlGeneration(request, parameters.key, undefined, options.urlOptions, options.query);
|
|
109
|
+
this.addRequest(request);
|
|
124
110
|
}
|
|
125
111
|
|
|
126
112
|
/**
|
|
127
113
|
* Adds a DELETE request to delete a single item.
|
|
128
|
-
* @memberOf Transaction
|
|
129
|
-
* @instance
|
|
130
|
-
* @param {object} parameters - The parameters for the request.
|
|
131
|
-
* @param {string} parameters.key - The identifier of the item to be deleted.
|
|
132
114
|
*/
|
|
133
|
-
destroy(parameters:
|
|
115
|
+
destroy(parameters: BatchSingleItemRequestOptions) {
|
|
134
116
|
if (!(parameters || parameters.entitySet || parameters.key))
|
|
135
117
|
throw "parameters: entitySet and key are required!";
|
|
136
118
|
|
|
137
|
-
|
|
119
|
+
const urlOptions = this.urlParametersClone(parameters.entitySet);
|
|
138
120
|
|
|
139
|
-
|
|
121
|
+
const options: RequestOptionsBaseExtended = {
|
|
140
122
|
urlOptions: urlOptions,
|
|
141
123
|
key: parameters.key
|
|
142
124
|
};
|
|
143
125
|
|
|
144
|
-
|
|
126
|
+
const request = this.factory.destroy(options);
|
|
145
127
|
|
|
146
|
-
this.
|
|
128
|
+
this.overrideUrlGeneration(request, parameters.key, undefined, options.urlOptions, options.query);
|
|
147
129
|
|
|
148
|
-
this.addRequest(
|
|
130
|
+
this.addRequest(request);
|
|
149
131
|
}
|
|
150
132
|
|
|
151
133
|
/**
|
|
152
|
-
* Adds a DELETE request to
|
|
153
|
-
* @memberOf Transaction
|
|
154
|
-
* @instance
|
|
155
|
-
* @param {object} parameters - The parameters for the request.
|
|
156
|
-
* @param {string} parameters.key - The identifier of the item.
|
|
157
|
-
* @param {string} parameters.navigationProperty - The name of the navigation property.
|
|
134
|
+
* Adds a DELETE request to delete all of the associated members in the relation property.
|
|
158
135
|
*/
|
|
159
|
-
destroyRelated(parameters:
|
|
136
|
+
destroyRelated(parameters: BatchPropertyRequestOptions) {
|
|
160
137
|
if (!(parameters || parameters.entitySet || parameters.key))
|
|
161
138
|
throw "parameters: entitySet and key are required!";
|
|
162
139
|
|
|
163
|
-
|
|
140
|
+
const urlOptions = this.urlParametersClone(parameters.entitySet);
|
|
164
141
|
|
|
165
|
-
|
|
142
|
+
const options: RelatedRequestOptionsExtended = {
|
|
166
143
|
urlOptions: urlOptions,
|
|
167
144
|
key: parameters.key,
|
|
168
|
-
|
|
145
|
+
property: parameters.property
|
|
169
146
|
};
|
|
170
147
|
|
|
171
|
-
|
|
148
|
+
const request = this.factory.destroyRelated(options);
|
|
172
149
|
|
|
173
|
-
|
|
174
|
-
this.
|
|
150
|
+
const propertyURL = (request as any).property + '/$ref';
|
|
151
|
+
this.overrideUrlGeneration(request, parameters.key, propertyURL, options.urlOptions, options.query);
|
|
175
152
|
|
|
176
|
-
this.addRequest(
|
|
153
|
+
this.addRequest(request);
|
|
177
154
|
}
|
|
178
155
|
|
|
179
156
|
/**
|
|
180
157
|
* Adds a DELETE request to retrieve the a single entry of the associated members in the relation property.
|
|
181
|
-
* @memberOf Transaction
|
|
182
|
-
* @instance
|
|
183
|
-
* @param {object} parameters - The parameters for the request.
|
|
184
|
-
* @param {string} parameters.key - The identifier of the item.
|
|
185
|
-
* @param {string} parameters.navigationProperty - The name of the navigation property.
|
|
186
|
-
* @param {string} parameters.relatedKey - The identifier of the related item.
|
|
187
158
|
*/
|
|
188
|
-
destroyRelatedById(parameters:
|
|
189
|
-
if (!(parameters || parameters.entitySet || parameters.key || parameters.
|
|
190
|
-
throw "parameters: entitySet, key,
|
|
159
|
+
destroyRelatedById(parameters: BatchSingleRelatedItemRequestOptions) {
|
|
160
|
+
if (!(parameters || parameters.entitySet || parameters.key || parameters.relatedId || parameters.property))
|
|
161
|
+
throw "parameters: entitySet, key, relatedId and property are required!";
|
|
191
162
|
|
|
192
|
-
|
|
163
|
+
const urlOptions = this.urlParametersClone(parameters.entitySet);
|
|
193
164
|
|
|
194
|
-
|
|
165
|
+
const options: RelatedByIdRequestOptionsExtended = {
|
|
195
166
|
urlOptions: urlOptions,
|
|
196
167
|
key: parameters.key,
|
|
197
|
-
|
|
198
|
-
|
|
168
|
+
relatedId: parameters.relatedId,
|
|
169
|
+
property: parameters.property
|
|
199
170
|
};
|
|
200
171
|
|
|
201
|
-
|
|
172
|
+
const request = this.factory.destroyRelatedById(options);
|
|
202
173
|
|
|
203
|
-
this.addRequest(
|
|
174
|
+
this.addRequest(request);
|
|
204
175
|
}
|
|
205
176
|
|
|
206
177
|
/**
|
|
207
178
|
* Adds a POST request to add a related item to the property collection.
|
|
208
|
-
* @memberOf Transaction
|
|
209
|
-
* @instance
|
|
210
|
-
* @see {@link Data.createRelated}
|
|
211
|
-
* @param {object} parameters - The parameters for the request.
|
|
212
|
-
* @param {string} parameters.key - The identifier of the item.
|
|
213
|
-
* @param {string} parameters.navigationProperty - The name of the navigation property
|
|
214
179
|
*/
|
|
215
|
-
createRelated(parameters:
|
|
216
|
-
if (!(parameters || parameters.entitySet || parameters.key || parameters.link || parameters.
|
|
217
|
-
throw "parameters: entitySet, key, link and
|
|
180
|
+
createRelated(parameters: BatchCreateRelatedRequestOptions) {
|
|
181
|
+
if (!(parameters || parameters.entitySet || parameters.key || parameters.link || parameters.property))
|
|
182
|
+
throw "parameters: entitySet, key, link and property are required!";
|
|
218
183
|
|
|
219
184
|
// TODO: rethink about the urls
|
|
220
|
-
|
|
185
|
+
const urlOptions = this.urlParametersClone(parameters.entitySet);
|
|
221
186
|
|
|
222
|
-
for (
|
|
223
|
-
if (this.
|
|
224
|
-
parameters.link = "$" + this.
|
|
187
|
+
for (let index = 0; index < this.requests.length; index += 1) {
|
|
188
|
+
if (this.requests[index].id == parameters.link) {
|
|
189
|
+
parameters.link = "$" + this.requests[index].id;
|
|
225
190
|
}
|
|
226
191
|
}
|
|
227
192
|
|
|
228
|
-
|
|
193
|
+
const data = {
|
|
229
194
|
'@odata.id': parameters.link
|
|
230
195
|
}
|
|
231
196
|
|
|
232
|
-
|
|
197
|
+
const options: RelatedRequestOptionsExtended = {
|
|
233
198
|
urlOptions: urlOptions,
|
|
234
199
|
key: parameters.key,
|
|
235
|
-
|
|
236
|
-
data:
|
|
200
|
+
property: parameters.property,
|
|
201
|
+
data: data
|
|
237
202
|
};
|
|
238
203
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
this.
|
|
204
|
+
const request = this.factory.createRelated(options);
|
|
205
|
+
const propertyURL = (request as any).property + '/$ref';
|
|
206
|
+
this.overrideUrlGeneration(request, parameters.key, propertyURL, options.urlOptions, options.query);
|
|
242
207
|
|
|
243
|
-
return this.addRequest(
|
|
208
|
+
return this.addRequest(request);
|
|
244
209
|
}
|
|
245
210
|
|
|
246
|
-
|
|
211
|
+
private overrideUrlGeneration(request: RequestBase, key: number | string, additionalPropertyURL: string, urlOptions?: TypeOptions, query?: Query) {
|
|
247
212
|
// TODO: match requests with Content-ID's!
|
|
248
|
-
// Content-ID's are the same as id's in
|
|
249
|
-
for (
|
|
250
|
-
if (this.
|
|
251
|
-
request.
|
|
252
|
-
|
|
213
|
+
// Content-ID's are the same as id's in requests.
|
|
214
|
+
for (let index = 0; index < this.requests.length; index += 1) {
|
|
215
|
+
if (this.requests[index].id == key) {
|
|
216
|
+
request.buildUrl = function () {
|
|
217
|
+
let uri = "$" + key;
|
|
253
218
|
if (additionalPropertyURL !== undefined) {
|
|
254
219
|
uri = uri + '/' + additionalPropertyURL;
|
|
255
220
|
}
|
|
256
221
|
|
|
257
|
-
if (
|
|
258
|
-
|
|
222
|
+
if (urlOptions) {
|
|
223
|
+
const queryString = request.getQueryString(urlOptions, query);
|
|
259
224
|
if (queryString) {
|
|
260
225
|
uri = uri + queryString;
|
|
261
226
|
}
|
|
@@ -267,13 +232,13 @@ class Transaction {
|
|
|
267
232
|
}
|
|
268
233
|
}
|
|
269
234
|
|
|
270
|
-
addRequest(
|
|
271
|
-
|
|
272
|
-
return
|
|
235
|
+
private addRequest(request: RequestBase) {
|
|
236
|
+
this.requests.push({ id: this.counter, request: request });
|
|
237
|
+
return this.counter++;
|
|
273
238
|
}
|
|
274
239
|
|
|
275
|
-
urlParametersClone(entitySet: string) {
|
|
276
|
-
|
|
240
|
+
private urlParametersClone(entitySet: string) {
|
|
241
|
+
const options = utils.clone(this.urlOptions);
|
|
277
242
|
options.entitySet = entitySet;
|
|
278
243
|
|
|
279
244
|
return options;
|
|
@@ -281,205 +246,173 @@ class Transaction {
|
|
|
281
246
|
}
|
|
282
247
|
|
|
283
248
|
/**
|
|
284
|
-
*
|
|
285
|
-
* @class BatchRequest
|
|
249
|
+
* The batch request class is used for grouping requests into a single batch request to execute on the server.
|
|
286
250
|
*/
|
|
287
|
-
class BatchRequest extends
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
private
|
|
291
|
-
private boundary:
|
|
251
|
+
export class BatchRequest extends ExecutableRequest {
|
|
252
|
+
counter: number;
|
|
253
|
+
requests: BatchInnerRequest[];
|
|
254
|
+
private factory: RequestFactory;
|
|
255
|
+
private boundary: string;
|
|
292
256
|
private responseHeaderRegex: RegExp;
|
|
293
257
|
private responseStatusRegex: RegExp;
|
|
258
|
+
|
|
259
|
+
|
|
294
260
|
public static constants = {
|
|
295
261
|
newLine: '\r\n'
|
|
296
262
|
};
|
|
297
263
|
|
|
298
|
-
constructor(
|
|
299
|
-
super(
|
|
300
|
-
this.
|
|
301
|
-
this.
|
|
302
|
-
this.
|
|
303
|
-
this.boundary = this.
|
|
264
|
+
constructor(requestOptions: BatchRequestOptionsExtended, token: Token, sdkOptions: SDKOptions) {
|
|
265
|
+
super(requestOptions, token, sdkOptions);
|
|
266
|
+
this.factory = requestOptions.factory;
|
|
267
|
+
this.requests = [];
|
|
268
|
+
this.counter = 0;
|
|
269
|
+
this.boundary = this.createBoundary("sf_batch_");
|
|
304
270
|
this.responseHeaderRegex = /^([^()<>@,;:\\"\/[\]?={} \t]+)\s?:\s?(.*)/;
|
|
305
271
|
this.responseStatusRegex = /^HTTP\/1\.\d (\d{3}) (.*)$/i;
|
|
306
272
|
}
|
|
307
273
|
|
|
308
274
|
/**
|
|
309
275
|
* Adds a GET request to retrieve a collection of items.
|
|
310
|
-
* @memberOf BatchRequest
|
|
311
|
-
* @instance
|
|
312
|
-
* @param {object} parameters - The parameters for the request.
|
|
313
|
-
* @param {object} parameters.query - The {@link WhereQuery} with which to filter the items
|
|
314
276
|
*/
|
|
315
|
-
get(parameters:
|
|
277
|
+
get(parameters: BatchRequestOptionsBase) {
|
|
316
278
|
if (!(parameters || parameters.entitySet))
|
|
317
279
|
throw "entitySet is required!";
|
|
318
280
|
|
|
319
|
-
|
|
320
|
-
if (parameters && parameters.query)
|
|
321
|
-
urlOptions.ODataParams = parameters.query;
|
|
281
|
+
const urlOptions = this.urlParametersClone(parameters.entitySet);
|
|
322
282
|
|
|
323
|
-
|
|
283
|
+
const options: RequestOptionsBaseExtended = {
|
|
324
284
|
urlOptions: urlOptions,
|
|
325
285
|
action: parameters.action,
|
|
326
|
-
|
|
286
|
+
query: parameters.query,
|
|
287
|
+
fallbackProperties: parameters.fallbackProperties
|
|
327
288
|
};
|
|
328
289
|
|
|
329
|
-
|
|
290
|
+
const request = this.factory.get(options);
|
|
330
291
|
|
|
331
292
|
this.addRequest(request);
|
|
332
293
|
}
|
|
333
294
|
|
|
334
295
|
/**
|
|
335
296
|
* Adds a GET request for the retrieval of a single item.
|
|
336
|
-
* @memberOf BatchRequest
|
|
337
|
-
* @instance
|
|
338
|
-
* @param {object} parameters - The parameters for the request.
|
|
339
|
-
* @param {object} parameters.query - The {@link QueryBase} object containing the OData query options that should be sent to the server.
|
|
340
|
-
* @param {string} parameters.key - The identifier of the item to be retrieved.
|
|
341
297
|
*/
|
|
342
|
-
getSingle(parameters:
|
|
298
|
+
getSingle(parameters: BatchSingleItemRequestOptions) {
|
|
343
299
|
if (!(parameters || parameters.entitySet || parameters.key))
|
|
344
300
|
throw "parameters: entitySet and key are required!";
|
|
345
301
|
|
|
346
|
-
|
|
302
|
+
const urlOptions = this.urlParametersClone(parameters.entitySet);
|
|
347
303
|
|
|
348
|
-
|
|
304
|
+
const options: RequestOptionsBaseExtended = {
|
|
349
305
|
urlOptions: urlOptions,
|
|
350
306
|
action: parameters.action,
|
|
351
|
-
key: parameters.key
|
|
307
|
+
key: parameters.key,
|
|
308
|
+
query: parameters.query
|
|
352
309
|
};
|
|
353
310
|
|
|
354
|
-
|
|
355
|
-
options.ODataParams = parameters.query;
|
|
356
|
-
|
|
357
|
-
var request = this._factory.getSingle(options);
|
|
311
|
+
const request = this.factory.getSingle(options);
|
|
358
312
|
|
|
359
313
|
this.addRequest(request);
|
|
360
314
|
}
|
|
361
315
|
|
|
362
316
|
/**
|
|
363
317
|
* Adds a GET request to get the property of a single item.
|
|
364
|
-
* @memberOf BatchRequest
|
|
365
|
-
* @instance
|
|
366
|
-
* @param {object} parameters - The parameters for the request.
|
|
367
|
-
* @param {string} parameters.key - The identifier of the item.
|
|
368
|
-
* @param {string} parameters.property - The name of the property to be retrieved.
|
|
369
318
|
*/
|
|
370
|
-
getProperty(parameters:
|
|
319
|
+
getProperty(parameters: BatchPropertyRequestOptions) {
|
|
371
320
|
if (!(parameters || parameters.entitySet || parameters.key, parameters.property))
|
|
372
321
|
throw "parameters: entitySet, key and property are required!";
|
|
373
322
|
|
|
374
|
-
|
|
323
|
+
const urlOptions = this.urlParametersClone(parameters.entitySet);
|
|
375
324
|
|
|
376
|
-
|
|
325
|
+
const options: RelatedRequestOptionsExtended = {
|
|
377
326
|
urlOptions: urlOptions,
|
|
378
327
|
key: parameters.key,
|
|
379
|
-
|
|
328
|
+
property: parameters.property
|
|
380
329
|
};
|
|
381
330
|
|
|
382
|
-
|
|
331
|
+
const request = this.factory.getProperty(options);
|
|
383
332
|
|
|
384
333
|
this.addRequest(request);
|
|
385
334
|
}
|
|
386
335
|
|
|
387
336
|
/**
|
|
388
337
|
* Adds a GET request to get the related property value of a single item.
|
|
389
|
-
* @memberOf BatchRequest
|
|
390
|
-
* @instance
|
|
391
|
-
* @param {object} parameters - The parameters for the request.
|
|
392
|
-
* @param {string} parameters.key - The identifier of the item.
|
|
393
|
-
* @param {string} parameters.navigationProperty - The name of the navigation property to be retrieved.
|
|
394
338
|
*/
|
|
395
|
-
getRelated(parameters:
|
|
396
|
-
if (!(parameters || parameters.entitySet || parameters.key || parameters.
|
|
397
|
-
throw "parameters: entitySet, key and
|
|
339
|
+
getRelated(parameters: BatchPropertyRequestOptions) {
|
|
340
|
+
if (!(parameters || parameters.entitySet || parameters.key || parameters.property))
|
|
341
|
+
throw "parameters: entitySet, key and property are required!";
|
|
398
342
|
|
|
399
|
-
|
|
343
|
+
const urlOptions = this.urlParametersClone(parameters.entitySet);
|
|
400
344
|
|
|
401
|
-
|
|
345
|
+
const options: RelatedRequestOptionsExtended = {
|
|
402
346
|
urlOptions: urlOptions,
|
|
403
347
|
key: parameters.key,
|
|
404
|
-
|
|
348
|
+
property: parameters.property
|
|
405
349
|
};
|
|
406
350
|
|
|
407
|
-
|
|
351
|
+
const request = this.factory.getRelated(options);
|
|
408
352
|
|
|
409
353
|
this.addRequest(request);
|
|
410
354
|
}
|
|
411
355
|
|
|
412
356
|
/**
|
|
413
357
|
* Adds a GET request to retrieve the related property value of a single item by the id of the related item.
|
|
414
|
-
* @memberOf BatchRequest
|
|
415
|
-
* @instance
|
|
416
|
-
* @param {object} parameters - The parameters for the request.
|
|
417
|
-
* @param {string} parameters.key - The identifier of the item.
|
|
418
|
-
* @param {string} parameters.navigationProperty - The name of the navigation property to be retrieved.
|
|
419
|
-
* @param {string} parameters.relatedKey - The identifier of the related item.
|
|
420
358
|
*/
|
|
421
|
-
getRelatedById(parameters:
|
|
422
|
-
if (!(parameters || parameters.entitySet || parameters.key || parameters.
|
|
423
|
-
throw "parameters: entitySet, key,
|
|
359
|
+
getRelatedById(parameters: BatchSingleRelatedItemRequestOptions) {
|
|
360
|
+
if (!(parameters || parameters.entitySet || parameters.key || parameters.relatedId || parameters.property))
|
|
361
|
+
throw "parameters: entitySet, key, relatedId and property are required!";
|
|
424
362
|
|
|
425
|
-
|
|
363
|
+
const urlOptions = this.urlParametersClone(parameters.entitySet);
|
|
426
364
|
|
|
427
|
-
|
|
365
|
+
const options: RelatedByIdRequestOptionsExtended = {
|
|
428
366
|
urlOptions: urlOptions,
|
|
429
367
|
key: parameters.key,
|
|
430
|
-
|
|
431
|
-
|
|
368
|
+
relatedId: parameters.relatedId,
|
|
369
|
+
property: parameters.property
|
|
432
370
|
};
|
|
433
371
|
|
|
434
|
-
|
|
372
|
+
const request = this.factory.getRelatedById(options);
|
|
435
373
|
|
|
436
374
|
this.addRequest(request);
|
|
437
375
|
}
|
|
438
376
|
|
|
439
377
|
/**
|
|
440
378
|
* Begins a transaction.
|
|
441
|
-
* @memberOf BatchRequest
|
|
442
|
-
* @instance
|
|
443
|
-
* @returns {@link Transaction}
|
|
444
379
|
*/
|
|
445
|
-
beginTransaction() {
|
|
446
|
-
|
|
447
|
-
const newTransaction = new Transaction(option, this.
|
|
448
|
-
newTransaction.id = ++this.
|
|
380
|
+
beginTransaction(): Transaction {
|
|
381
|
+
const option = utils.clone(this.urlOptions);
|
|
382
|
+
const newTransaction = new Transaction(option, this.factory);
|
|
383
|
+
newTransaction.id = ++this.counter;
|
|
449
384
|
return newTransaction;
|
|
450
385
|
}
|
|
451
386
|
|
|
452
387
|
/**
|
|
453
388
|
* Ends a transaction.
|
|
454
|
-
* @memberOf BatchRequest
|
|
455
|
-
* @instance
|
|
456
389
|
*/
|
|
457
|
-
endTransaction(transaction:
|
|
458
|
-
this.
|
|
390
|
+
endTransaction(transaction: Transaction) {
|
|
391
|
+
this.requests.push({
|
|
459
392
|
id: transaction.id,
|
|
460
393
|
request: transaction
|
|
461
394
|
});
|
|
462
395
|
}
|
|
463
396
|
|
|
464
|
-
|
|
465
|
-
return this.
|
|
397
|
+
getBody(): object {
|
|
398
|
+
return this.buildRequestBody();
|
|
466
399
|
}
|
|
467
400
|
|
|
468
|
-
|
|
469
|
-
return
|
|
401
|
+
getMethod(): string {
|
|
402
|
+
return HTTP_METHODS.post;
|
|
470
403
|
}
|
|
471
404
|
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
headers[
|
|
405
|
+
getHeaders(): { [key: string]: string } {
|
|
406
|
+
const contentType = "multipart/mixed; boundary=" + this.boundary;
|
|
407
|
+
const headers = { };
|
|
408
|
+
headers[HEADER_NAMES.contentType] = contentType;
|
|
476
409
|
|
|
477
410
|
return headers;
|
|
478
411
|
}
|
|
479
412
|
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
413
|
+
buildUrl(): string {
|
|
414
|
+
let url = this.urlOptions.baseUrl + "$batch";
|
|
415
|
+
const queryString = this.getQueryString(this.urlOptions, this.query);
|
|
483
416
|
|
|
484
417
|
if (queryString) {
|
|
485
418
|
url += queryString
|
|
@@ -488,53 +421,53 @@ class BatchRequest extends RequestBase {
|
|
|
488
421
|
return url;
|
|
489
422
|
}
|
|
490
423
|
|
|
491
|
-
|
|
492
|
-
|
|
424
|
+
protected parseResponse(http: XMLHttpRequest): any {
|
|
425
|
+
const context = {
|
|
493
426
|
position: 0,
|
|
494
427
|
boundaries: []
|
|
495
428
|
};
|
|
496
429
|
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
430
|
+
const pos = context.position;
|
|
431
|
+
const partHeaders = this.readHeaders(http.getAllResponseHeaders(), context);
|
|
432
|
+
const partContentType = this.contentType(partHeaders["content-type"]);
|
|
500
433
|
if (partContentType && partContentType.mediaType == "multipart/mixed") {
|
|
501
434
|
context.boundaries.push((partContentType.properties as any).boundary);
|
|
502
435
|
}
|
|
503
436
|
|
|
504
437
|
context.position = pos;
|
|
505
438
|
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
for (
|
|
439
|
+
const batchResponse = this.parseBatchResponse(http.responseText, context);
|
|
440
|
+
const responseParsed = [];
|
|
441
|
+
for (let i = 0; i < batchResponse.length; i++) {
|
|
509
442
|
try {
|
|
510
|
-
const currentRequest = this.
|
|
511
|
-
|
|
512
|
-
|
|
443
|
+
const currentRequest = this.requests[i];
|
|
444
|
+
let finalResult = null;
|
|
445
|
+
let key = null;
|
|
513
446
|
|
|
514
|
-
|
|
515
|
-
|
|
447
|
+
const singleResponse = batchResponse[i];
|
|
448
|
+
const changesets = singleResponse.__changeResponses;
|
|
516
449
|
if (changesets) {
|
|
517
450
|
finalResult = [];
|
|
518
|
-
const currentRequests = currentRequest ? currentRequest.request.
|
|
451
|
+
const currentRequests = currentRequest ? (currentRequest.request as Transaction).requests : [];
|
|
519
452
|
|
|
520
|
-
for (
|
|
521
|
-
key = currentRequests[j] ? currentRequests[j].request.
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
453
|
+
for (let j = 0; j < changesets.length; j++) {
|
|
454
|
+
key = currentRequests[j] ? currentRequests[j].request.key : null;
|
|
455
|
+
const changeset = changesets[j];
|
|
456
|
+
const response = changeset.response;
|
|
457
|
+
const responseResult = this.getResponseResult(response, key);
|
|
525
458
|
finalResult.push(responseResult);
|
|
526
459
|
}
|
|
527
460
|
} else {
|
|
528
|
-
key = currentRequest ? currentRequest.request.key : null;
|
|
529
|
-
|
|
530
|
-
finalResult = this.
|
|
461
|
+
key = currentRequest ? (currentRequest.request as any).key : null;
|
|
462
|
+
const response = singleResponse.response;
|
|
463
|
+
finalResult = this.getResponseResult(response, key);
|
|
531
464
|
}
|
|
532
465
|
|
|
533
|
-
|
|
466
|
+
const statusCodeCheck = function (r) {
|
|
534
467
|
return r.statusCode >= 400;
|
|
535
468
|
};
|
|
536
469
|
|
|
537
|
-
|
|
470
|
+
const responseCheck = function (r) {
|
|
538
471
|
let success = true;
|
|
539
472
|
if (r.data && r.data.hasOwnProperty("Success")) {
|
|
540
473
|
success = r.data.Success
|
|
@@ -543,7 +476,7 @@ class BatchRequest extends RequestBase {
|
|
|
543
476
|
return success;
|
|
544
477
|
};
|
|
545
478
|
|
|
546
|
-
|
|
479
|
+
const isSuccessful = Array.isArray(finalResult) ?
|
|
547
480
|
finalResult.filter(statusCodeCheck).length === 0 && finalResult.filter(responseCheck).length === finalResult.length :
|
|
548
481
|
!statusCodeCheck(finalResult) && responseCheck(finalResult);
|
|
549
482
|
|
|
@@ -555,47 +488,47 @@ class BatchRequest extends RequestBase {
|
|
|
555
488
|
}
|
|
556
489
|
}
|
|
557
490
|
|
|
558
|
-
|
|
491
|
+
const isSuccessfulCheck = (r) => {
|
|
559
492
|
return !r.isSuccessful;
|
|
560
493
|
};
|
|
561
494
|
|
|
562
|
-
|
|
495
|
+
const batchIsSuccessful = responseParsed.filter(isSuccessfulCheck).length === 0;
|
|
563
496
|
return { data: responseParsed, isSuccessful: batchIsSuccessful };
|
|
564
497
|
}
|
|
565
498
|
|
|
566
|
-
|
|
499
|
+
private parseBatchResponse(text, context) {
|
|
567
500
|
// get boundary from response
|
|
568
|
-
|
|
569
|
-
this.
|
|
570
|
-
this.
|
|
501
|
+
const delimiter = "--" + this.currentBoundary(context);
|
|
502
|
+
this.readTo(text, delimiter, context);
|
|
503
|
+
this.readLine(text, context);
|
|
571
504
|
|
|
572
|
-
|
|
573
|
-
|
|
505
|
+
const responses = [];
|
|
506
|
+
let partEnd;
|
|
574
507
|
while (partEnd !== "--" && context.position < text.length) {
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
508
|
+
const partHeaders = this.readHeaders(text, context);
|
|
509
|
+
const partContentType = this.contentType(partHeaders["content-type"]);
|
|
510
|
+
let changeResponses;
|
|
578
511
|
if (partContentType && partContentType.mediaType === "multipart/mixed") {
|
|
579
512
|
context.boundaries.push((partContentType.properties as any).boundary);
|
|
580
513
|
|
|
581
514
|
try {
|
|
582
|
-
changeResponses = this.
|
|
515
|
+
changeResponses = this.parseBatchResponse(text, context);
|
|
583
516
|
} catch (e) {
|
|
584
|
-
e.response = this.
|
|
517
|
+
e.response = this.readResponse(text, context, delimiter);
|
|
585
518
|
changeResponses = [e];
|
|
586
519
|
}
|
|
587
520
|
responses.push({ __changeResponses: changeResponses });
|
|
588
521
|
context.boundaries.pop();
|
|
589
|
-
this.
|
|
522
|
+
this.readTo(text, "--" + this.currentBoundary(context), context);
|
|
590
523
|
} else {
|
|
591
524
|
if (!partContentType || partContentType.mediaType !== "application/http") {
|
|
592
525
|
throw { message: "invalid MIME part type " };
|
|
593
526
|
}
|
|
594
527
|
// Skip empty line
|
|
595
|
-
this.
|
|
528
|
+
this.readLine(text, context);
|
|
596
529
|
|
|
597
530
|
// Read the response
|
|
598
|
-
|
|
531
|
+
let response: any = this.readResponse(text, context, delimiter);
|
|
599
532
|
|
|
600
533
|
try {
|
|
601
534
|
if (response.statusCode >= 200 && response.statusCode <= 299) {
|
|
@@ -614,15 +547,15 @@ class BatchRequest extends RequestBase {
|
|
|
614
547
|
partEnd = text.substr(context.position, 2);
|
|
615
548
|
|
|
616
549
|
// Ignore the incoming line.
|
|
617
|
-
this.
|
|
550
|
+
this.readLine(text, context);
|
|
618
551
|
}
|
|
619
552
|
|
|
620
553
|
return responses;
|
|
621
554
|
}
|
|
622
555
|
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
556
|
+
private getResponseResult(response, key) {
|
|
557
|
+
const responseBody = response.body;
|
|
558
|
+
const data = utils.parseStringToJson(responseBody);
|
|
626
559
|
|
|
627
560
|
return {
|
|
628
561
|
key: key,
|
|
@@ -632,32 +565,32 @@ class BatchRequest extends RequestBase {
|
|
|
632
565
|
};
|
|
633
566
|
}
|
|
634
567
|
|
|
635
|
-
|
|
636
|
-
|
|
568
|
+
private currentBoundary(context) {
|
|
569
|
+
const boundaries = context.boundaries;
|
|
637
570
|
return boundaries[boundaries.length - 1];
|
|
638
571
|
}
|
|
639
572
|
|
|
640
|
-
|
|
573
|
+
private contentType(str) {
|
|
641
574
|
|
|
642
575
|
if (!str) {
|
|
643
576
|
return null;
|
|
644
577
|
}
|
|
645
578
|
|
|
646
|
-
|
|
647
|
-
|
|
579
|
+
const contentTypeParts = str.split(";");
|
|
580
|
+
const properties = {};
|
|
648
581
|
|
|
649
|
-
|
|
582
|
+
let i, len;
|
|
650
583
|
for (i = 1, len = contentTypeParts.length; i < len; i++) {
|
|
651
|
-
|
|
584
|
+
const contentTypeParams = contentTypeParts[i].split("=");
|
|
652
585
|
properties[contentTypeParams[0].replace(/^\s+|\s+$/g, '')] = contentTypeParams[1];
|
|
653
586
|
}
|
|
654
587
|
|
|
655
588
|
return { mediaType: contentTypeParts[0].replace(/^\s+|\s+$/g, ''), properties: properties };
|
|
656
589
|
}
|
|
657
590
|
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
591
|
+
private readTo(text, str, context) {
|
|
592
|
+
const start = context.position || 0;
|
|
593
|
+
let end = text.length;
|
|
661
594
|
if (str) {
|
|
662
595
|
end = text.indexOf(str, start);
|
|
663
596
|
if (end === -1) {
|
|
@@ -671,19 +604,19 @@ class BatchRequest extends RequestBase {
|
|
|
671
604
|
return text.substring(start, end);
|
|
672
605
|
}
|
|
673
606
|
|
|
674
|
-
|
|
675
|
-
return this.
|
|
607
|
+
private readLine(text, context) {
|
|
608
|
+
return this.readTo(text, BatchRequest.constants.newLine, context);
|
|
676
609
|
}
|
|
677
610
|
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
611
|
+
private readHeaders(text, context) {
|
|
612
|
+
const headers = {};
|
|
613
|
+
let parts;
|
|
614
|
+
let line;
|
|
615
|
+
let pos;
|
|
683
616
|
|
|
684
617
|
do {
|
|
685
618
|
pos = context.position;
|
|
686
|
-
line = this.
|
|
619
|
+
line = this.readLine(text, context);
|
|
687
620
|
parts = this.responseHeaderRegex.exec(line);
|
|
688
621
|
if (parts !== null) {
|
|
689
622
|
headers[parts[1].toLowerCase()] = parts[2];
|
|
@@ -696,20 +629,20 @@ class BatchRequest extends RequestBase {
|
|
|
696
629
|
return headers;
|
|
697
630
|
}
|
|
698
631
|
|
|
699
|
-
|
|
632
|
+
private readResponse(text, context, delimiter) {
|
|
700
633
|
// Read the status line.
|
|
701
|
-
|
|
702
|
-
|
|
634
|
+
const pos = context.position;
|
|
635
|
+
const match = this.responseStatusRegex.exec(this.readLine(text, context));
|
|
703
636
|
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
637
|
+
let statusCode;
|
|
638
|
+
let statusText;
|
|
639
|
+
let headers;
|
|
707
640
|
|
|
708
641
|
if (match) {
|
|
709
642
|
statusCode = match[1];
|
|
710
643
|
statusText = match[2];
|
|
711
|
-
headers = this.
|
|
712
|
-
this.
|
|
644
|
+
headers = this.readHeaders(text, context);
|
|
645
|
+
this.readLine(text, context);
|
|
713
646
|
} else {
|
|
714
647
|
context.position = pos;
|
|
715
648
|
}
|
|
@@ -718,90 +651,90 @@ class BatchRequest extends RequestBase {
|
|
|
718
651
|
statusCode: statusCode,
|
|
719
652
|
statusText: statusText,
|
|
720
653
|
headers: headers,
|
|
721
|
-
body: this.
|
|
654
|
+
body: this.readTo(text, BatchRequest.constants.newLine + delimiter, context)
|
|
722
655
|
};
|
|
723
656
|
}
|
|
724
657
|
|
|
725
|
-
|
|
726
|
-
|
|
658
|
+
private buildRequestBody() {
|
|
659
|
+
const builder = new BlobBuilder();
|
|
727
660
|
builder.append('');
|
|
728
661
|
|
|
729
|
-
for (
|
|
662
|
+
for (let index = 0; index < this.requests.length; index += 1) {
|
|
730
663
|
|
|
731
|
-
|
|
664
|
+
const request = this.requests[index].request;
|
|
732
665
|
if (index != 0)
|
|
733
666
|
builder.append(BatchRequest.constants.newLine + BatchRequest.constants.newLine);
|
|
734
667
|
|
|
735
668
|
builder.append("--" + this.boundary);
|
|
736
669
|
|
|
737
670
|
if (request instanceof Transaction) {
|
|
738
|
-
builder.append(this.
|
|
671
|
+
builder.append(this.buildTransaction(request));
|
|
739
672
|
}
|
|
740
673
|
else {
|
|
741
|
-
builder.append(this.
|
|
674
|
+
builder.append(this.buildRequest(request));
|
|
742
675
|
}
|
|
743
676
|
}
|
|
744
677
|
|
|
745
|
-
builder.append(this.
|
|
678
|
+
builder.append(this.createDelimeter(this.boundary, true));
|
|
746
679
|
return builder.build();
|
|
747
680
|
}
|
|
748
681
|
|
|
749
|
-
|
|
750
|
-
|
|
682
|
+
private buildRequest(request: RequestBase): Blob {
|
|
683
|
+
const builder = new BlobBuilder();
|
|
751
684
|
builder.append(BatchRequest.constants.newLine + 'Content-Type: application/http' +
|
|
752
685
|
BatchRequest.constants.newLine + 'Content-Transfer-Encoding: binary' +
|
|
753
686
|
BatchRequest.constants.newLine +
|
|
754
687
|
BatchRequest.constants.newLine +
|
|
755
|
-
request.
|
|
756
|
-
' ' + request.
|
|
688
|
+
request.getMethod() +
|
|
689
|
+
' ' + request.buildUrl() + ' HTTP/1.1');
|
|
757
690
|
|
|
758
691
|
return builder.build();
|
|
759
692
|
}
|
|
760
693
|
|
|
761
|
-
|
|
762
|
-
if (transaction.
|
|
694
|
+
private buildTransaction(transaction: Transaction) {
|
|
695
|
+
if (transaction.requests.length == 0)
|
|
763
696
|
return;
|
|
764
697
|
|
|
765
|
-
|
|
698
|
+
const builder = new BlobBuilder();
|
|
766
699
|
builder.append(BatchRequest.constants.newLine);
|
|
767
700
|
|
|
768
|
-
|
|
701
|
+
const changeset = this.createBoundary("sf_changeset_");
|
|
769
702
|
builder.append('Content-Type: multipart/mixed; boundary=' + changeset);
|
|
770
703
|
|
|
771
|
-
|
|
772
|
-
for (
|
|
773
|
-
|
|
704
|
+
const changesetRequests = transaction.requests;
|
|
705
|
+
for (let index = 0; index < changesetRequests.length; index += 1) {
|
|
706
|
+
const currentRequest = changesetRequests[index].request;
|
|
774
707
|
|
|
775
708
|
// we shouldn't add new lines after blob content. Otherwise they are added to the blob and corrupt it
|
|
776
|
-
const shouldAddNewLine = index === 0 || !utils.isBlob(changesetRequests[index - 1].request.
|
|
777
|
-
builder.append(this.
|
|
709
|
+
const shouldAddNewLine = index === 0 || !utils.isBlob(changesetRequests[index - 1].request.getBody());
|
|
710
|
+
builder.append(this.createDelimeter(changeset, false, shouldAddNewLine) +
|
|
778
711
|
BatchRequest.constants.newLine + 'Content-Type: application/http' +
|
|
779
712
|
BatchRequest.constants.newLine + 'Content-Transfer-Encoding: binary' +
|
|
780
713
|
BatchRequest.constants.newLine + 'Content-ID: ' + changesetRequests[index].id);
|
|
781
714
|
|
|
782
|
-
|
|
783
|
-
builder.append(BatchRequest.constants.newLine + BatchRequest.constants.newLine + currentRequest.
|
|
715
|
+
const requestUrl = currentRequest.buildUrl();
|
|
716
|
+
builder.append(BatchRequest.constants.newLine + BatchRequest.constants.newLine + currentRequest.getMethod() + ' ' + requestUrl + ' HTTP/1.1');
|
|
784
717
|
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
for (
|
|
788
|
-
|
|
718
|
+
const headers = currentRequest.getHeaders();
|
|
719
|
+
const headerNames = Object.keys(headers);
|
|
720
|
+
for (let i = 0; i < headerNames.length; i++) {
|
|
721
|
+
const headerName = headerNames[i];
|
|
789
722
|
builder.append(BatchRequest.constants.newLine + headerName + ": " + headers[headerName]);
|
|
790
723
|
}
|
|
791
724
|
|
|
792
|
-
|
|
725
|
+
const body = utils.serializeToJSON(currentRequest.getBody());
|
|
793
726
|
if (body) {
|
|
794
727
|
builder.append(BatchRequest.constants.newLine + BatchRequest.constants.newLine);
|
|
795
728
|
builder.append(body);
|
|
796
729
|
}
|
|
797
730
|
}
|
|
798
731
|
|
|
799
|
-
builder.append(this.
|
|
732
|
+
builder.append(this.createDelimeter(changeset, true));
|
|
800
733
|
|
|
801
734
|
return builder.build();
|
|
802
735
|
}
|
|
803
736
|
|
|
804
|
-
|
|
737
|
+
private createDelimeter(boundary, close, shouldAddNewLine = true) {
|
|
805
738
|
let result = "";
|
|
806
739
|
if (shouldAddNewLine) {
|
|
807
740
|
result = BatchRequest.constants.newLine + BatchRequest.constants.newLine;
|
|
@@ -815,17 +748,61 @@ class BatchRequest extends RequestBase {
|
|
|
815
748
|
return result;
|
|
816
749
|
}
|
|
817
750
|
|
|
818
|
-
|
|
751
|
+
private createBoundary(prefix) {
|
|
819
752
|
return prefix + utils.hex16() + '-' + utils.hex16() + '-' + utils.hex16();
|
|
820
753
|
}
|
|
821
754
|
|
|
822
|
-
addRequest(request) {
|
|
823
|
-
|
|
755
|
+
private addRequest(request: RequestBase) {
|
|
756
|
+
this.requests.push({ id: this.counter, request: request });
|
|
757
|
+
return this.counter++;
|
|
824
758
|
}
|
|
825
759
|
|
|
826
|
-
urlParametersClone(entitySet) {
|
|
827
|
-
|
|
760
|
+
private urlParametersClone(entitySet: string): TypeOptions {
|
|
761
|
+
const options = utils.clone(this.urlOptions);
|
|
762
|
+
options.entitySet = entitySet;
|
|
763
|
+
|
|
764
|
+
return options;
|
|
828
765
|
}
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
interface TransactionRequest {
|
|
769
|
+
id: number,
|
|
770
|
+
request: RequestBase;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
interface BatchInnerRequest {
|
|
774
|
+
id: number,
|
|
775
|
+
request: RequestBase | Transaction;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
export interface BatchRequestOptionsExtended extends RequestOptionsBaseExtended {
|
|
779
|
+
factory: RequestFactory;
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
export interface BatchRequestOptionsBase extends RequestOptionsBase {
|
|
783
|
+
entitySet: string;
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
export interface BatchCreateRequestOptions extends CreateRequestOptions {
|
|
787
|
+
entitySet: string;
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
export interface BatchUpdateRequestOptions extends UpdateRequestOptions {
|
|
791
|
+
entitySet: string;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
export interface BatchSingleItemRequestOptions extends RequestOptionsBase {
|
|
795
|
+
entitySet: string;
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
export interface BatchPropertyRequestOptions extends PropertyRequestOptions {
|
|
799
|
+
entitySet: string;
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
export interface BatchSingleRelatedItemRequestOptions extends SingleRelatedItemRequestOptions {
|
|
803
|
+
entitySet: string;
|
|
804
|
+
}
|
|
829
805
|
|
|
806
|
+
export interface BatchCreateRelatedRequestOptions extends CreateRelatedRequestOptions {
|
|
807
|
+
entitySet: string;
|
|
830
808
|
}
|
|
831
|
-
module.exports = BatchRequest;
|