@restorecommerce/facade 0.1.39 → 0.1.43

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/CHANGELOG.md CHANGED
@@ -3,6 +3,45 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [0.1.43](https://github.com/restorecommerce/libs/compare/@restorecommerce/facade@0.1.42...@restorecommerce/facade@0.1.43) (2022-02-02)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **facade:** enum convert string to integer ([47127ef](https://github.com/restorecommerce/libs/commit/47127ef323f5853a4c6573b01dd36c3725074d4e))
12
+ * **facade:** fix for mutation resolvers to convert enums string values to integer ([28d0fea](https://github.com/restorecommerce/libs/commit/28d0fea912778b3cf4f748bc68b1e0fafaea60af))
13
+ * **facade:** fixed read operations to convert enums to number ([81083c0](https://github.com/restorecommerce/libs/commit/81083c0162d605d6a3c8394e06ba093d1e29948e))
14
+ * **facade:** move conversion of enum to int to utils ([72c9a1f](https://github.com/restorecommerce/libs/commit/72c9a1f0be269b68bc9b2501a38789ce7409453f))
15
+ * **facade:** recursive enum path fix ([244f7fc](https://github.com/restorecommerce/libs/commit/244f7fc782d10ffb5f774f0245174446288cacb5))
16
+
17
+
18
+
19
+
20
+
21
+ ## [0.1.42](https://github.com/restorecommerce/libs/compare/@restorecommerce/facade@0.1.41...@restorecommerce/facade@0.1.42) (2022-01-28)
22
+
23
+ **Note:** Version bump only for package @restorecommerce/facade
24
+
25
+
26
+
27
+
28
+
29
+ ## [0.1.41](https://github.com/restorecommerce/libs/compare/@restorecommerce/facade@0.1.40...@restorecommerce/facade@0.1.41) (2021-12-22)
30
+
31
+ **Note:** Version bump only for package @restorecommerce/facade
32
+
33
+
34
+
35
+
36
+
37
+ ## [0.1.40](https://github.com/restorecommerce/libs/compare/@restorecommerce/facade@0.1.39...@restorecommerce/facade@0.1.40) (2021-12-21)
38
+
39
+ **Note:** Version bump only for package @restorecommerce/facade
40
+
41
+
42
+
43
+
44
+
6
45
  ## [0.1.39](https://github.com/restorecommerce/libs/compare/@restorecommerce/facade@0.1.38...@restorecommerce/facade@0.1.39) (2021-12-20)
7
46
 
8
47
  **Note:** Version bump only for package @restorecommerce/facade
@@ -15,7 +15,7 @@ declare type ServiceClient<Context extends Pick<Context, Key>, Key extends keyof
15
15
  };
16
16
  };
17
17
  export declare const getGQLResolverFunctions: <T extends Record<string, any>, CTX extends ServiceClient<CTX, keyof CTX, T>, SRV = any, R = ResolverFn<any, any, ServiceClient<CTX, keyof CTX, T>, any>, B extends keyof T = any, NS extends keyof CTX = any>(service: ServiceDescriptorProto, key: NS, serviceKey: B, grpcClientConfig: GrpcClientConfig) => { [key in keyof SRV]: R; };
18
- export declare const registerResolverFunction: <T extends Record<string, any>, CTX extends ServiceClient<CTX, keyof CTX, T>>(namespace: string, name: string, func: ResolverFn<any, any, ServiceClient<CTX, keyof CTX, T>, any>, mutation?: boolean, subspace?: string | undefined) => void;
18
+ export declare const registerResolverFunction: <T extends Record<string, any>, CTX extends ServiceClient<CTX, keyof CTX, T>>(namespace: string, name: string, func: ResolverFn<any, any, ServiceClient<CTX, keyof CTX, T>, any>, mutation?: boolean, subspace?: string | undefined, service?: ServiceDescriptorProto | undefined) => void;
19
19
  export declare const generateResolver: (...namespaces: string[]) => any;
20
20
  export declare const registerResolverSchema: (namespace: string, name: string, schema: Thunk<GraphQLFieldConfig<any, any>>, mutation?: boolean, subspace?: string | undefined) => void;
21
21
  export declare const generateSchema: (setup: {
@@ -10,6 +10,7 @@ const stream = require("stream");
10
10
  const _ = require("lodash");
11
11
  const typeCache = new Map();
12
12
  const Mutate = ['Create', 'Update', 'Upsert'];
13
+ const inputMethodType = new Map();
13
14
  const getGQLSchema = (method) => {
14
15
  const fields = {
15
16
  // operationStatus: {
@@ -109,9 +110,8 @@ const getGQLResolverFunctions = (service, key, serviceKey, grpcClientConfig) =>
109
110
  }
110
111
  const defaults = typing.processor.fromPartial({});
111
112
  let subjectField = null;
112
- const inputTyping = registry_1.getTyping(method.inputType);
113
- if (inputTyping) {
114
- for (let field of inputTyping.meta.field) {
113
+ if (typing) {
114
+ for (let field of typing.meta.field) {
115
115
  if (field.typeName === types_1.authSubjectType) {
116
116
  subjectField = field.name;
117
117
  break;
@@ -124,11 +124,13 @@ const getGQLResolverFunctions = (service, key, serviceKey, grpcClientConfig) =>
124
124
  const service = client[serviceKey];
125
125
  try {
126
126
  const converted = await exports.recursiveUploadToBuffer(args.input, typing.input);
127
- const req = {
127
+ let req = {
128
128
  // Fill defaults
129
129
  ...defaults,
130
130
  ...converted
131
131
  };
132
+ // convert enum strings to integers
133
+ req = utils_1.convertEnumToInt(typing, req);
132
134
  if (subjectField !== null) {
133
135
  req.subject = registry_1.getTyping(types_1.authSubjectType).processor.fromPartial({});
134
136
  const authToken = context.request.req.headers['authorization'];
@@ -142,17 +144,21 @@ const getGQLResolverFunctions = (service, key, serviceKey, grpcClientConfig) =>
142
144
  let operationStatus = { code: 0, message: '' };
143
145
  let aggregatedResponse = await new Promise((resolve, reject) => {
144
146
  let response = {};
147
+ let combinedChunks = {};
145
148
  result.on('data', (chunk) => {
146
149
  const chunkObj = _.cloneDeep(chunk);
147
- if (!response) {
148
- response = chunk;
150
+ if (!combinedChunks) {
151
+ combinedChunks = chunk;
149
152
  }
150
153
  else {
151
- Object.assign(response, chunk);
154
+ Object.assign(combinedChunks, chunk);
152
155
  }
153
156
  const existingBufferFields = _.intersection(Object.keys(chunk), bufferFields);
154
157
  for (let bufferField of existingBufferFields) {
155
158
  if (chunkObj[bufferField] && chunkObj[bufferField].value) {
159
+ if (!response[bufferField]) {
160
+ response[bufferField] = { value: [] };
161
+ }
156
162
  if (response[bufferField] && response[bufferField].value && !_.isArray(response[bufferField].value)) {
157
163
  response[bufferField].value = [];
158
164
  }
@@ -178,7 +184,12 @@ const getGQLResolverFunctions = (service, key, serviceKey, grpcClientConfig) =>
178
184
  operationStatus.code = 200;
179
185
  operationStatus.message = 'success';
180
186
  }
181
- resolve(response);
187
+ if (!_.isEmpty(response)) {
188
+ resolve(response);
189
+ }
190
+ else if (!_.isEmpty(combinedChunks)) {
191
+ resolve(combinedChunks);
192
+ }
182
193
  });
183
194
  });
184
195
  return { details: aggregatedResponse, operationStatus };
@@ -242,6 +253,12 @@ const MutateResolver = async (req, ctx, schema) => {
242
253
  else if (mode === 'UPSERT') {
243
254
  method = 'Upsert';
244
255
  }
256
+ const inputMethodTypeKey = module_name.toLowerCase() + '.' + key.toLowerCase() + '.' + method.toLowerCase();
257
+ const nsType = inputMethodType.get(inputMethodTypeKey);
258
+ if (nsType) {
259
+ const inputTyping = registry_1.getTyping(nsType);
260
+ utils_1.convertEnumToInt(inputTyping, input);
261
+ }
245
262
  // check service object contains requested mode's method def
246
263
  if (!service[method]) {
247
264
  throw new Error(`Method ${method} not defined on ${module_name}`);
@@ -352,7 +369,7 @@ const MutateResolver = async (req, ctx, schema) => {
352
369
  };
353
370
  }
354
371
  };
355
- const registerResolverFunction = (namespace, name, func, mutation = false, subspace = undefined) => {
372
+ const registerResolverFunction = (namespace, name, func, mutation = false, subspace = undefined, service) => {
356
373
  if (!namespaceResolverRegistry.has(namespace)) {
357
374
  namespaceResolverRegistry.set(namespace, new Map());
358
375
  }
@@ -374,6 +391,13 @@ const registerResolverFunction = (namespace, name, func, mutation = false, subsp
374
391
  throw new Error(`Namespace "${namespace}" already contains a function: ${name} (mutation: ${mutation})`);
375
392
  }
376
393
  }
394
+ if (service) {
395
+ const key = (namespace === null || namespace === void 0 ? void 0 : namespace.toLocaleLowerCase()) + '.' + (subspace === null || subspace === void 0 ? void 0 : subspace.toLocaleLowerCase()) + '.' + (name === null || name === void 0 ? void 0 : name.toLocaleLowerCase());
396
+ const value = service.method.find((m) => m.name === name);
397
+ if (key && (value === null || value === void 0 ? void 0 : value.inputType)) {
398
+ inputMethodType.set(key, value.inputType);
399
+ }
400
+ }
377
401
  // custom mutation resolver for create, update and upsert - Mutate
378
402
  if (Mutate.indexOf(name) > -1) {
379
403
  name = 'Mutate';
@@ -590,7 +614,7 @@ const getAndGenerateResolvers = (service, namespace, cfg, queryList, subspace =
590
614
  const { mutations, queries } = exports.getWhitelistBlacklistConfig(service, queryList, cfg);
591
615
  const func = exports.getGQLResolverFunctions(service, namespace, serviceKey || subspace || namespace, cfg.client);
592
616
  Object.keys(func).forEach(k => {
593
- exports.registerResolverFunction(namespace, k, func[k], !queries.has(k) && mutations.has(k), subspace);
617
+ exports.registerResolverFunction(namespace, k, func[k], !queries.has(k) && mutations.has(k), subspace, service);
594
618
  });
595
619
  return exports.generateResolver(namespace);
596
620
  };
@@ -617,7 +641,9 @@ const generateSubServiceResolvers = (subServices, config, namespace) => {
617
641
  const { mutations, queries } = exports.getWhitelistBlacklistConfig(sub.service, sub.queries, config);
618
642
  const func = exports.getGQLResolverFunctions(sub.service, namespace, sub.name || namespace, config.client);
619
643
  Object.keys(func).forEach(k => {
620
- exports.registerResolverFunction(config.root ? sub.name : namespace, k, func[k], !queries.has(k) && mutations.has(k), config.root ? undefined : sub.name);
644
+ const regNamespace = config.root ? sub.name : namespace;
645
+ const regSubspace = config.root ? undefined : sub.name;
646
+ exports.registerResolverFunction(regNamespace, k, func[k], !queries.has(k) && mutations.has(k), regSubspace, sub.service);
621
647
  });
622
648
  });
623
649
  if (config.root) {
@@ -8,8 +8,13 @@ export interface TypingData {
8
8
  meta: DescriptorProto | EnumDescriptorProto;
9
9
  processor?: any;
10
10
  }
11
+ export declare const registeredTypings: Map<string, TypingData>;
12
+ export declare const scalarTypes: string[];
11
13
  export declare const clearRegistry: () => void;
12
14
  export declare const registerPackagesRecursive: (...protoMetadata: ProtoMetadata[]) => void;
15
+ export declare const getRegisteredEnumTypings: () => string[];
16
+ export declare const getNameSpaceTypeName: (typeName: string) => string | undefined;
17
+ export declare const recursiveEnumCheck: (typeName: string, enumMap: Map<string, string>, prevFieldName: string, traversedFields: string[]) => Map<string, string>;
13
18
  export declare const registerTyping: (protoPackage: string, message: DescriptorProto, methodDef: MethodDescriptorProto[], opts?: Omit<Readonly<GraphQLObjectTypeConfig<any, any>>, "fields"> | undefined, inputOpts?: Omit<Readonly<GraphQLInputObjectTypeConfig>, "fields"> | undefined) => void;
14
19
  export declare const registerEnumTyping: <T = {
15
20
  [key: string]: any;
@@ -1,13 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getTyping = exports.registerEnumTyping = exports.registerTyping = exports.registerPackagesRecursive = exports.clearRegistry = void 0;
3
+ exports.getTyping = exports.registerEnumTyping = exports.registerTyping = exports.recursiveEnumCheck = exports.getNameSpaceTypeName = exports.getRegisteredEnumTypings = exports.registerPackagesRecursive = exports.clearRegistry = exports.scalarTypes = exports.registeredTypings = void 0;
4
4
  const graphql_1 = require("graphql");
5
5
  const definition_1 = require("graphql/type/definition");
6
6
  const graphql_upload_1 = require("graphql-upload");
7
7
  const utils_1 = require("./utils");
8
8
  const types_1 = require("./types");
9
9
  const descriptor_1 = require("ts-proto-descriptors/google/protobuf/descriptor");
10
- const registeredTypings = new Map();
10
+ const _ = require("lodash");
11
+ exports.registeredTypings = new Map();
12
+ exports.scalarTypes = ['Boolean', 'Int', 'Float', 'String', 'ID', 'Upload'];
13
+ const typeNameAndNameSpaceMapping = new Map();
14
+ const registeredEnumTypes = [];
11
15
  const MapScalar = new definition_1.GraphQLScalarType({
12
16
  name: 'MapScalar',
13
17
  });
@@ -22,7 +26,7 @@ const TodoScalar = new definition_1.GraphQLScalarType({
22
26
  }
23
27
  });
24
28
  const clearRegistry = () => {
25
- registeredTypings.clear();
29
+ exports.registeredTypings.clear();
26
30
  };
27
31
  exports.clearRegistry = clearRegistry;
28
32
  const registerPackagesRecursive = (...protoMetadata) => {
@@ -34,11 +38,70 @@ const registerPackagesRecursive = (...protoMetadata) => {
34
38
  exports.registerEnumTyping(meta.fileDescriptor.package, m);
35
39
  });
36
40
  Object.keys(meta.references).forEach(key => {
37
- registeredTypings.get(key).processor = meta.references[key];
41
+ exports.registeredTypings.get(key).processor = meta.references[key];
38
42
  });
39
43
  });
40
44
  };
41
45
  exports.registerPackagesRecursive = registerPackagesRecursive;
46
+ const getRegisteredEnumTypings = () => {
47
+ return registeredEnumTypes;
48
+ };
49
+ exports.getRegisteredEnumTypings = getRegisteredEnumTypings;
50
+ const getNameSpaceTypeName = (typeName) => {
51
+ return typeNameAndNameSpaceMapping.get(typeName);
52
+ };
53
+ exports.getNameSpaceTypeName = getNameSpaceTypeName;
54
+ // Iterate through the object and collect list of all enum types with their keys / paths
55
+ const recursiveEnumCheck = (typeName, enumMap, prevFieldName, traversedFields) => {
56
+ if (exports.scalarTypes.indexOf(typeName) <= -1) {
57
+ if (typeName && typeName.startsWith('[') && typeName.endsWith('!]')) {
58
+ typeName = typeName.substring(1, typeName.length - 2);
59
+ }
60
+ const objectNameSpace = exports.getNameSpaceTypeName(typeName);
61
+ if (objectNameSpace) {
62
+ const objectType = exports.getTyping(objectNameSpace);
63
+ if ((objectType === null || objectType === void 0 ? void 0 : objectType.input) && (registeredEnumTypes.indexOf(objectType.input.toString()) > -1)) {
64
+ enumMap.set(objectType === null || objectType === void 0 ? void 0 : objectType.input.toString(), prevFieldName);
65
+ prevFieldName = '';
66
+ }
67
+ else if (objectType === null || objectType === void 0 ? void 0 : objectType.input) {
68
+ // get nested fields from this object and check recursively
69
+ const gqlFields = objectType.input.getFields();
70
+ if (gqlFields) {
71
+ const fieldNames = Object.keys(gqlFields);
72
+ for (let fieldName of fieldNames) {
73
+ let fieldType = gqlFields[fieldName].type.toString();
74
+ // if fieldType is not basic type, get the object and make recursive check till no more objects are found
75
+ let skipLoop = false;
76
+ if (exports.scalarTypes.indexOf(fieldType) <= -1) {
77
+ // check if fieldName already exists in the enumMap (to avoid circular reference for infinite loop)
78
+ for (let [key, val] of enumMap) {
79
+ const valueArray = val.split('.');
80
+ // if fieldName already exists in enumMap, this field is a circular field ref
81
+ // ignore it as its already traversed and enums are kept track of
82
+ if (valueArray.indexOf(fieldName) > -1) {
83
+ skipLoop = true;
84
+ }
85
+ }
86
+ if (skipLoop) {
87
+ continue;
88
+ }
89
+ if (!prevFieldName || _.isEmpty(prevFieldName)) {
90
+ prevFieldName = fieldName;
91
+ }
92
+ if (prevFieldName && prevFieldName != fieldName) {
93
+ fieldName = prevFieldName + '.' + fieldName;
94
+ }
95
+ exports.recursiveEnumCheck(fieldType, enumMap, fieldName, traversedFields);
96
+ }
97
+ }
98
+ }
99
+ }
100
+ }
101
+ }
102
+ return enumMap;
103
+ };
104
+ exports.recursiveEnumCheck = recursiveEnumCheck;
42
105
  const registerMessageTypesRecursive = (packageName, methodDef, ...types) => {
43
106
  types.forEach(m => {
44
107
  exports.registerTyping(packageName, m, methodDef);
@@ -78,7 +141,7 @@ const registerTyping = (protoPackage, message, methodDef, opts, inputOpts) => {
78
141
  }
79
142
  }
80
143
  }
81
- if (registeredTypings.has(type)) {
144
+ if (exports.registeredTypings.has(type)) {
82
145
  // TODO Log debug "Typings for object are already registered"
83
146
  return;
84
147
  }
@@ -125,7 +188,8 @@ const registerTyping = (protoPackage, message, methodDef, opts, inputOpts) => {
125
188
  ...(inputOpts || { name: inputName }),
126
189
  fields: inputFields,
127
190
  });
128
- registeredTypings.set(type, {
191
+ typeNameAndNameSpaceMapping.set(resultInputObj.name, type);
192
+ exports.registeredTypings.set(type, {
129
193
  output: resultObj,
130
194
  input: resultInputObj,
131
195
  meta: message
@@ -135,7 +199,7 @@ exports.registerTyping = registerTyping;
135
199
  const registerEnumTyping = (protoPackage, message, opts) => {
136
200
  var _a;
137
201
  const type = (protoPackage.startsWith('.') ? '' : '.') + protoPackage + '.' + message.name;
138
- if (registeredTypings.has(type)) {
202
+ if (exports.registeredTypings.has(type)) {
139
203
  // TODO Log debug "Typings for enum are already registered"
140
204
  return;
141
205
  }
@@ -150,7 +214,9 @@ const registerEnumTyping = (protoPackage, message, opts) => {
150
214
  ...(opts || { name }),
151
215
  values
152
216
  });
153
- registeredTypings.set(type, {
217
+ registeredEnumTypes.push(name);
218
+ typeNameAndNameSpaceMapping.set(name, type);
219
+ exports.registeredTypings.set(type, {
154
220
  output: result,
155
221
  input: result,
156
222
  meta: message
@@ -158,7 +224,7 @@ const registerEnumTyping = (protoPackage, message, opts) => {
158
224
  };
159
225
  exports.registerEnumTyping = registerEnumTyping;
160
226
  const getTyping = (type) => {
161
- return registeredTypings.get(type);
227
+ return exports.registeredTypings.get(type);
162
228
  };
163
229
  exports.getTyping = getTyping;
164
230
  const resolveMeta = (key, field, rootObjType, objName, input) => {
@@ -173,17 +239,17 @@ const resolveMeta = (key, field, rootObjType, objName, input) => {
173
239
  case descriptor_1.FieldDescriptorProto_Type.TYPE_ENUM:
174
240
  case descriptor_1.FieldDescriptorProto_Type.TYPE_MESSAGE:
175
241
  const objType = field.typeName;
176
- if (!registeredTypings.has(objType)) {
242
+ if (!exports.registeredTypings.has(objType)) {
177
243
  throw new Error("Typing '" + objType + "' not registered for key '" + key + "' in object: " + objName);
178
244
  }
179
245
  if (!input) {
180
- result = registeredTypings.get(objType).output;
246
+ result = exports.registeredTypings.get(objType).output;
181
247
  break;
182
248
  }
183
249
  if (objType === types_1.authSubjectType) {
184
250
  return null;
185
251
  }
186
- result = registeredTypings.get(objType).input;
252
+ result = exports.registeredTypings.get(objType).input;
187
253
  break;
188
254
  case descriptor_1.FieldDescriptorProto_Type.TYPE_BYTES:
189
255
  if (input) {
@@ -1,4 +1,25 @@
1
+ import { TypingData } from './registry';
1
2
  export declare const capitalizeProtoName: (name: string) => string;
2
3
  export declare const convertyCamelToSnakeCase: (entity: string) => string;
3
4
  export declare const getKeys: (obj: any) => string[];
4
5
  export declare const decodeBufferFields: (items: any, bufferFields: string[]) => any;
6
+ interface EnumMetaData {
7
+ name: string;
8
+ number: number;
9
+ options?: any;
10
+ }
11
+ /**
12
+ * recursively find the path and updates the object with given value, this function
13
+ * also takes care to handle if there is an array at any position in the path
14
+ * @param path path in dot notation
15
+ * @param val value to be updated in Object
16
+ * @param obj Object
17
+ */
18
+ export declare const updateJSON: (path: string, val: EnumMetaData[], obj: any) => void;
19
+ /**
20
+ * converts enum string values to integers reading from the inputTyping
21
+ * @param TypingData input typing
22
+ * @param req request object from which the enum strings to be replaced
23
+ */
24
+ export declare const convertEnumToInt: (inputTyping: TypingData, req: any) => any;
25
+ export {};
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.decodeBufferFields = exports.getKeys = exports.convertyCamelToSnakeCase = exports.capitalizeProtoName = void 0;
3
+ exports.convertEnumToInt = exports.updateJSON = exports.decodeBufferFields = exports.getKeys = exports.convertyCamelToSnakeCase = exports.capitalizeProtoName = void 0;
4
4
  const _ = require("lodash");
5
+ const registry_1 = require("./registry");
5
6
  const capitalizeProtoName = (name) => {
6
7
  return name.replace(/(?:\.|^|_)(\w)/g, v => v.toUpperCase()).replace(/[._]/g, '');
7
8
  };
@@ -48,3 +49,89 @@ const decodeBufferFields = (items, bufferFields) => {
48
49
  }
49
50
  };
50
51
  exports.decodeBufferFields = decodeBufferFields;
52
+ /**
53
+ * recursively find the path and updates the object with given value, this function
54
+ * also takes care to handle if there is an array at any position in the path
55
+ * @param path path in dot notation
56
+ * @param val value to be updated in Object
57
+ * @param obj Object
58
+ */
59
+ const updateJSON = (path, val, obj) => {
60
+ let fields = path.split('.');
61
+ let result = obj;
62
+ let j = 0;
63
+ for (let i = 0, n = fields.length; i < n && result !== undefined; i++) {
64
+ let field = fields[i];
65
+ if (i === n - 1) {
66
+ // reset value finally after iterating to the position (only if value already exists)
67
+ if (result[field]) {
68
+ const foundElement = val.find((e) => e.name === result[field]);
69
+ result[field] = foundElement === null || foundElement === void 0 ? void 0 : foundElement.number;
70
+ }
71
+ }
72
+ else {
73
+ if (_.isArray(result[field])) {
74
+ // till i < n concat new fields
75
+ let newField = '';
76
+ for (let k = i + 1; k < n; k++) {
77
+ if (newField && !_.isEmpty(newField)) {
78
+ newField = newField + '.' + fields[k];
79
+ }
80
+ else {
81
+ newField = fields[k];
82
+ }
83
+ }
84
+ for (; j < result[field].length; j++) {
85
+ // recurisve call to update each element if its an array
86
+ exports.updateJSON(newField, val, result[field][j]);
87
+ }
88
+ }
89
+ else {
90
+ // update object till final path is reached
91
+ result = result[field];
92
+ }
93
+ }
94
+ }
95
+ };
96
+ exports.updateJSON = updateJSON;
97
+ /**
98
+ * converts enum string values to integers reading from the inputTyping
99
+ * @param TypingData input typing
100
+ * @param req request object from which the enum strings to be replaced
101
+ */
102
+ const convertEnumToInt = (inputTyping, req) => {
103
+ let enumMap = new Map();
104
+ // enumMap populated with key as enum name space type and value as the path (to replace from request object)
105
+ if (inputTyping) {
106
+ const gqlInputObject = inputTyping.input;
107
+ const gqlFields = gqlInputObject.getFields();
108
+ if (gqlFields) {
109
+ const fieldNames = Object.keys(gqlFields);
110
+ for (let fieldName of fieldNames) {
111
+ // gql fieldName from input is of format [IIoRestorecommerceResourcebaseSort!]
112
+ // below check is to remove `[` and `!]`
113
+ let fieldType = gqlFields[fieldName].type.toString();
114
+ if (fieldType.startsWith('[') && fieldType.endsWith('!]')) {
115
+ fieldType = fieldType.substring(1, fieldType.length - 2);
116
+ }
117
+ // if fieldType is not basic type, then check if its fieldType belongs to Enum
118
+ // if not get the object and make recursive check till no more objects are found
119
+ if (registry_1.scalarTypes.indexOf(fieldType) <= -1) {
120
+ enumMap = registry_1.recursiveEnumCheck(fieldType, enumMap, fieldName, []);
121
+ }
122
+ }
123
+ }
124
+ }
125
+ for (let [key, val] of enumMap) {
126
+ const enumNameSpace = registry_1.getNameSpaceTypeName(key);
127
+ if (enumNameSpace && typeof enumNameSpace === 'string') {
128
+ const enumTyping = registry_1.getTyping(enumNameSpace);
129
+ const enumIntMapping = (enumTyping === null || enumTyping === void 0 ? void 0 : enumTyping.meta).value;
130
+ if (enumIntMapping && _.isArray(enumIntMapping) && enumIntMapping.length > 0) {
131
+ exports.updateJSON(val, enumIntMapping, req);
132
+ }
133
+ }
134
+ }
135
+ return req;
136
+ };
137
+ exports.convertEnumToInt = convertEnumToInt;
@@ -55,7 +55,7 @@ export declare type ProtoIoRestorecommerceAccessControlResponse = {
55
55
  export declare type IoRestorecommerceAccessControlResponse = {
56
56
  __typename?: 'IoRestorecommerceAccessControlResponse';
57
57
  decision?: Maybe<IoRestorecommerceAccessControlResponseDecision>;
58
- obligation?: Maybe<Scalars['String']>;
58
+ obligation?: Maybe<Array<IoRestorecommerceAttributeAttribute>>;
59
59
  evaluationCacheable?: Maybe<Scalars['Boolean']>;
60
60
  operationStatus?: Maybe<IoRestorecommerceStatusOperationStatus>;
61
61
  };
@@ -65,6 +65,12 @@ export declare enum IoRestorecommerceAccessControlResponseDecision {
65
65
  NotApplicable = 2,
66
66
  Indeterminate = 3
67
67
  }
68
+ export declare type IoRestorecommerceAttributeAttribute = {
69
+ __typename?: 'IoRestorecommerceAttributeAttribute';
70
+ id?: Maybe<Scalars['String']>;
71
+ value?: Maybe<Scalars['String']>;
72
+ attribute?: Maybe<Array<IoRestorecommerceAttributeAttribute>>;
73
+ };
68
74
  export declare type IoRestorecommerceStatusOperationStatus = {
69
75
  __typename?: 'IoRestorecommerceStatusOperationStatus';
70
76
  code?: Maybe<Scalars['Int']>;
@@ -100,6 +106,7 @@ export declare type ProtoIoRestorecommerceAccessControlReverseQuery = {
100
106
  export declare type IoRestorecommerceAccessControlReverseQuery = {
101
107
  __typename?: 'IoRestorecommerceAccessControlReverseQuery';
102
108
  policySets?: Maybe<Array<IoRestorecommercePolicySetPolicySetRq>>;
109
+ obligation?: Maybe<Array<IoRestorecommerceAttributeAttribute>>;
103
110
  operationStatus?: Maybe<IoRestorecommerceStatusOperationStatus>;
104
111
  };
105
112
  export declare type IoRestorecommercePolicySetPolicySetRq = {
@@ -116,12 +123,6 @@ export declare type IoRestorecommerceRuleTarget = {
116
123
  resources?: Maybe<Array<IoRestorecommerceAttributeAttribute>>;
117
124
  action?: Maybe<Array<IoRestorecommerceAttributeAttribute>>;
118
125
  };
119
- export declare type IoRestorecommerceAttributeAttribute = {
120
- __typename?: 'IoRestorecommerceAttributeAttribute';
121
- id?: Maybe<Scalars['String']>;
122
- value?: Maybe<Scalars['String']>;
123
- attribute?: Maybe<Array<IoRestorecommerceAttributeAttribute>>;
124
- };
125
126
  export declare type IoRestorecommercePolicyPolicyRq = {
126
127
  __typename?: 'IoRestorecommercePolicyPolicyRQ';
127
128
  id?: Maybe<Scalars['String']>;
@@ -525,6 +526,7 @@ export declare type ResolversTypes = ResolversObject<{
525
526
  ProtoIoRestorecommerceAccessControlResponse: ResolverTypeWrapper<ProtoIoRestorecommerceAccessControlResponse>;
526
527
  IoRestorecommerceAccessControlResponse: ResolverTypeWrapper<IoRestorecommerceAccessControlResponse>;
527
528
  IoRestorecommerceAccessControlResponseDecision: IoRestorecommerceAccessControlResponseDecision;
529
+ IoRestorecommerceAttributeAttribute: ResolverTypeWrapper<IoRestorecommerceAttributeAttribute>;
528
530
  String: ResolverTypeWrapper<Scalars['String']>;
529
531
  Boolean: ResolverTypeWrapper<Scalars['Boolean']>;
530
532
  IoRestorecommerceStatusOperationStatus: ResolverTypeWrapper<IoRestorecommerceStatusOperationStatus>;
@@ -539,7 +541,6 @@ export declare type ResolversTypes = ResolversObject<{
539
541
  IoRestorecommerceAccessControlReverseQuery: ResolverTypeWrapper<IoRestorecommerceAccessControlReverseQuery>;
540
542
  IoRestorecommercePolicySetPolicySetRQ: ResolverTypeWrapper<IoRestorecommercePolicySetPolicySetRq>;
541
543
  IoRestorecommerceRuleTarget: ResolverTypeWrapper<IoRestorecommerceRuleTarget>;
542
- IoRestorecommerceAttributeAttribute: ResolverTypeWrapper<IoRestorecommerceAttributeAttribute>;
543
544
  IoRestorecommercePolicyPolicyRQ: ResolverTypeWrapper<IoRestorecommercePolicyPolicyRq>;
544
545
  IoRestorecommerceRuleRuleRQ: ResolverTypeWrapper<IoRestorecommerceRuleRuleRq>;
545
546
  IoRestorecommerceRuleEffect: IoRestorecommerceRuleEffect;
@@ -605,6 +606,7 @@ export declare type ResolversParentTypes = ResolversObject<{
605
606
  AccessControlAccessControlQuery: AccessControlAccessControlQuery;
606
607
  ProtoIoRestorecommerceAccessControlResponse: ProtoIoRestorecommerceAccessControlResponse;
607
608
  IoRestorecommerceAccessControlResponse: IoRestorecommerceAccessControlResponse;
609
+ IoRestorecommerceAttributeAttribute: IoRestorecommerceAttributeAttribute;
608
610
  String: Scalars['String'];
609
611
  Boolean: Scalars['Boolean'];
610
612
  IoRestorecommerceStatusOperationStatus: IoRestorecommerceStatusOperationStatus;
@@ -619,7 +621,6 @@ export declare type ResolversParentTypes = ResolversObject<{
619
621
  IoRestorecommerceAccessControlReverseQuery: IoRestorecommerceAccessControlReverseQuery;
620
622
  IoRestorecommercePolicySetPolicySetRQ: IoRestorecommercePolicySetPolicySetRq;
621
623
  IoRestorecommerceRuleTarget: IoRestorecommerceRuleTarget;
622
- IoRestorecommerceAttributeAttribute: IoRestorecommerceAttributeAttribute;
623
624
  IoRestorecommercePolicyPolicyRQ: IoRestorecommercePolicyPolicyRq;
624
625
  IoRestorecommerceRuleRuleRQ: IoRestorecommerceRuleRuleRq;
625
626
  IoRestorecommerceRuleContextQuery: IoRestorecommerceRuleContextQuery;
@@ -690,7 +691,7 @@ export declare type ProtoIoRestorecommerceAccessControlResponseResolvers<Context
690
691
  }>;
691
692
  export declare type IoRestorecommerceAccessControlResponseResolvers<ContextType = AccessControlContext, ParentType extends ResolversParentTypes['IoRestorecommerceAccessControlResponse'] = ResolversParentTypes['IoRestorecommerceAccessControlResponse']> = ResolversObject<{
692
693
  decision?: Resolver<Maybe<ResolversTypes['IoRestorecommerceAccessControlResponseDecision']>, ParentType, ContextType>;
693
- obligation?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
694
+ obligation?: Resolver<Maybe<Array<ResolversTypes['IoRestorecommerceAttributeAttribute']>>, ParentType, ContextType>;
694
695
  evaluationCacheable?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
695
696
  operationStatus?: Resolver<Maybe<ResolversTypes['IoRestorecommerceStatusOperationStatus']>, ParentType, ContextType>;
696
697
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
@@ -701,6 +702,12 @@ export declare type IoRestorecommerceAccessControlResponseDecisionResolvers = {
701
702
  NOT_APPLICABLE: 2;
702
703
  INDETERMINATE: 3;
703
704
  };
705
+ export declare type IoRestorecommerceAttributeAttributeResolvers<ContextType = AccessControlContext, ParentType extends ResolversParentTypes['IoRestorecommerceAttributeAttribute'] = ResolversParentTypes['IoRestorecommerceAttributeAttribute']> = ResolversObject<{
706
+ id?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
707
+ value?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
708
+ attribute?: Resolver<Maybe<Array<ResolversTypes['IoRestorecommerceAttributeAttribute']>>, ParentType, ContextType>;
709
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
710
+ }>;
704
711
  export declare type IoRestorecommerceStatusOperationStatusResolvers<ContextType = AccessControlContext, ParentType extends ResolversParentTypes['IoRestorecommerceStatusOperationStatus'] = ResolversParentTypes['IoRestorecommerceStatusOperationStatus']> = ResolversObject<{
705
712
  code?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;
706
713
  message?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
@@ -715,6 +722,7 @@ export declare type ProtoIoRestorecommerceAccessControlReverseQueryResolvers<Con
715
722
  }>;
716
723
  export declare type IoRestorecommerceAccessControlReverseQueryResolvers<ContextType = AccessControlContext, ParentType extends ResolversParentTypes['IoRestorecommerceAccessControlReverseQuery'] = ResolversParentTypes['IoRestorecommerceAccessControlReverseQuery']> = ResolversObject<{
717
724
  policySets?: Resolver<Maybe<Array<ResolversTypes['IoRestorecommercePolicySetPolicySetRQ']>>, ParentType, ContextType>;
725
+ obligation?: Resolver<Maybe<Array<ResolversTypes['IoRestorecommerceAttributeAttribute']>>, ParentType, ContextType>;
718
726
  operationStatus?: Resolver<Maybe<ResolversTypes['IoRestorecommerceStatusOperationStatus']>, ParentType, ContextType>;
719
727
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
720
728
  }>;
@@ -732,12 +740,6 @@ export declare type IoRestorecommerceRuleTargetResolvers<ContextType = AccessCon
732
740
  action?: Resolver<Maybe<Array<ResolversTypes['IoRestorecommerceAttributeAttribute']>>, ParentType, ContextType>;
733
741
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
734
742
  }>;
735
- export declare type IoRestorecommerceAttributeAttributeResolvers<ContextType = AccessControlContext, ParentType extends ResolversParentTypes['IoRestorecommerceAttributeAttribute'] = ResolversParentTypes['IoRestorecommerceAttributeAttribute']> = ResolversObject<{
736
- id?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
737
- value?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
738
- attribute?: Resolver<Maybe<Array<ResolversTypes['IoRestorecommerceAttributeAttribute']>>, ParentType, ContextType>;
739
- __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
740
- }>;
741
743
  export declare type IoRestorecommercePolicyPolicyRqResolvers<ContextType = AccessControlContext, ParentType extends ResolversParentTypes['IoRestorecommercePolicyPolicyRQ'] = ResolversParentTypes['IoRestorecommercePolicyPolicyRQ']> = ResolversObject<{
742
744
  id?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
743
745
  target?: Resolver<Maybe<ResolversTypes['IoRestorecommerceRuleTarget']>, ParentType, ContextType>;
@@ -977,13 +979,13 @@ export declare type Resolvers<ContextType = AccessControlContext> = ResolversObj
977
979
  ProtoIoRestorecommerceAccessControlResponse?: ProtoIoRestorecommerceAccessControlResponseResolvers<ContextType>;
978
980
  IoRestorecommerceAccessControlResponse?: IoRestorecommerceAccessControlResponseResolvers<ContextType>;
979
981
  IoRestorecommerceAccessControlResponseDecision?: IoRestorecommerceAccessControlResponseDecisionResolvers;
982
+ IoRestorecommerceAttributeAttribute?: IoRestorecommerceAttributeAttributeResolvers<ContextType>;
980
983
  IoRestorecommerceStatusOperationStatus?: IoRestorecommerceStatusOperationStatusResolvers<ContextType>;
981
984
  Upload?: GraphQLScalarType;
982
985
  ProtoIoRestorecommerceAccessControlReverseQuery?: ProtoIoRestorecommerceAccessControlReverseQueryResolvers<ContextType>;
983
986
  IoRestorecommerceAccessControlReverseQuery?: IoRestorecommerceAccessControlReverseQueryResolvers<ContextType>;
984
987
  IoRestorecommercePolicySetPolicySetRQ?: IoRestorecommercePolicySetPolicySetRqResolvers<ContextType>;
985
988
  IoRestorecommerceRuleTarget?: IoRestorecommerceRuleTargetResolvers<ContextType>;
986
- IoRestorecommerceAttributeAttribute?: IoRestorecommerceAttributeAttributeResolvers<ContextType>;
987
989
  IoRestorecommercePolicyPolicyRQ?: IoRestorecommercePolicyPolicyRqResolvers<ContextType>;
988
990
  IoRestorecommerceRuleRuleRQ?: IoRestorecommerceRuleRuleRqResolvers<ContextType>;
989
991
  IoRestorecommerceRuleEffect?: IoRestorecommerceRuleEffectResolvers;