@sap-cloud-sdk/odata-common
Version:
SAP Cloud SDK for JavaScript common functions of OData client generator and OpenAPI clint generator.
86 lines • 3.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.BatchRequestBuilder = void 0;
const util_1 = require("@sap-cloud-sdk/util");
const request_1 = require("../../request");
const request_builder_base_1 = require("../request-builder-base");
const batch_change_set_1 = require("./batch-change-set");
const batch_request_serializer_1 = require("./batch-request-serializer");
/**
* Create a batch request to invoke multiple requests as a batch. The batch request builder accepts retrieve requests, i. e. {@link GetAllRequestBuilder | getAll} and {@link GetByKeyRequestBuilder | getByKey} requests and change sets, which in turn can contain {@link CreateRequestBuilder | create}, {@link UpdateRequestBuilder | update} or {@link DeleteRequestBuilder | delete} requests.
* The retrieve and change sets will be executed in order, while the order within a change set can vary.
* @internal
*/
class BatchRequestBuilder extends request_builder_base_1.MethodRequestBuilder {
/**
* Creates an instance of ODataBatchRequestBuilder.
* @param defaultBasePath - Base path.
* @param requests - An array of retrieve requests or change sets.
*/
constructor(defaultBasePath, requests) {
super(new request_1.ODataBatchRequestConfig(defaultBasePath));
this.defaultBasePath = defaultBasePath;
this.requests = requests;
const entityApi = (0, util_1.first)(Object.values(this.getEntityToApiMap()));
this.deSerializers =
entityApi?.deSerializers || this.getOperationDeserializers(requests);
}
withSubRequestPathType(subRequestPathType) {
this.requestConfig.withSubRequestPathType(subRequestPathType);
return this;
}
build(destination) {
return destination
? super.build(destination).then(request => this.setPayload(request))
: this.setPayload(super.build());
}
/**
* Execute request and return an {@link @sap-cloud-sdk/http-client!HttpResponse}.
* @param destination - Destination or DestinationFetchOptions to execute the request against.
* @returns A promise resolving to an {@link @sap-cloud-sdk/http-client!HttpResponse}.
*/
async executeRaw(destination) {
return this.build(destination).then(request => request.execute());
}
getEntityToApiMap() {
return this.requests.reduce((apis, request) => ({
...apis,
...(request instanceof batch_change_set_1.BatchChangeSet
? buildMapEntries(request)
: buildMapEntry(request))
}), {});
}
setPayload(request) {
request.config.payload = (0, batch_request_serializer_1.serializeBatchRequest)(this, {
subRequestPathType: request.config.subRequestPathType,
destination: request.destination
});
return request;
}
getOperationDeserializers(requests) {
const outerRequest = (0, util_1.first)(requests);
if (outerRequest instanceof batch_change_set_1.BatchChangeSet) {
const innerRequest = (0, util_1.first)(outerRequest.requests);
if (innerRequest && isActionOrFunctionImport(innerRequest)) {
return innerRequest._deSerializers;
}
}
}
}
exports.BatchRequestBuilder = BatchRequestBuilder;
function isActionOrFunctionImport(req) {
return !!(req.requestConfig['functionName'] ?? req.requestConfig['actionName']);
}
function buildMapEntries(changeSet) {
return changeSet.requests.reduce((changeSetApis, changesetReq) => isActionOrFunctionImport(changesetReq)
? changeSetApis
: { ...changeSetApis, ...buildMapEntry(changesetReq) }, {});
}
function buildMapEntry(request) {
return isActionOrFunctionImport(request)
? {}
: {
[request._entityApi.entityConstructor._entityName]: request._entityApi
};
}
//# sourceMappingURL=batch-request-builder.js.map