UNPKG

@sap-cloud-sdk/core

Version:
107 lines 5.09 kB
"use strict"; 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); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createGetResourcePathForKeys = void 0; var util_1 = require("@sap-cloud-sdk/util"); var name_converter_1 = require("../name-converter"); var logger = (0, util_1.createLogger)({ package: 'core', messageContext: 'get-resource-path' }); /** * Creates a getResourcePathForKeys function using the OData v2 or OData v4 URI converter. * The concrete instances for v2 or v4 are initiated in odata/v2/uri-conversion/odata-uri.ts and odata/v4/uri-conversion/odata-uri.ts. * @param uriConverter - Uri converter for v2 or v4. * @returns The filter getter. See [[GetFilter]] */ function createGetResourcePathForKeys(uriConverter) { /** * Get the resource path of an entity specified by key-value pairs. * @typeparam EntityT - Type of the entity to get the resource path for * @param keys - Key-value pairs where the key is the name of a key property of the given entity and the value is the respective value * @param entityConstructor - Constructor type of the entity to get the resource path for * @param uriConverter - OData version specific converter for strings in URIs * @returns The path to the resource */ function getResourcePathForKeys(keys, entityConstructor) { if (keys === void 0) { keys = {}; } keys = filterNonKeyProperties(keys, entityConstructor); validateKeys(keys, entityConstructor); if (Object.keys(keys).length) { var byKey = Object.entries(keys) .map(function (_a) { var key = _a[0], value = _a[1]; return keyToOData(key, value, entityConstructor); }) .join(','); return "".concat(entityConstructor._entityName, "(").concat(byKey, ")"); } return entityConstructor._entityName; } function getMissingKeys(keys, entityConstructor) { var givenKeys = Object.keys(keys); return entityConstructor._keyFields // type assertion for backwards compatibility, TODO: remove in v2.0 .map(function (field) { return field._fieldName; }) .filter(function (fieldName) { return !givenKeys.includes(fieldName); }); } function getInvalidKeys(keys, entityConstructor) { // type assertion for backwards compatibility, TODO: remove in v2.0 var validKeys = entityConstructor._keyFields.map(function (field) { return field._fieldName; }); return Object.keys(keys).filter(function (key) { return !validKeys.includes(key); }); } function getNullishKeys(keys) { return Object.entries(keys) .filter(function (_a) { var value = _a[1]; return (0, util_1.isNullish)(value); }) .map(function (_a) { var key = _a[0]; return key; }); } function filterNonKeyProperties(keys, entityConstructor) { var invalidKeys = getInvalidKeys(keys, entityConstructor); if (invalidKeys.length) { logger.warn("There are too many key properties. Ignoring the following keys: ".concat(invalidKeys.join(', '))); return Object.entries(keys) .filter(function (_a) { var key = _a[0]; return !invalidKeys.includes(key); }) .reduce(function (validKeys, _a) { var _b; var key = _a[0], value = _a[1]; return (__assign(__assign({}, validKeys), (_b = {}, _b[key] = value, _b))); }, {}); } return keys; } function keyToOData(key, value, entityConstructor) { var edmType = entityConstructor[(0, name_converter_1.toStaticPropertyFormat)(key)].edmType; return "".concat(key, "=").concat(uriConverter.convertToUriFormat(value, edmType)); } function validateKeys(keys, entityConstructor) { var missingKeys = getMissingKeys(keys, entityConstructor); if (missingKeys.length) { throw new Error("Cannot get resource path for entity ".concat(entityConstructor._entityName, ". The following keys are missing: ").concat(missingKeys.join(', '))); } var nullishKeys = getNullishKeys(keys); if (nullishKeys.length) { throw new Error("Cannot get resource path for entity ".concat(entityConstructor._entityName, ". The following keys have nullish values, but are not nullable: ").concat(nullishKeys.join(', '))); } } return { getResourcePathForKeys: getResourcePathForKeys }; } exports.createGetResourcePathForKeys = createGetResourcePathForKeys; //# sourceMappingURL=get-resource-path.js.map