@izara_project/izara-core-library-service-schemas 1.0.61 → 1.0.62

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@izara_project/izara-core-library-service-schemas",
3
- "version": "1.0.61",
3
+ "version": "1.0.62",
4
4
  "description": "Schemas for the service and objects it controls",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -20,15 +20,15 @@
20
20
  "testEnvironment": "node"
21
21
  },
22
22
  "dependencies": {
23
- "@aws-sdk/client-lambda": "^3.787.0",
24
- "@aws-sdk/client-s3": "^3.787.0",
25
- "@aws-sdk/crc64-nvme-crt": "^3.787.0",
23
+ "@aws-sdk/client-lambda": "^3.812.0",
24
+ "@aws-sdk/client-s3": "^3.815.0",
25
+ "@aws-sdk/crc64-nvme-crt": "^3.815.0",
26
26
  "@izara_project/izara-core-library-core": "^1.0.19",
27
- "@izara_project/izara-core-library-external-request": "^1.0.19",
27
+ "@izara_project/izara-core-library-external-request": "^1.0.20",
28
28
  "@izara_project/izara-core-library-lambda": "^1.0.4",
29
29
  "@izara_project/izara-core-library-logger": "^1.0.7",
30
- "@izara_project/izara-shared-service-schemas": "^1.0.10",
31
- "glob": "^11.0.1",
30
+ "@izara_project/izara-shared-service-schemas": "^1.0.12",
31
+ "glob": "^11.0.2",
32
32
  "lodash": "^4.17.21",
33
33
  "object-hash": "^3.0.0",
34
34
  "read-yaml-file": "^2.1.0"
@@ -435,13 +435,21 @@ async function _processObjectLinksGroup(_izContext, relationshipTag, objectLinks
435
435
  direction
436
436
  );
437
437
 
438
+ let linkStorageResources = newLinkRelSchema.storageResourceTags.reduce((acc, tag) => {
439
+ const storageResource = relationshipSchema.storageResources[tag];
440
+ if (storageResource) {
441
+ acc[tag] = storageResource;
442
+ }
443
+ return acc;
444
+ }, {});
445
+
438
446
  // Build link object structure
439
447
  const link = {
440
448
  relType: {
441
449
  relationshipTag: relType.relationshipTag,
442
450
  serviceTag: relType.serviceTag
443
451
  },
444
- storageResourceTags: storageResourceTags,
452
+ storageResources: linkStorageResources,
445
453
  from: newLinkRelSchema.from,
446
454
  to: newLinkRelSchema.to,
447
455
  canDelete: newLinkRelSchema.canDelete,
@@ -503,8 +511,8 @@ async function _processObjectLinksGroup(_izContext, relationshipTag, objectLinks
503
511
  relationshipSchema.links.push(newLinkRelSchema);
504
512
  linkByLinkTypeIds.push({ linkTypeId, link });
505
513
 
506
- _izContext.logger.debug('relationshipSchema:', relationshipSchema);
507
- _izContext.logger.debug('linkByLinkTypeIds:', linkByLinkTypeIds);
514
+ // _izContext.logger.debug('relationshipSchema:', relationshipSchema);
515
+ // _izContext.logger.debug('linkByLinkTypeIds:', linkByLinkTypeIds);
508
516
 
509
517
  } catch (error) {
510
518
  _izContext.logger.error('Error in addLinks:', error);
package/src/Utils.js CHANGED
@@ -264,10 +264,11 @@ function validateAddOnDataStructure(_izContext, objectSchema) {
264
264
  const storageResources = objectSchema.storageResources;
265
265
  const storageTags = storageResources ? new Set(Object.keys(storageResources)) : new Set();
266
266
 
267
- const allowedAddOnDataStructures = new Set(["versionedData", "attributeTree", "propertyNode", "translation"]);
267
+ const allowedAddOnDataStructures = new Set(["versionedData", "attributeTree", "propertyNode", "translation", "propertyValue"]);
268
268
 
269
269
  let errors = [];
270
270
  let fieldNameCollection = Object.keys(objectSchema.fieldNames || {});
271
+ let attriutebuteTreeTags = [];
271
272
 
272
273
  if (objectSchema.addOnDataStructure?.length) {
273
274
  for (const [idx, addOn] of objectSchema.addOnDataStructure.entries()) {
@@ -378,10 +379,17 @@ function validateRelationshipSchema(_izContext, relationshipSchema) {
378
379
  if (link.from?.requiredOnCreate === true && link.to?.requiredOnCreate === true) {
379
380
  errors.push(`Relationship:${relationshipTag}/links/${linkIdx}, requiredOnCreate should exists in one of 'from' or 'to'`);
380
381
  }
382
+
383
+ for (const direction of Object.keys(link)) {
384
+ if (direction === "from" || direction === "to") {
385
+ if (link[direction]?.requiredOnCreate === true && link[switchDirection(direction)].linkType === "many") {
386
+ errors.push(`Relationship:${relationshipTag}/link/${linkIdx}/${switchDirection(direction)}.linkType must be one if ${direction}.requiredOnCreate = ${link[direction].requiredOnCreate}`)
387
+ }
388
+ }
389
+ }
381
390
  }
382
391
  }
383
392
 
384
-
385
393
  if (errors.length) {
386
394
  return [false, errors];
387
395
  } else {
@@ -395,7 +403,6 @@ function validateRelationshipSchema(_izContext, relationshipSchema) {
395
403
  }
396
404
  }
397
405
 
398
-
399
406
  function validateRefRelationshipSchema(_izContext, refRelationshipSchema, serviceTag) {
400
407
  let validateStatus = validateObject(refRelationshipBasicSchema, refRelationshipSchema, null, { strict: false });
401
408
  if (validateStatus.pass) {
@@ -606,6 +613,13 @@ function validateBasicFlowSchema(_izContext, flowSchema) {
606
613
  }
607
614
  }
608
615
 
616
+ function switchDirection(direction) {
617
+ if (direction === "from") {
618
+ return "to"
619
+ } else if (direction === "to") {
620
+ return "from"
621
+ }
622
+ }
609
623
 
610
624
  module.exports = {
611
625
  createObjType,
@@ -16,90 +16,135 @@ along with this program.If not, see < http://www.gnu.org/licenses/>.
16
16
  */
17
17
 
18
18
  'use strict';
19
- const { createRelTypeConcat, createLinkTypeId } = require('../Utils')
20
- const { findLinksByObjTypes } = require('./RelSchemaLib')
19
+ const { createRelTypeConcat, createLinkTypeId } = require('../Utils');
21
20
  const getObjectSchema = require('../GetObjectSchema');
21
+ const serviceConfig = require('../ServiceConfig');
22
+ const { STORAGE_TYPES } = require('../Consts')
22
23
 
23
- async function validateRelationshipDirection(_izContext, objType, relationshipProperties) {
24
- _izContext.logger.debug("function validateRelationshipDirection::", { objType, relationshipProperties });
24
+ async function validateRequiredOnCreateLinks(_izContext, objType, relationships, settings = {}) {
25
+ _izContext.logger.debug("validateRequiredOnCreateLinks:::", { objType, relationships, settings })
26
+ let errorFound = [];
25
27
 
26
- let getObjectRelationship = await getObjectSchema.getRelationshipSchemaWithCache(
27
- _izContext,
28
- relationshipProperties.relType
29
- )
30
- _izContext.logger.debug("getObjectRelationship", getObjectRelationship);
28
+ let requiredOnCreateLinks = await getObjectSchema.getRequiredOnCreateLinksWithCache(_izContext, objType)
29
+ _izContext.logger.debug("requiredOnCreateLinks::", requiredOnCreateLinks)
31
30
 
32
- let errorsFound = [];
33
- let checkCorrectLinks = [];
31
+ if (!requiredOnCreateLinks.length && relationships.length > 0) {
32
+ errorFound.push(`not have requireOnCreate will not create relationship: ${JSON.stringify(relationships)}`)
33
+ }
34
34
 
35
- for (const relationshipLink of Object.values(getObjectRelationship.links)) {
36
- if (relationshipLink.from.linkType === "many" && relationshipLink.to.linkType === "many") {
37
- if (relationshipLink.from.requiredOnCreate === true || relationshipLink.to.requiredOnCreate === true) {
38
- errorsFound.push("error many to many linkType can't have requireOnCreate === true")
35
+ let filteredRequiredOnCreateLinks = [];
36
+ if (settings.groupLinksByGraphServiceTag) {
37
+ await Promise.all(requiredOnCreateLinks.map(async requiredOnCreateLink => {
38
+
39
+ const serviceTags = await Promise.all(
40
+ requiredOnCreateLink.storageResourceTags.map(async (storageTag) => {
41
+ let storageResource = requiredOnCreateLink.storageResources[storageTag];
42
+ if (storageResource.storageType === STORAGE_TYPES.graph) {
43
+ return await serviceConfig.getGraphServiceTagWithCache(_izContext, storageResource.graphServerTag)
44
+ }
45
+ })
46
+ );
47
+
48
+ if (serviceTags.includes(settings.groupLinksByGraphServiceTag)) {
49
+ filteredRequiredOnCreateLinks.push(requiredOnCreateLink);
39
50
  }
40
- }
51
+ }))
52
+ } else {
53
+ filteredRequiredOnCreateLinks = requiredOnCreateLinks;
41
54
  }
42
- const links = await findLinksByObjTypes(_izContext, [objType, relationshipProperties.targetObjType], getObjectRelationship.links);
43
- _izContext.logger.debug("links", links)
44
55
 
45
- if (!links.length) {
46
- errorsFound.push(`not found link between ${JSON.stringify({ mainObjType: objType })} and ${JSON.stringify({ toObjType: relationshipProperties.targetObjType })} `)
47
- }
56
+ let requiredOnCreateLinkGroups = groupRequiredOnCreateLink(_izContext, filteredRequiredOnCreateLinks);
57
+ _izContext.logger.debug("requiredOnCreateLinkGroups::", requiredOnCreateLinkGroups);
48
58
 
49
- for (let link of links) {
50
- const { serviceTag: fromServiceTag, objectType: fromObjectType } = objType;
51
- const { serviceTag: toServiceTag, objectType: toObjectType } = relationshipProperties.targetObjType
59
+ let requiredOnCreateRelTypeConcats = createRelTypeConcatWithDirection(_izContext, requiredOnCreateLinkGroups)
60
+ let validateOnCreateRelationships = new Set();
61
+ _izContext.logger.debug("start validate relationship from requestParams")
62
+ for (const relationship of relationships) {
63
+ // validate all relationship in requestParams
64
+ let relTypeConcat = createRelTypeConcat(_izContext, relationship.relType)
52
65
 
53
- const { serviceTag: firstServiceTag, objectType: firstObjectType } = link.from.objType;
54
- const { serviceTag: secondServiceTag, objectType: secondObjectType } = link.to.objType
66
+ if (!requiredOnCreateLinkGroups[relTypeConcat]) {
67
+ errorFound.push(`cannot create relationship ${relTypeConcat}`)
68
+ break;
69
+ }
55
70
 
56
- const matchesFromTo =
57
- fromServiceTag === firstServiceTag && fromObjectType === firstObjectType &&
58
- toServiceTag === secondServiceTag && toObjectType === secondObjectType;
71
+ // match requiredOnCreateLinks with relationshipDirection from requestParams
72
+ const usedLinkGroup = requiredOnCreateLinkGroups[relTypeConcat][relationship.relationshipDirection];
59
73
 
60
- const matchesToFrom =
61
- fromServiceTag === secondServiceTag && fromObjectType === secondObjectType &&
62
- toServiceTag === firstServiceTag && toObjectType === firstObjectType
74
+ if (!usedLinkGroup.length) {
75
+ errorFound.push(`cannot create relationship ${relTypeConcat}`)
76
+ break;
77
+ }
63
78
 
64
- if ((relationshipProperties.relationshipDirection === "from" && matchesFromTo) ||
65
- (relationshipProperties.relationshipDirection === "to" && matchesToFrom)) {
66
- checkCorrectLinks.push(true)
67
- } else {
68
- checkCorrectLinks.push(false)
79
+ for (let link of usedLinkGroup) {
80
+ // check other with targetObjType, check linkType of other should be 'one',
81
+ if (link.other.objType.objectType === relationship.targetObjType.objectType) {
82
+ if (link.other.linkType === "one") {
83
+ if (!validateOnCreateRelationships.has(`${relTypeConcat}_${relationship.relationshipDirection}`)) {
84
+ validateOnCreateRelationships.add(`${relTypeConcat}_${relationship.relationshipDirection}`)
85
+ } else {
86
+ errorFound.push(`unexpected dulicate relationship link ${JSON.stringify(relationship)}`)
87
+ break;
88
+ }
89
+ } else {
90
+ errorFound.push(`invalid linkType should not be many when base: ${link} is requiredOnCreated`)
91
+ break;
92
+ }
93
+ }
69
94
  }
70
95
  }
71
96
 
72
- for (const [index, checkCorrectLink] of checkCorrectLinks.entries()) {
73
- if (checkCorrectLink === false) {
74
- errorsFound.push(`relationship direction ${JSON.stringify(requestParams.relationships[index])} is invalid`)
97
+ _izContext.logger.debug("requiredOnCreateRelTypeConcat", requiredOnCreateRelTypeConcats)
98
+ _izContext.logger.debug("validatedRelationships", validateOnCreateRelationships)
99
+
100
+ for (const requiredOnCreateRelTypeConcat of requiredOnCreateRelTypeConcats) {
101
+ if (!validateOnCreateRelationships.has(requiredOnCreateRelTypeConcat)) {
102
+ errorFound.push(`missing requiredOnCreate relationship ${requiredOnCreateRelTypeConcat}`)
75
103
  }
76
104
  }
77
- return errorsFound;
105
+
106
+ return errorFound;
78
107
  }
79
108
 
80
- function grouplinkRequireOnCreateByRelType(_izContext, links) {
109
+ function groupRequiredOnCreateLink(_izContext, relationshipSchemas) {
81
110
  let groupLink = {};
82
- for (let link of links) {
83
- let relTypeConcat = createRelTypeConcat(_izContext, link.relType);
111
+ for (let relationshipSchema of relationshipSchemas) {
112
+ let relTypeConcat = createRelTypeConcat(_izContext, relationshipSchema.relType);
84
113
  if (!groupLink.hasOwnProperty(relTypeConcat)) {
85
114
  Object.assign(groupLink, {
86
115
  [relTypeConcat]: {
87
116
  from: [],
88
117
  to: []
89
118
  }
90
- }
91
- )
119
+ })
92
120
  }
93
121
 
94
- if (link.base.direction === "from") {
95
- groupLink[relTypeConcat].from.push(link)
96
- } else {
97
- groupLink[relTypeConcat].to.push(link)
122
+ if (relationshipSchema.base.direction === "from") {
123
+ groupLink[relTypeConcat].from.push(relationshipSchema)
124
+ } else if (relationshipSchema.base.direction === "to") {
125
+ groupLink[relTypeConcat].to.push(relationshipSchema)
98
126
  }
99
127
  }
100
128
  return groupLink
101
129
  }
102
130
 
131
+ function createRelTypeConcatWithDirection(_izContext, link) {
132
+ // console.log("createRelTypeConcat", { link })
133
+ let relTypeConcatSet = new Set();
134
+ for (const [relTypeConcat, direction] of Object.entries(link)) {
135
+ if (direction.from.length) {
136
+ relTypeConcatSet.add(`${relTypeConcat}_from`)
137
+ }
138
+
139
+ if (direction.to.length) {
140
+ relTypeConcatSet.add(`${relTypeConcat}_to`)
141
+ }
142
+
143
+
144
+ }
145
+ return relTypeConcatSet
146
+ }
147
+
103
148
  function createLinkTypeIdFromLinkGroup(_izContext, linkGroup) {
104
149
  let linkTypeIds = new Set();
105
150
  for (const objectRelationshipGroup of Object.values(linkGroup)) {
@@ -121,11 +166,19 @@ function createLinkTypeIdFromLinkGroup(_izContext, linkGroup) {
121
166
  return [...linkTypeIds]
122
167
  }
123
168
 
124
- function validateLinkTypeFromObjectRelLink(_izContext, links) {
125
-
169
+
170
+ function switchDirection(direction) {
171
+ if (direction === "from") {
172
+ return "to"
173
+ } else if (direction === "to") {
174
+ return "from"
175
+ }
126
176
  }
177
+
127
178
  module.exports = {
128
- validateRelationshipDirection,
129
- grouplinkRequireOnCreateByRelType,
130
- createLinkTypeIdFromLinkGroup
179
+ validateRequiredOnCreateLinks,
180
+ groupRequiredOnCreateLink,
181
+ createLinkTypeIdFromLinkGroup,
182
+ switchDirection,
183
+ createRelTypeConcatWithDirection
131
184
  }
@@ -380,13 +380,20 @@ function generateLinksDataPerLinkTypeId(_izContext, relationshipTag, relationshi
380
380
  "from"
381
381
  );
382
382
 
383
+ let linkStorageResources = link.storageResourceTags.reduce((acc, storageResourceTag) => {
384
+ if (storageResources.hasOwnProperty(storageResourceTag)) {
385
+ acc[storageResourceTag] = storageResources[storageResourceTag];
386
+ }
387
+ return acc;
388
+ }, {});
383
389
 
384
390
  linksData[linkTypeId] = {
385
391
  relType: {
386
392
  relationshipTag,
387
393
  serviceTag: process.env.iz_serviceTag
388
394
  },
389
- storageResources: storageResources,
395
+ canDelete: link.canDelete || false,
396
+ storageResources: linkStorageResources,
390
397
  from: link.from,
391
398
  to: link.to
392
399
  };