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