UNPKG

5.01 kBJavaScriptView Raw
1"use strict";
2var __assign = (this && this.__assign) || function () {
3 __assign = Object.assign || function(t) {
4 for (var s, i = 1, n = arguments.length; i < n; i++) {
5 s = arguments[i];
6 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7 t[p] = s[p];
8 }
9 return t;
10 };
11 return __assign.apply(this, arguments);
12};
13Object.defineProperty(exports, "__esModule", { value: true });
14exports.createGetResourcePathForKeys = void 0;
15var util_1 = require("@sap-cloud-sdk/util");
16var name_converter_1 = require("../name-converter");
17var logger = util_1.createLogger({
18 package: 'core',
19 messageContext: 'get-resource-path'
20});
21/**
22 * Creates a getResourcePathForKeys function using the OData v2 or OData v4 URI converter.
23 * 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.
24 * @param uriConverter - Uri converter for v2 or v4.
25 * @returns The filter getter. See [[GetFilter]]
26 */
27function createGetResourcePathForKeys(uriConverter) {
28 /**
29 * Get the resource path of an entity specified by key-value pairs.
30 * @typeparam EntityT - Type of the entity to get the resource path for
31 * @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
32 * @param entityConstructor - Constructor type of the entity to get the resource path for
33 * @param uriConverter - OData version specific converter for strings in URIs
34 * @returns The path to the resource
35 */
36 function getResourcePathForKeys(keys, entityConstructor) {
37 if (keys === void 0) { keys = {}; }
38 keys = filterNonKeyProperties(keys, entityConstructor);
39 validateKeys(keys, entityConstructor);
40 if (Object.keys(keys).length) {
41 var byKey = Object.entries(keys)
42 .map(function (_a) {
43 var key = _a[0], value = _a[1];
44 return keyToOData(key, value, entityConstructor);
45 })
46 .join(',');
47 return entityConstructor._entityName + "(" + byKey + ")";
48 }
49 return entityConstructor._entityName;
50 }
51 function getMissingKeys(keys, entityConstructor) {
52 var givenKeys = Object.keys(keys);
53 return entityConstructor._keyFields // type assertion for backwards compatibility, TODO: remove in v2.0
54 .map(function (field) { return field._fieldName; })
55 .filter(function (fieldName) { return !givenKeys.includes(fieldName); });
56 }
57 function getInvalidKeys(keys, entityConstructor) {
58 // type assertion for backwards compatibility, TODO: remove in v2.0
59 var validKeys = entityConstructor._keyFields.map(function (field) { return field._fieldName; });
60 return Object.keys(keys).filter(function (key) { return !validKeys.includes(key); });
61 }
62 function getNullishKeys(keys) {
63 return Object.entries(keys)
64 .filter(function (_a) {
65 var value = _a[1];
66 return util_1.isNullish(value);
67 })
68 .map(function (_a) {
69 var key = _a[0];
70 return key;
71 });
72 }
73 function filterNonKeyProperties(keys, entityConstructor) {
74 var invalidKeys = getInvalidKeys(keys, entityConstructor);
75 if (invalidKeys.length) {
76 logger.warn("There are too many key properties. Ignoring the following keys: " + invalidKeys.join(', '));
77 return Object.entries(keys)
78 .filter(function (_a) {
79 var key = _a[0];
80 return !invalidKeys.includes(key);
81 })
82 .reduce(function (validKeys, _a) {
83 var _b;
84 var key = _a[0], value = _a[1];
85 return (__assign(__assign({}, validKeys), (_b = {}, _b[key] = value, _b)));
86 }, {});
87 }
88 return keys;
89 }
90 function keyToOData(key, value, entityConstructor) {
91 var edmType = entityConstructor[name_converter_1.toStaticPropertyFormat(key)].edmType;
92 return key + "=" + uriConverter.convertToUriFormat(value, edmType);
93 }
94 function validateKeys(keys, entityConstructor) {
95 var missingKeys = getMissingKeys(keys, entityConstructor);
96 if (missingKeys.length) {
97 throw new Error("Cannot get resource path for entity " + entityConstructor._entityName + ". The following keys are missing: " + missingKeys.join(', '));
98 }
99 var nullishKeys = getNullishKeys(keys);
100 if (nullishKeys.length) {
101 throw new Error("Cannot get resource path for entity " + entityConstructor._entityName + ". The following keys have nullish values, but are not nullable: " + nullishKeys.join(', '));
102 }
103 }
104 return { getResourcePathForKeys: getResourcePathForKeys };
105}
106exports.createGetResourcePathForKeys = createGetResourcePathForKeys;
107//# sourceMappingURL=get-resource-path.js.map
\No newline at end of file