UNPKG

@sap-cloud-sdk/core

Version:
296 lines • 14.1 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); exports.UpdateRequestBuilderBase = exports.removePropertyOnCondition = exports.UpdateRequestBuilder = void 0; var util_1 = require("@sap-cloud-sdk/util"); var request_1 = require("../request"); var entity_deserializer_1 = require("../entity-deserializer"); var request_builder_base_1 = require("./request-builder-base"); /** * Abstract class to create OData query to update an entity containing methods shared for OData v2 and v4. * @typeparam EntityT - Type of the entity to be updated */ var UpdateRequestBuilder = /** @class */ (function (_super) { __extends(UpdateRequestBuilder, _super); /** * Creates an instance of UpdateRequestBuilder. * @param _entityConstructor - Constructor type of the entity to be updated * @param _entity - Entity to be updated * @param oDataUri - Collection of URI conversion methods * @param entitySerializer - Entity serializer * @param extractODataEtag - Extractor for ETag from payload * @param payloadManipulator - Manipulator for the payload. */ function UpdateRequestBuilder(_entityConstructor, _entity, oDataUri, entitySerializer, extractODataEtag, payloadManipulator) { var _this = _super.call(this, new request_1.ODataUpdateRequestConfig(_entityConstructor, oDataUri)) || this; _this._entityConstructor = _entityConstructor; _this._entity = _entity; _this.oDataUri = oDataUri; _this.entitySerializer = entitySerializer; _this.extractODataEtag = extractODataEtag; _this.payloadManipulator = payloadManipulator; _this.requestConfig.eTag = _entity.versionIdentifier; _this.required = new Set(); _this.ignored = new Set(); _this.requestConfig.keys = _this.oDataUri.getEntityKeys(_this._entity, _this._entityConstructor); _this.requestConfig.payload = _this.getPayload(); return _this; } Object.defineProperty(UpdateRequestBuilder.prototype, "entity", { get: function () { return this._entity; }, enumerable: false, configurable: true }); /** * @deprecated Since v1.29.0. This method should never be called, it has severe side effects. * Builds the payload and the entity keys of the query. * @returns the builder itself */ UpdateRequestBuilder.prototype.prepare = function () { this.requestConfig.keys = this.oDataUri.getEntityKeys(this._entity, this._entityConstructor); this.requestConfig.payload = this.getPayload(); return this; }; /** * Explicitly configure 'PUT' as the method of the update request. By default, only the properties that have changed compared to the last known remote state are sent using 'PATCH', while with 'PUT', the whole entity is sent. * @returns The entity itself, to facilitate method chaining. */ UpdateRequestBuilder.prototype.replaceWholeEntityWithPut = function () { this.requestConfig.updateWithPut(); this.requestConfig.payload = this.getPayload(); return this; }; UpdateRequestBuilder.prototype.requiredFields = function (first) { var rest = []; for (var _i = 1; _i < arguments.length; _i++) { rest[_i - 1] = arguments[_i]; } this.required = this.toSet((0, util_1.variadicArgumentToArray)(first, rest)); this.requestConfig.payload = this.getPayload(); return this; }; UpdateRequestBuilder.prototype.setRequiredFields = function (first) { var rest = []; for (var _i = 1; _i < arguments.length; _i++) { rest[_i - 1] = arguments[_i]; } this.required = this.toSet((0, util_1.variadicArgumentToArray)(first, rest)); this.requestConfig.payload = this.getPayload(); return this; }; UpdateRequestBuilder.prototype.ignoredFields = function (first) { var rest = []; for (var _i = 1; _i < arguments.length; _i++) { rest[_i - 1] = arguments[_i]; } this.ignored = this.toSet((0, util_1.variadicArgumentToArray)(first, rest)); this.requestConfig.payload = this.getPayload(); return this; }; UpdateRequestBuilder.prototype.setIgnoredFields = function (first) { var rest = []; for (var _i = 1; _i < arguments.length; _i++) { rest[_i - 1] = arguments[_i]; } this.ignored = this.toSet((0, util_1.variadicArgumentToArray)(first, rest)); this.requestConfig.payload = this.getPayload(); return this; }; /** * Instructs the request to force an overwrite of the entity by sending an 'If-Match: *' header instead of sending the ETag version identifier. * @returns The request itself to ease chaining while executing the request. */ UpdateRequestBuilder.prototype.ignoreVersionIdentifier = function () { this.requestConfig.versionIdentifierIgnored = true; return this; }; /** * @deprecated Since version 1.34.0 Use [[setVersionIdentifier]] instead. * Specifies a custom ETag version identifier of the entity to update. * @param etag - Custom ETag version identifier to be sent in the header of the request. * @returns The request itself to ease chaining while executing the request. */ UpdateRequestBuilder.prototype.withCustomVersionIdentifier = function (etag) { this.requestConfig.eTag = etag; return this; }; /** * Sets ETag version identifier of the entity to update. * @param etag - Custom ETag version identifier to be sent in the header of the request. * @returns The request itself to ease chaining while executing the request. */ UpdateRequestBuilder.prototype.setVersionIdentifier = function (etag) { this.requestConfig.eTag = etag; return this; }; /** * Executes the query. * @param request - Request object to be executed. * @returns A promise resolving to the entity once it was updated. */ UpdateRequestBuilder.prototype.executeRequest = function (request) { return __awaiter(this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { return [2 /*return*/, (this.executeRequestRaw(request) // Update returns 204 hence the data from the request is used to build entity for return .then(function (response) { var eTag = (0, entity_deserializer_1.extractEtagFromHeader)(response.headers) || _this.extractODataEtag(response.data) || _this.requestConfig.eTag; return _this._entity .setOrInitializeRemoteState() .setVersionIdentifier(eTag); }) .catch(function (error) { throw new util_1.ErrorWithCause('OData update request failed!', error); }))]; }); }); }; UpdateRequestBuilder.prototype.executeRequestRaw = function (request) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, request.execute()]; }); }); }; UpdateRequestBuilder.prototype.getPayload = function () { var serializedBody = this.entitySerializer.serializeEntity(this._entity, this._entityConstructor); if (this.requestConfig.method === 'patch') { var body = this.serializedDiff(); body = this.payloadManipulator(body); body = this.removeKeyFields(body); body = this.addRequiredFields(serializedBody, body); body = this.removeIgnoredFields(body); return body; } return serializedBody; }; UpdateRequestBuilder.prototype.isEmptyObject = function (obj) { for (var key in obj) { if (obj.hasOwnProperty(key)) { return false; } } return true; }; UpdateRequestBuilder.prototype.addRequiredFields = function (completeBody, body) { return Array.from(this.required).reduce(function (resultBody, requiredField) { var _a; if (Object.keys(resultBody).includes(requiredField)) { return resultBody; } return __assign(__assign({}, resultBody), (_a = {}, _a[requiredField] = completeBody[requiredField], _a)); }, body); }; UpdateRequestBuilder.prototype.getKeyFieldNames = function () { return Object.keys(this._entityConstructor._keys); }; UpdateRequestBuilder.prototype.toSet = function (fields) { var set = new Set(); Object.values(fields).forEach(function (field) { set.add(field._fieldName); }); return set; }; UpdateRequestBuilder.prototype.serializedDiff = function () { return __assign({}, this.entitySerializer.serializeEntity(this._entity, this._entityConstructor, true)); }; UpdateRequestBuilder.prototype.removeKeyFields = function (body) { var _this = this; return removePropertyOnCondition(function (_a) { var key = _a[0]; return _this.getKeyFieldNames().includes(key); }, body); }; UpdateRequestBuilder.prototype.removeIgnoredFields = function (body) { var _this = this; return removePropertyOnCondition(function (_a) { var key = _a[0]; return _this.ignored.has(key); }, body); }; return UpdateRequestBuilder; }(request_builder_base_1.MethodRequestBuilder)); exports.UpdateRequestBuilder = UpdateRequestBuilder; exports.UpdateRequestBuilderBase = UpdateRequestBuilder; // eslint-disable-next-line valid-jsdoc /** * @hidden */ function removePropertyOnCondition(condition, body) { return Object.entries(body).reduce(function (resultBody, _a) { var _b; var key = _a[0], val = _a[1]; if (condition([key, val])) { return resultBody; } return __assign(__assign({}, resultBody), (_b = {}, _b[key] = val, _b)); }, {}); } exports.removePropertyOnCondition = removePropertyOnCondition; //# sourceMappingURL=update-request-builder-base.js.map