@twin.org/auditable-item-graph-service 0.0.3-next.14 → 0.0.3-next.15

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.
@@ -1,6 +1,6 @@
1
1
  // Copyright 2024 IOTA Stiftung.
2
2
  // SPDX-License-Identifier: Apache-2.0.
3
- import { AuditableItemGraphContexts, AuditableItemGraphDataTypes, AuditableItemGraphTopics, AuditableItemGraphTypes, VerifyDepth } from "@twin.org/auditable-item-graph-models";
3
+ import { AuditableItemGraphContexts, AuditableItemGraphDataTypes, AuditableItemGraphMetricIds, AuditableItemGraphMetrics, AuditableItemGraphTopics, AuditableItemGraphTypes, VerifyDepth } from "@twin.org/auditable-item-graph-models";
4
4
  import { ContextIdKeys, ContextIdStore } from "@twin.org/context";
5
5
  import { ArrayHelper, Coerce, ComponentFactory, GeneralError, Guards, Is, JsonHelper, NotFoundError, ObjectHelper, RandomHelper, StringHelper, Urn, Validation } from "@twin.org/core";
6
6
  import { DataTypeHelper } from "@twin.org/data-core";
@@ -9,6 +9,7 @@ import { ComparisonOperator, LogicalOperator, SortDirection } from "@twin.org/en
9
9
  import { EntityStorageConnectorFactory } from "@twin.org/entity-storage-models";
10
10
  import { ImmutableProofContexts, ImmutableProofFailure, ImmutableProofTypes } from "@twin.org/immutable-proof-models";
11
11
  import { SchemaOrgContexts, SchemaOrgDataTypes, SchemaOrgTypes } from "@twin.org/standards-schema-org";
12
+ import { MetricHelper } from "@twin.org/telemetry-models";
12
13
  /**
13
14
  * Class for performing auditable item graph operations.
14
15
  */
@@ -61,6 +62,11 @@ export class AuditableItemGraphService {
61
62
  * @internal
62
63
  */
63
64
  _eventBusComponent;
65
+ /**
66
+ * The telemetry component.
67
+ * @internal
68
+ */
69
+ _telemetryComponent;
64
70
  /**
65
71
  * Create a new instance of AuditableItemGraphService.
66
72
  * @param options The dependencies for the auditable item graph connector.
@@ -69,9 +75,8 @@ export class AuditableItemGraphService {
69
75
  this._immutableProofComponent = ComponentFactory.get(options?.immutableProofComponentType ?? "immutable-proof");
70
76
  this._vertexStorage = EntityStorageConnectorFactory.get(options?.vertexEntityStorageType ?? "auditable-item-graph-vertex");
71
77
  this._changesetStorage = EntityStorageConnectorFactory.get(options?.changesetEntityStorageType ?? "auditable-item-graph-changeset");
72
- if (Is.stringValue(options?.eventBusComponentType)) {
73
- this._eventBusComponent = ComponentFactory.get(options.eventBusComponentType);
74
- }
78
+ this._eventBusComponent = ComponentFactory.getIfExists(options?.eventBusComponentType);
79
+ this._telemetryComponent = ComponentFactory.getIfExists(options?.telemetryComponentType);
75
80
  SchemaOrgDataTypes.registerRedirects();
76
81
  AuditableItemGraphDataTypes.registerTypes();
77
82
  JsonLdDataTypes.registerTypes();
@@ -83,6 +88,15 @@ export class AuditableItemGraphService {
83
88
  className() {
84
89
  return AuditableItemGraphService.CLASS_NAME;
85
90
  }
91
+ /**
92
+ * Register all AIG metrics with the telemetry component.
93
+ */
94
+ async start() {
95
+ if (Is.undefined(this._telemetryComponent)) {
96
+ return;
97
+ }
98
+ await MetricHelper.createMetrics(this._telemetryComponent, AuditableItemGraphMetrics);
99
+ }
86
100
  /**
87
101
  * Create a new graph vertex.
88
102
  * @param vertex The vertex to create.
@@ -130,6 +144,7 @@ export class AuditableItemGraphService {
130
144
  ...vertexModel,
131
145
  ...this.buildIndexes(vertexModel)
132
146
  });
147
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.VerticesCreated);
133
148
  const fullId = new Urn(AuditableItemGraphService.NAMESPACE, id).toString();
134
149
  await this._eventBusComponent?.publish(AuditableItemGraphTopics.VertexCreated, { id: fullId });
135
150
  return fullId;
@@ -196,6 +211,9 @@ export class AuditableItemGraphService {
196
211
  ...newEntity,
197
212
  ...indexes
198
213
  });
214
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.VerticesUpdated, {
215
+ patchCount: patches.length
216
+ });
199
217
  await this._eventBusComponent?.publish(AuditableItemGraphTopics.VertexUpdated, { id: vertex.id, patches });
200
218
  }
201
219
  }
@@ -292,6 +310,14 @@ export class AuditableItemGraphService {
292
310
  throw new NotFoundError(AuditableItemGraphService.CLASS_NAME, "vertexNotFound", id);
293
311
  }
294
312
  const chunk = await this.verifyChangesetChunk(vertexId, options?.verifySignatureDepth ?? VerifyDepth.None, cursor, limit);
313
+ if ((options?.verifySignatureDepth ?? VerifyDepth.None) !== VerifyDepth.None) {
314
+ if (chunk.verified) {
315
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.VerificationsSucceeded);
316
+ }
317
+ else {
318
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.VerificationsFailed);
319
+ }
320
+ }
295
321
  const changesetList = {
296
322
  "@context": [
297
323
  SchemaOrgContexts.Context,
@@ -345,6 +371,14 @@ export class AuditableItemGraphService {
345
371
  if (verifySignatureDepth !== VerifyDepth.None) {
346
372
  changesetModel["@context"]?.push(ImmutableProofContexts.Context);
347
373
  changesetModel.verification = await this.verifyChangesetSignature(changesetModel);
374
+ if (changesetModel.verification?.verified) {
375
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.VerificationsSucceeded);
376
+ }
377
+ else {
378
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.VerificationsFailed, {
379
+ failureReason: changesetModel.verification?.failure
380
+ });
381
+ }
348
382
  }
349
383
  const result = await JsonLdProcessor.compact(changesetModel, changesetModel["@context"]);
350
384
  return result;
@@ -578,6 +612,10 @@ export class AuditableItemGraphService {
578
612
  [SchemaOrgTypes.ItemListElement]: models
579
613
  };
580
614
  const result = await JsonLdProcessor.compact(vertexList, vertexList["@context"]);
615
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.QueriesExecuted, {
616
+ resultCount: models.length,
617
+ hasMore: Is.stringValue(results.cursor)
618
+ });
581
619
  return {
582
620
  entries: result,
583
621
  cursor: results.cursor
@@ -758,6 +796,7 @@ export class AuditableItemGraphService {
758
796
  for (const alias of active) {
759
797
  if (!aliases?.find(a => a.id === alias.id)) {
760
798
  alias.dateDeleted = context.now;
799
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.AliasesDeleted);
761
800
  }
762
801
  }
763
802
  }
@@ -803,6 +842,7 @@ export class AuditableItemGraphService {
803
842
  unique: alias.unique
804
843
  };
805
844
  vertex.aliases.push(model);
845
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.AliasesAdded);
806
846
  }
807
847
  else if (existing.aliasFormat !== alias.aliasFormat ||
808
848
  !ObjectHelper.equal(existing.annotationObject, alias.annotationObject, false) ||
@@ -812,6 +852,7 @@ export class AuditableItemGraphService {
812
852
  existing.aliasFormat = alias.aliasFormat;
813
853
  existing.annotationObject = alias.annotationObject;
814
854
  existing.unique = alias.unique;
855
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.AliasesModified);
815
856
  }
816
857
  }
817
858
  /**
@@ -838,6 +879,7 @@ export class AuditableItemGraphService {
838
879
  for (const resource of active) {
839
880
  if (!resources?.find(a => this.getResourceId(a) === this.getResourceId(resource))) {
840
881
  resource.dateDeleted = context.now;
882
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.ResourcesDeleted);
841
883
  }
842
884
  }
843
885
  }
@@ -872,11 +914,13 @@ export class AuditableItemGraphService {
872
914
  resourceObject: resource.resourceObject
873
915
  };
874
916
  vertex.resources.push(model);
917
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.ResourcesAdded);
875
918
  }
876
919
  else if (!ObjectHelper.equal(existing.resourceObject, resource.resourceObject, false)) {
877
920
  // Existing resource found, update the resourceObject.
878
921
  existing.dateModified = context.now;
879
922
  existing.resourceObject = resource.resourceObject;
923
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.ResourcesModified);
880
924
  }
881
925
  }
882
926
  /**
@@ -893,6 +937,7 @@ export class AuditableItemGraphService {
893
937
  for (const edge of active) {
894
938
  if (!edges?.find(e => Is.stringValue(e.id) && this.reduceEdgeId(e.id) === edge.id)) {
895
939
  edge.dateDeleted = context.now;
940
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.EdgesDeleted);
896
941
  }
897
942
  }
898
943
  }
@@ -944,6 +989,7 @@ export class AuditableItemGraphService {
944
989
  edgeRelationships: edge.edgeRelationships
945
990
  };
946
991
  vertex.edges.push(model);
992
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.EdgesAdded);
947
993
  }
948
994
  else if (existing.targetId !== edge.targetId ||
949
995
  !ArrayHelper.matches(existing.edgeRelationships, edge.edgeRelationships) ||
@@ -953,6 +999,7 @@ export class AuditableItemGraphService {
953
999
  existing.dateModified = context.now;
954
1000
  existing.edgeRelationships = edge.edgeRelationships;
955
1001
  existing.annotationObject = edge.annotationObject;
1002
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.EdgesModified);
956
1003
  }
957
1004
  }
958
1005
  /**
@@ -984,6 +1031,7 @@ export class AuditableItemGraphService {
984
1031
  changesetEntity.proofId = await this._immutableProofComponent.create(JsonLdHelper.toNodeObject(reducedChangesetJsonLd));
985
1032
  // Link the verifiable storage id to the changeset
986
1033
  await this._changesetStorage.set(changesetEntity);
1034
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.ChangesetsCreated);
987
1035
  return patches;
988
1036
  }
989
1037
  return [];
@@ -1008,6 +1056,12 @@ export class AuditableItemGraphService {
1008
1056
  }
1009
1057
  changesets.push(...chunk.changesets);
1010
1058
  } while (Is.stringValue(cursor));
1059
+ if (verified) {
1060
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.VerificationsSucceeded);
1061
+ }
1062
+ else {
1063
+ await MetricHelper.metricIncrement(this._telemetryComponent, AuditableItemGraphMetricIds.VerificationsFailed);
1064
+ }
1011
1065
  return {
1012
1066
  verified,
1013
1067
  changesets
@@ -1 +1 @@
1
- {"version":3,"file":"auditableItemGraphService.js","sourceRoot":"","sources":["../../src/auditableItemGraphService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tAuditableItemGraphContexts,\n\tAuditableItemGraphDataTypes,\n\tAuditableItemGraphTopics,\n\tAuditableItemGraphTypes,\n\tVerifyDepth,\n\ttype IAuditableItemGraphAlias,\n\ttype IAuditableItemGraphChangeset,\n\ttype IAuditableItemGraphChangesetList,\n\ttype IAuditableItemGraphComponent,\n\ttype IAuditableItemGraphEdge,\n\ttype IAuditableItemGraphEventBusVertexCreated,\n\ttype IAuditableItemGraphEventBusVertexUpdated,\n\ttype IAuditableItemGraphResource,\n\ttype IAuditableItemGraphVertex,\n\ttype IAuditableItemGraphVertexList,\n\ttype IAuditableItemGraphVertexVersionList\n} from \"@twin.org/auditable-item-graph-models\";\nimport { ContextIdKeys, ContextIdStore } from \"@twin.org/context\";\nimport {\n\tArrayHelper,\n\tCoerce,\n\tComponentFactory,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tJsonHelper,\n\tNotFoundError,\n\tObjectHelper,\n\tRandomHelper,\n\tStringHelper,\n\tUrn,\n\tValidation,\n\ttype IPatchOperation,\n\ttype IValidationFailure\n} from \"@twin.org/core\";\nimport { DataTypeHelper } from \"@twin.org/data-core\";\nimport {\n\tJsonLdDataTypes,\n\tJsonLdHelper,\n\tJsonLdProcessor,\n\ttype IJsonLdNodeObject\n} from \"@twin.org/data-json-ld\";\nimport {\n\tComparisonOperator,\n\tLogicalOperator,\n\tSortDirection,\n\ttype IComparator\n} from \"@twin.org/entity\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport type { IEventBusComponent } from \"@twin.org/event-bus-models\";\nimport {\n\tImmutableProofContexts,\n\tImmutableProofFailure,\n\tImmutableProofTypes,\n\ttype IImmutableProofComponent,\n\ttype IImmutableProofVerification\n} from \"@twin.org/immutable-proof-models\";\nimport { nameof, nameofKebabCase } from \"@twin.org/nameof\";\nimport {\n\tSchemaOrgContexts,\n\tSchemaOrgDataTypes,\n\tSchemaOrgTypes\n} from \"@twin.org/standards-schema-org\";\nimport type { AuditableItemGraphAlias } from \"./entities/auditableItemGraphAlias.js\";\nimport type { AuditableItemGraphChangeset } from \"./entities/auditableItemGraphChangeset.js\";\nimport type { AuditableItemGraphEdge } from \"./entities/auditableItemGraphEdge.js\";\nimport type { AuditableItemGraphResource } from \"./entities/auditableItemGraphResource.js\";\nimport type { AuditableItemGraphVertex } from \"./entities/auditableItemGraphVertex.js\";\nimport type { IAuditableItemGraphServiceConstructorOptions } from \"./models/IAuditableItemGraphServiceConstructorOptions.js\";\nimport type { IAuditableItemGraphServiceContext } from \"./models/IAuditableItemGraphServiceContext.js\";\n\n/**\n * Class for performing auditable item graph operations.\n */\nexport class AuditableItemGraphService implements IAuditableItemGraphComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<AuditableItemGraphService>();\n\n\t/**\n\t * The namespace for the service.\n\t * @internal\n\t */\n\tpublic static readonly NAMESPACE: string = \"aig\";\n\n\t/**\n\t * The namespace for the service changeset.\n\t */\n\tpublic static readonly NAMESPACE_CHANGESET: string = \"changeset\";\n\n\t/**\n\t * The namespace for the service edge.\n\t */\n\tpublic static readonly NAMESPACE_EDGE: string = \"edge\";\n\n\t/**\n\t * The keys to pick when creating the proof for the stream.\n\t * @internal\n\t */\n\tprivate static readonly _PROOF_KEYS_CHANGESET: (keyof AuditableItemGraphChangeset)[] = [\n\t\t\"id\",\n\t\t\"vertexId\",\n\t\t\"userIdentity\",\n\t\t\"dateCreated\",\n\t\t\"patches\"\n\t];\n\n\t/**\n\t * The immutable proof component.\n\t * @internal\n\t */\n\tprivate readonly _immutableProofComponent: IImmutableProofComponent;\n\n\t/**\n\t * The entity storage for vertices.\n\t * @internal\n\t */\n\tprivate readonly _vertexStorage: IEntityStorageConnector<AuditableItemGraphVertex>;\n\n\t/**\n\t * The entity storage for changesets.\n\t * @internal\n\t */\n\tprivate readonly _changesetStorage: IEntityStorageConnector<AuditableItemGraphChangeset>;\n\n\t/**\n\t * The event bus component.\n\t * @internal\n\t */\n\tprivate readonly _eventBusComponent?: IEventBusComponent;\n\n\t/**\n\t * Create a new instance of AuditableItemGraphService.\n\t * @param options The dependencies for the auditable item graph connector.\n\t */\n\tconstructor(options?: IAuditableItemGraphServiceConstructorOptions) {\n\t\tthis._immutableProofComponent = ComponentFactory.get(\n\t\t\toptions?.immutableProofComponentType ?? \"immutable-proof\"\n\t\t);\n\n\t\tthis._vertexStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.vertexEntityStorageType ?? nameofKebabCase<AuditableItemGraphVertex>()\n\t\t);\n\n\t\tthis._changesetStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.changesetEntityStorageType ?? nameofKebabCase<AuditableItemGraphChangeset>()\n\t\t);\n\n\t\tif (Is.stringValue(options?.eventBusComponentType)) {\n\t\t\tthis._eventBusComponent = ComponentFactory.get(options.eventBusComponentType);\n\t\t}\n\n\t\tSchemaOrgDataTypes.registerRedirects();\n\t\tAuditableItemGraphDataTypes.registerTypes();\n\t\tJsonLdDataTypes.registerTypes();\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn AuditableItemGraphService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Create a new graph vertex.\n\t * @param vertex The vertex to create.\n\t * @param vertex.annotationObject The annotation object for the vertex as JSON-LD.\n\t * @param vertex.aliases Alternative aliases that can be used to identify the vertex.\n\t * @param vertex.resources The resources attached to the vertex.\n\t * @param vertex.edges The edges connected to the vertex.\n\t * @returns The id of the new graph item.\n\t */\n\tpublic async create(vertex: Omit<IAuditableItemGraphVertex, \"id\">): Promise<string> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(vertex), vertex);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\ttry {\n\t\t\tconst id = RandomHelper.generateUuidV7(\"compact\");\n\n\t\t\tconst schemaValidationFailures: IValidationFailure[] = [];\n\t\t\tawait DataTypeHelper.validate(\n\t\t\t\tnameof(vertex),\n\t\t\t\t`${AuditableItemGraphContexts.Namespace}${AuditableItemGraphTypes.Vertex}`,\n\t\t\t\t{\n\t\t\t\t\t...vertex,\n\t\t\t\t\tid\n\t\t\t\t},\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(vertex),\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\n\t\t\tif (Is.object(vertex.annotationObject)) {\n\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\tawait JsonLdHelper.validate(vertex.annotationObject, validationFailures);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\tnameof(vertex.annotationObject),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst context: IAuditableItemGraphServiceContext = {\n\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\tcontextIds\n\t\t\t};\n\n\t\t\tconst vertexModel: AuditableItemGraphVertex = {\n\t\t\t\tid,\n\t\t\t\torganizationIdentity: contextIds?.[ContextIdKeys.Organization],\n\t\t\t\tdateCreated: context.now\n\t\t\t};\n\t\t\tconst originalEntity = ObjectHelper.clone(vertexModel);\n\n\t\t\tvertexModel.annotationObject = vertex.annotationObject;\n\n\t\t\tawait this.updateAliasList(context, vertexModel, vertex.aliases);\n\t\t\tawait this.updateResourceList(context, vertexModel, vertex.resources);\n\t\t\tawait this.updateEdgeList(context, vertexModel, vertex.edges);\n\n\t\t\tdelete originalEntity.aliasIndex;\n\t\t\tdelete originalEntity.resourceTypeIndex;\n\t\t\tawait this.addChangeset(context, originalEntity, vertexModel, true, 0);\n\n\t\t\tvertexModel.version = 0;\n\n\t\t\tawait this._vertexStorage.set({\n\t\t\t\t...vertexModel,\n\t\t\t\t...this.buildIndexes(vertexModel)\n\t\t\t});\n\n\t\t\tconst fullId = new Urn(AuditableItemGraphService.NAMESPACE, id).toString();\n\n\t\t\tawait this._eventBusComponent?.publish<IAuditableItemGraphEventBusVertexCreated>(\n\t\t\t\tAuditableItemGraphTopics.VertexCreated,\n\t\t\t\t{ id: fullId }\n\t\t\t);\n\n\t\t\treturn fullId;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"createFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Update a graph vertex.\n\t * @param vertex The vertex to update.\n\t * @param vertex.id The id of the vertex to update.\n\t * @param vertex.annotationObject The annotation object for the vertex as JSON-LD.\n\t * @param vertex.aliases Alternative aliases that can be used to identify the vertex.\n\t * @param vertex.resources The resources attached to the vertex.\n\t * @param vertex.edges The edges connected to the vertex.\n\t * @returns Nothing.\n\t */\n\tpublic async update(vertex: IAuditableItemGraphVertex): Promise<void> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(vertex), vertex);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(vertex.id), vertex.id);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\tconst urnParsed = Urn.fromValidString(vertex.id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid: vertex.id\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst schemaValidationFailures: IValidationFailure[] = [];\n\t\t\tawait DataTypeHelper.validate(\n\t\t\t\tnameof(vertex),\n\t\t\t\t`${AuditableItemGraphContexts.Namespace}${AuditableItemGraphTypes.Vertex}`,\n\t\t\t\tvertex,\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(vertex),\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", vertex.id);\n\t\t\t}\n\n\t\t\tif (Is.object(vertex.annotationObject)) {\n\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\tawait JsonLdHelper.validate(vertex.annotationObject, validationFailures);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\tnameof(vertex.annotationObject),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst context: IAuditableItemGraphServiceContext = {\n\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\tcontextIds\n\t\t\t};\n\n\t\t\tdelete vertexEntity.aliasIndex;\n\t\t\tconst originalEntity = ObjectHelper.clone(vertexEntity);\n\t\t\tconst newEntity = ObjectHelper.clone(vertexEntity);\n\n\t\t\tnewEntity.annotationObject = vertex.annotationObject;\n\n\t\t\tawait this.updateAliasList(context, newEntity, vertex.aliases);\n\t\t\tawait this.updateResourceList(context, newEntity, vertex.resources);\n\t\t\tawait this.updateEdgeList(context, newEntity, vertex.edges);\n\n\t\t\tconst nextVersion = Is.empty(vertexEntity.version)\n\t\t\t\t? (await this.internalGetChangesets(vertexId)).length\n\t\t\t\t: vertexEntity.version + 1;\n\t\t\tconst patches = await this.addChangeset(\n\t\t\t\tcontext,\n\t\t\t\toriginalEntity,\n\t\t\t\tnewEntity,\n\t\t\t\tfalse,\n\t\t\t\tnextVersion\n\t\t\t);\n\t\t\tif (patches.length > 0) {\n\t\t\t\tnewEntity.dateModified = context.now;\n\t\t\t\tnewEntity.version = nextVersion;\n\n\t\t\t\tconst indexes = this.buildIndexes(newEntity);\n\n\t\t\t\tawait this._vertexStorage.set({\n\t\t\t\t\t...newEntity,\n\t\t\t\t\t...indexes\n\t\t\t\t});\n\n\t\t\t\tawait this._eventBusComponent?.publish<IAuditableItemGraphEventBusVertexUpdated>(\n\t\t\t\t\tAuditableItemGraphTopics.VertexUpdated,\n\t\t\t\t\t{ id: vertex.id, patches }\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"updatingFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get a graph vertex.\n\t * @param id The id of the vertex to get.\n\t * @param options Additional options for the get operation.\n\t * @param options.includeDeleted Whether to include deleted/updated aliases, resource, edges, defaults to false.\n\t * @param options.verifySignatureDepth How many signatures to verify, defaults to \"none\".\n\t * @returns The vertex if found.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async get(\n\t\tid: string,\n\t\toptions?: {\n\t\t\tincludeDeleted?: boolean;\n\t\t\tverifySignatureDepth?: VerifyDepth;\n\t\t}\n\t): Promise<IAuditableItemGraphVertex> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tconst vertexModel = this.vertexEntityToJsonLd(vertexEntity);\n\n\t\t\tconst verifySignatureDepth = options?.verifySignatureDepth ?? VerifyDepth.None;\n\n\t\t\tlet verified: boolean | undefined;\n\n\t\t\tif (\n\t\t\t\tverifySignatureDepth === VerifyDepth.Current ||\n\t\t\t\tverifySignatureDepth === VerifyDepth.All\n\t\t\t) {\n\t\t\t\tconst verifyResult = await this.verifyChangesets(vertexModel, verifySignatureDepth);\n\t\t\t\tverified = verifyResult.verified;\n\t\t\t\tvertexModel[\"@context\"].push(ImmutableProofContexts.Context);\n\t\t\t}\n\n\t\t\tif (!(options?.includeDeleted ?? false)) {\n\t\t\t\tif (Is.arrayValue(vertexModel.aliases)) {\n\t\t\t\t\tvertexModel.aliases = vertexModel.aliases.filter(a => Is.undefined(a.dateDeleted));\n\t\t\t\t\tif (vertexModel.aliases.length === 0) {\n\t\t\t\t\t\tdelete vertexModel.aliases;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (Is.arrayValue(vertexModel.resources)) {\n\t\t\t\t\tvertexModel.resources = vertexModel.resources.filter(r => Is.undefined(r.dateDeleted));\n\t\t\t\t\tif (vertexModel.resources.length === 0) {\n\t\t\t\t\t\tdelete vertexModel.resources;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (Is.arrayValue(vertexModel.edges)) {\n\t\t\t\t\tvertexModel.edges = vertexModel.edges.filter(r => Is.undefined(r.dateDeleted));\n\t\t\t\t\tif (vertexModel.edges.length === 0) {\n\t\t\t\t\t\tdelete vertexModel.edges;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (verifySignatureDepth !== VerifyDepth.None) {\n\t\t\t\tvertexModel.verified = verified;\n\t\t\t}\n\n\t\t\tconst result = await JsonLdProcessor.compact(vertexModel, vertexModel[\"@context\"]);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get a graph vertex changeset list.\n\t * @param id The id of the vertex to get.\n\t * @param cursor The optional cursor to get next chunk.\n\t * @param limit Limit the number of entities to return.\n\t * @param options Additional options for the get operation.\n\t * @param options.verifySignatureDepth How many signatures to verify, defaults to \"none\".\n\t * @returns The vertex if found.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async getChangesets(\n\t\tid: string,\n\t\tcursor?: string,\n\t\tlimit?: number,\n\t\toptions?: {\n\t\t\tverifySignatureDepth?: VerifyDepth;\n\t\t}\n\t): Promise<{\n\t\tchangesets: IAuditableItemGraphChangesetList;\n\t\tcursor?: string;\n\t}> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tconst chunk = await this.verifyChangesetChunk(\n\t\t\t\tvertexId,\n\t\t\t\toptions?.verifySignatureDepth ?? VerifyDepth.None,\n\t\t\t\tcursor,\n\t\t\t\tlimit\n\t\t\t);\n\n\t\t\tconst changesetList: IAuditableItemGraphChangesetList = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.ChangesetList],\n\t\t\t\t[SchemaOrgTypes.ItemListElement]: chunk.changesets\n\t\t\t};\n\n\t\t\tconst result = await JsonLdProcessor.compact(changesetList, changesetList[\"@context\"]);\n\t\t\treturn {\n\t\t\t\tchangesets: result,\n\t\t\t\tcursor: chunk.cursor\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get a graph vertex changeset.\n\t * @param id The id of the vertex to get.\n\t * @param options Additional options for the get operation.\n\t * @param options.verifySignatureDepth How many signatures to verify, defaults to \"none\".\n\t * @returns The vertex if found.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async getChangeset(\n\t\tid: string,\n\t\toptions?: {\n\t\t\tverifySignatureDepth?: VerifyDepth;\n\t\t}\n\t): Promise<IAuditableItemGraphChangeset> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst namespaceSpecificParts = urnParsed.namespaceSpecificParts();\n\t\t\tconst vertexId = namespaceSpecificParts[0];\n\t\t\tconst changesetId = namespaceSpecificParts[2];\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tconst changesetEntity = await this._changesetStorage.get(changesetId);\n\t\t\tif (Is.empty(changesetEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"changesetNotFound\", id);\n\t\t\t}\n\n\t\t\tconst changesetModel = this.changesetEntityToJsonLd(vertexId, changesetEntity);\n\n\t\t\tconst verifySignatureDepth = options?.verifySignatureDepth ?? VerifyDepth.None;\n\t\t\tif (verifySignatureDepth !== VerifyDepth.None) {\n\t\t\t\tchangesetModel[\"@context\"]?.push(ImmutableProofContexts.Context);\n\t\t\t\tchangesetModel.verification = await this.verifyChangesetSignature(changesetModel);\n\t\t\t}\n\n\t\t\tconst result = await JsonLdProcessor.compact(changesetModel, changesetModel[\"@context\"]);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get a graph vertex at a specific version.\n\t * @param id The id of the vertex.\n\t * @param versionId The id of the version (changeset id) to retrieve.\n\t * @returns The vertex reconstructed at that version.\n\t * @throws NotFoundError if the vertex or version is not found.\n\t */\n\tpublic async getVersion(id: string, versionId: string): Promise<IAuditableItemGraphVertex> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(versionId), versionId);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tconst targetChangeset = await this._changesetStorage.get(versionId);\n\t\t\tif (Is.empty(targetChangeset) || targetChangeset.vertexId !== vertexId) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"versionNotFound\", versionId);\n\t\t\t}\n\n\t\t\tconst changesets = await this.internalGetChangesets(vertexId, {\n\t\t\t\tmaxVersion: targetChangeset.version\n\t\t\t});\n\n\t\t\tlet entityState: AuditableItemGraphVertex = {\n\t\t\t\tid: vertexEntity.id,\n\t\t\t\tdateCreated: vertexEntity.dateCreated,\n\t\t\t\torganizationIdentity: vertexEntity.organizationIdentity\n\t\t\t};\n\t\t\tfor (const changeset of changesets) {\n\t\t\t\tentityState = JsonHelper.patch(entityState, changeset.patches);\n\t\t\t}\n\n\t\t\tconst vertexModel = this.vertexEntityToJsonLd(entityState);\n\t\t\tvertexModel.version = targetChangeset.version;\n\n\t\t\tconst result = await JsonLdProcessor.compact(vertexModel, vertexModel[\"@context\"]);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"getVersionFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get all versions of a graph vertex.\n\t * @param id The id of the vertex.\n\t * @param options Additional options for the operation.\n\t * @param options.after Only return versions created after this ISO 8601 timestamp (exclusive).\n\t * @param options.before Only return versions created before this ISO 8601 timestamp (exclusive).\n\t * @returns The list of vertex versions.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async getVersions(\n\t\tid: string,\n\t\toptions?: {\n\t\t\tafter?: string;\n\t\t\tbefore?: string;\n\t\t}\n\t): Promise<IAuditableItemGraphVertexVersionList> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tconst beforeDate = Coerce.dateTime(options?.before);\n\t\t\tconst afterDate = Coerce.dateTime(options?.after);\n\n\t\t\tconst allChangesets = await this.internalGetChangesets(vertexId, {\n\t\t\t\tbefore: beforeDate?.toISOString()\n\t\t\t});\n\n\t\t\tconst versions: number[] = [];\n\t\t\tfor (const changeset of allChangesets) {\n\t\t\t\tconst changesetDate = Coerce.dateTime(changeset.dateCreated);\n\t\t\t\tconst afterExcluded =\n\t\t\t\t\t!Is.empty(afterDate) && !Is.empty(changesetDate) && changesetDate <= afterDate;\n\n\t\t\t\tif (!afterExcluded) {\n\t\t\t\t\tversions.push(changeset.version ?? 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst versionList: IAuditableItemGraphVertexVersionList = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.VertexVersionList],\n\t\t\t\t[SchemaOrgTypes.ItemListElement]: versions\n\t\t\t};\n\n\t\t\treturn await JsonLdProcessor.compact(versionList, versionList[\"@context\"]);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"getVersionsFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove the verifiable storage for an item.\n\t * @param id The id of the vertex to get.\n\t * @returns Nothing.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async removeVerifiable(id: string): Promise<void> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tlet changesetsResult;\n\t\t\tdo {\n\t\t\t\tchangesetsResult = await this._changesetStorage.query(\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: \"vertexId\",\n\t\t\t\t\t\tvalue: vertexId,\n\t\t\t\t\t\tcomparison: ComparisonOperator.Equals\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\t\t\t\tsortDirection: SortDirection.Ascending\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\tundefined,\n\t\t\t\t\tchangesetsResult?.cursor\n\t\t\t\t);\n\n\t\t\t\tfor (const changeset of changesetsResult.entities) {\n\t\t\t\t\tif (Is.stringValue(changeset.proofId)) {\n\t\t\t\t\t\tawait this._immutableProofComponent.removeVerifiable(changeset.proofId);\n\t\t\t\t\t\tdelete changeset.proofId;\n\t\t\t\t\t\tawait this._changesetStorage.set(changeset as AuditableItemGraphChangeset);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} while (Is.stringValue(changesetsResult.cursor));\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"removeVerifiableFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Query the graph for vertices.\n\t * @param options The query options.\n\t * @param options.id The optional id to look for.\n\t * @param options.idMode Look in id, alias or both, defaults to both.\n\t * @param options.idExact Find only exact matches, default to false meaning partial matching.\n\t * @param options.resourceTypes Include vertices with specific resource types.\n\t * @param conditions Conditions to use in the query.\n\t * @param orderBy The order for the results, defaults to created.\n\t * @param orderByDirection The direction for the order, defaults to desc.\n\t * @param properties The properties to return, if not provided defaults to id, created, aliases and object.\n\t * @param cursor The cursor to request the next chunk of entities.\n\t * @param limit Limit the number of entities to return.\n\t * @returns The entities, which can be partial if a limited keys list was provided.\n\t */\n\tpublic async query(\n\t\toptions?: {\n\t\t\tid?: string;\n\t\t\tidMode?: \"id\" | \"alias\" | \"both\";\n\t\t\tidExact?: boolean;\n\t\t\tresourceTypes?: string[];\n\t\t},\n\t\tconditions?: IComparator[],\n\t\torderBy?: keyof Pick<IAuditableItemGraphVertex, \"dateCreated\" | \"dateModified\">,\n\t\torderByDirection?: SortDirection,\n\t\tproperties?: (keyof IAuditableItemGraphVertex)[],\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tentries: IAuditableItemGraphVertexList;\n\t\tcursor?: string;\n\t}> {\n\t\ttry {\n\t\t\tconst propertiesToReturn: (keyof IAuditableItemGraphVertex)[] = properties ?? [\n\t\t\t\t\"id\",\n\t\t\t\t\"dateCreated\",\n\t\t\t\t\"dateModified\",\n\t\t\t\t\"aliases\",\n\t\t\t\t\"annotationObject\"\n\t\t\t];\n\t\t\tconst combinedConditions = conditions ?? [];\n\t\t\tconst orderProperty = orderBy ?? \"dateCreated\";\n\t\t\tconst orderDirection = orderByDirection ?? SortDirection.Descending;\n\t\t\tconst idExact = options?.idExact ?? false;\n\n\t\t\tconst idOrAlias = options?.id;\n\t\t\tif (Is.stringValue(idOrAlias)) {\n\t\t\t\tconst idMode = options?.idMode ?? \"both\";\n\t\t\t\tif (idMode === \"id\" || idMode === \"both\") {\n\t\t\t\t\tcombinedConditions.push({\n\t\t\t\t\t\tproperty: \"id\",\n\t\t\t\t\t\tcomparison: idExact ? ComparisonOperator.Equals : ComparisonOperator.Includes,\n\t\t\t\t\t\tvalue: idOrAlias\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (idMode === \"alias\" || idMode === \"both\") {\n\t\t\t\t\tcombinedConditions.push({\n\t\t\t\t\t\tproperty: \"aliasIndex\",\n\t\t\t\t\t\tcomparison: ComparisonOperator.Includes,\n\t\t\t\t\t\tvalue: idExact ? `||${idOrAlias.toLowerCase()}||` : idOrAlias.toLowerCase()\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Is.arrayValue(options?.resourceTypes)) {\n\t\t\t\tfor (const resourceType of options.resourceTypes) {\n\t\t\t\t\tcombinedConditions.push({\n\t\t\t\t\t\tproperty: \"resourceTypeIndex\",\n\t\t\t\t\t\tcomparison: ComparisonOperator.Includes,\n\t\t\t\t\t\tvalue: `||${resourceType.toLowerCase()}||`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!propertiesToReturn.includes(\"id\")) {\n\t\t\t\tpropertiesToReturn.unshift(\"id\");\n\t\t\t}\n\n\t\t\tconst results = await this._vertexStorage.query(\n\t\t\t\tcombinedConditions.length > 0\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tconditions: combinedConditions,\n\t\t\t\t\t\t\tlogicalOperator: LogicalOperator.Or\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: orderProperty,\n\t\t\t\t\t\tsortDirection: orderDirection\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tpropertiesToReturn as (keyof AuditableItemGraphVertex)[],\n\t\t\t\tcursor,\n\t\t\t\tlimit\n\t\t\t);\n\n\t\t\tconst models: IAuditableItemGraphVertex[] = results.entities.map(e =>\n\t\t\t\tthis.vertexEntityToJsonLd(e as AuditableItemGraphVertex)\n\t\t\t);\n\n\t\t\tconst vertexList: IAuditableItemGraphVertexList = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.VertexList],\n\t\t\t\t[SchemaOrgTypes.ItemListElement]: models\n\t\t\t};\n\n\t\t\tconst result = await JsonLdProcessor.compact(vertexList, vertexList[\"@context\"]);\n\t\t\treturn {\n\t\t\t\tentries: result,\n\t\t\t\tcursor: results.cursor\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"queryingFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Map the vertex entity to JSON-LD.\n\t * @param vertexEntity The vertex entity.\n\t * @returns The model.\n\t * @internal\n\t */\n\tprivate vertexEntityToJsonLd(vertexEntity: AuditableItemGraphVertex): IAuditableItemGraphVertex {\n\t\tconst model: IAuditableItemGraphVertex = {\n\t\t\t\"@context\": [\n\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\tSchemaOrgContexts.Context\n\t\t\t],\n\t\t\ttype: AuditableItemGraphTypes.Vertex,\n\t\t\tid: new Urn(AuditableItemGraphService.NAMESPACE, vertexEntity.id).toString(),\n\t\t\tdateCreated: vertexEntity.dateCreated,\n\t\t\tdateModified: vertexEntity.dateModified,\n\t\t\torganizationIdentity: vertexEntity.organizationIdentity,\n\t\t\tannotationObject: vertexEntity.annotationObject\n\t\t};\n\n\t\tif (Is.arrayValue(vertexEntity.aliases)) {\n\t\t\tmodel.aliases ??= [];\n\t\t\tfor (const aliasEntity of vertexEntity.aliases) {\n\t\t\t\tconst aliasModel: IAuditableItemGraphAlias = {\n\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t],\n\t\t\t\t\ttype: AuditableItemGraphTypes.Alias,\n\t\t\t\t\tid: aliasEntity.id,\n\t\t\t\t\taliasFormat: aliasEntity.aliasFormat,\n\t\t\t\t\tdateCreated: aliasEntity.dateCreated,\n\t\t\t\t\tdateModified: aliasEntity.dateModified,\n\t\t\t\t\tdateDeleted: aliasEntity.dateDeleted,\n\t\t\t\t\tannotationObject: aliasEntity.annotationObject\n\t\t\t\t};\n\t\t\t\tmodel.aliases.push(aliasModel);\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(vertexEntity.resources)) {\n\t\t\tmodel.resources ??= [];\n\t\t\tfor (const resourceEntity of vertexEntity.resources) {\n\t\t\t\tconst resourceModel: IAuditableItemGraphResource = {\n\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t],\n\t\t\t\t\ttype: AuditableItemGraphTypes.Resource,\n\t\t\t\t\tid: resourceEntity.id,\n\t\t\t\t\tdateCreated: resourceEntity.dateCreated,\n\t\t\t\t\tdateModified: resourceEntity.dateModified,\n\t\t\t\t\tdateDeleted: resourceEntity.dateDeleted,\n\t\t\t\t\tresourceObject: resourceEntity.resourceObject\n\t\t\t\t};\n\t\t\t\tmodel.resources.push(resourceModel);\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(vertexEntity.edges)) {\n\t\t\tmodel.edges ??= [];\n\t\t\tfor (const edgeEntity of vertexEntity.edges) {\n\t\t\t\tconst edgeModel: IAuditableItemGraphEdge = {\n\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t],\n\t\t\t\t\ttype: AuditableItemGraphTypes.Edge,\n\t\t\t\t\tid: this.fullEdgeId(vertexEntity.id, edgeEntity.id),\n\t\t\t\t\ttargetId: edgeEntity.targetId,\n\t\t\t\t\tdateCreated: edgeEntity.dateCreated,\n\t\t\t\t\tdateModified: edgeEntity.dateModified,\n\t\t\t\t\tdateDeleted: edgeEntity.dateDeleted,\n\t\t\t\t\tedgeRelationships: edgeEntity.edgeRelationships,\n\t\t\t\t\tannotationObject: edgeEntity.annotationObject\n\t\t\t\t};\n\t\t\t\tmodel.edges.push(edgeModel);\n\t\t\t}\n\t\t}\n\n\t\treturn model;\n\t}\n\n\t/**\n\t * Map the changeset entity to a JSON-LD.\n\t * @param vertexId The id of the vertex the changeset belongs to.\n\t * @param changesetEntity The changeset entity.\n\t * @returns The model.\n\t * @internal\n\t */\n\tprivate changesetEntityToJsonLd(\n\t\tvertexId: string,\n\t\tchangesetEntity: AuditableItemGraphChangeset\n\t): IAuditableItemGraphChangeset {\n\t\tconst model: IAuditableItemGraphChangeset = {\n\t\t\t\"@context\": [\n\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\tSchemaOrgContexts.Context\n\t\t\t],\n\t\t\ttype: AuditableItemGraphTypes.Changeset,\n\t\t\tid: new Urn(AuditableItemGraphService.NAMESPACE, [\n\t\t\t\tvertexId,\n\t\t\t\tAuditableItemGraphService.NAMESPACE_CHANGESET,\n\t\t\t\tchangesetEntity.id\n\t\t\t]).toString(),\n\t\t\tdateCreated: changesetEntity.dateCreated,\n\t\t\tuserIdentity: changesetEntity.userIdentity,\n\t\t\tpatches: changesetEntity.patches.map(p => ({\n\t\t\t\t\"@context\": [\n\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t],\n\t\t\t\ttype: AuditableItemGraphTypes.PatchOperation,\n\t\t\t\tpatchOperation: p.op,\n\t\t\t\tpatchPath: p.path,\n\t\t\t\tpatchFrom: p.from,\n\t\t\t\tpatchValue: p.value\n\t\t\t})),\n\t\t\tproofId: changesetEntity.proofId,\n\t\t\tversion: changesetEntity.version\n\t\t};\n\n\t\treturn model;\n\t}\n\n\t/**\n\t * Fetch all changesets for a vertex in ascending date order.\n\t * @param vertexId The internal vertex id.\n\t * @param options Optional filtering options.\n\t * @param options.before Only fetch changesets created strictly before this ISO 8601 timestamp.\n\t * @param options.maxVersion Only fetch changesets with version <= this value.\n\t * @returns All changeset entities sorted ascending by dateCreated.\n\t * @internal\n\t */\n\tprivate async internalGetChangesets(\n\t\tvertexId: string,\n\t\toptions?: { before?: string; maxVersion?: number }\n\t): Promise<AuditableItemGraphChangeset[]> {\n\t\tconst all: AuditableItemGraphChangeset[] = [];\n\t\tlet cursor: string | undefined;\n\n\t\tconst conditions: IComparator[] = [\n\t\t\t{ property: \"vertexId\", value: vertexId, comparison: ComparisonOperator.Equals }\n\t\t];\n\t\tif (Is.stringValue(options?.before)) {\n\t\t\tconditions.push({\n\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\tvalue: options.before,\n\t\t\t\tcomparison: ComparisonOperator.LessThan\n\t\t\t});\n\t\t}\n\t\tif (!Is.empty(options?.maxVersion)) {\n\t\t\tconditions.push({\n\t\t\t\tproperty: \"version\",\n\t\t\t\tvalue: options.maxVersion,\n\t\t\t\tcomparison: ComparisonOperator.LessThanOrEqual\n\t\t\t});\n\t\t}\n\n\t\tdo {\n\t\t\tconst result = await this._changesetStorage.query(\n\t\t\t\t{ conditions, logicalOperator: LogicalOperator.And },\n\t\t\t\t[{ property: \"dateCreated\", sortDirection: SortDirection.Ascending }],\n\t\t\t\tundefined,\n\t\t\t\tcursor\n\t\t\t);\n\t\t\tall.push(...(result.entities as AuditableItemGraphChangeset[]));\n\t\t\tcursor = result.cursor;\n\t\t} while (Is.stringValue(cursor));\n\n\t\treturn all;\n\t}\n\n\t/**\n\t * Update the aliases of a vertex model.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param aliases The aliases to update.\n\t * @internal\n\t */\n\tprivate async updateAliasList(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\taliases?: IAuditableItemGraphAlias[]\n\t): Promise<void> {\n\t\tconst active = vertex.aliases?.filter(a => Is.empty(a.dateDeleted)) ?? [];\n\n\t\t// The active aliases that are not in the update list should be marked as deleted.\n\t\tif (Is.arrayValue(active)) {\n\t\t\tfor (const alias of active) {\n\t\t\t\tif (!aliases?.find(a => a.id === alias.id)) {\n\t\t\t\t\talias.dateDeleted = context.now;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(aliases)) {\n\t\t\tfor (const alias of aliases) {\n\t\t\t\tawait this.updateAlias(context, vertex, alias);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Update an alias in the vertex.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param alias The alias.\n\t * @internal\n\t */\n\tprivate async updateAlias(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\talias: IAuditableItemGraphAlias\n\t): Promise<void> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(alias), alias);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(alias.id), alias.id);\n\n\t\tif (alias.unique ?? false) {\n\t\t\tconst existingVertices = await this.findMatchingVertices(vertex.id, alias.id);\n\t\t\tif (existingVertices) {\n\t\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"aliasNotUnique\", {\n\t\t\t\t\taliasId: alias.id\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (Is.object(alias.annotationObject)) {\n\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\tawait JsonLdHelper.validate(alias.annotationObject, validationFailures);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(alias.annotationObject),\n\t\t\t\tvalidationFailures\n\t\t\t);\n\t\t}\n\n\t\t// Try to find an existing alias with the same id.\n\t\tconst existing = vertex.aliases?.find(a => a.id === alias.id);\n\n\t\tif (Is.empty(existing) || !Is.empty(existing?.dateDeleted)) {\n\t\t\t// Did not find a matching item, or found one which is deleted.\n\t\t\tvertex.aliases ??= [];\n\n\t\t\tconst model: AuditableItemGraphAlias = {\n\t\t\t\tid: alias.id,\n\t\t\t\taliasFormat: alias.aliasFormat,\n\t\t\t\tdateCreated: context.now,\n\t\t\t\tannotationObject: alias.annotationObject,\n\t\t\t\tunique: alias.unique\n\t\t\t};\n\n\t\t\tvertex.aliases.push(model);\n\t\t} else if (\n\t\t\texisting.aliasFormat !== alias.aliasFormat ||\n\t\t\t!ObjectHelper.equal(existing.annotationObject, alias.annotationObject, false) ||\n\t\t\texisting.unique !== alias.unique\n\t\t) {\n\t\t\t// Existing alias found, update the annotationObject.\n\t\t\texisting.dateModified = context.now;\n\t\t\texisting.aliasFormat = alias.aliasFormat;\n\t\t\texisting.annotationObject = alias.annotationObject;\n\t\t\texisting.unique = alias.unique;\n\t\t}\n\t}\n\n\t/**\n\t * Update the resources of a vertex.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param resources The resources to update.\n\t * @internal\n\t */\n\tprivate async updateResourceList(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tresources?: IAuditableItemGraphResource[]\n\t): Promise<void> {\n\t\tif (Is.arrayValue(resources)) {\n\t\t\tfor (let i = 0; i < resources.length; i++) {\n\t\t\t\tconst id = this.getResourceId(resources[i]);\n\t\t\t\tif (Is.empty(id)) {\n\t\t\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"resourceIdMissing\", {\n\t\t\t\t\t\tindex: i\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst active = vertex.resources?.filter(r => Is.empty(r.dateDeleted)) ?? [];\n\n\t\t// The active resources that are not in the update list should be marked as deleted.\n\t\tif (Is.arrayValue(active)) {\n\t\t\tfor (const resource of active) {\n\t\t\t\tif (!resources?.find(a => this.getResourceId(a) === this.getResourceId(resource))) {\n\t\t\t\t\tresource.dateDeleted = context.now;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(resources)) {\n\t\t\tfor (const resource of resources) {\n\t\t\t\tawait this.updateResource(context, vertex, resource);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Add a resource to the vertex.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param resource The resource.\n\t * @internal\n\t */\n\tprivate async updateResource(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tresource: IAuditableItemGraphResource\n\t): Promise<void> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(resource), resource);\n\n\t\tif (Is.object(resource.resourceObject)) {\n\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\tawait JsonLdHelper.validate(resource.resourceObject, validationFailures);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(resource.resourceObject),\n\t\t\t\tvalidationFailures\n\t\t\t);\n\t\t}\n\n\t\t// Try to find an existing resource with the same id.\n\t\tconst existing = vertex.resources?.find(\n\t\t\tr => this.getResourceId(r) === this.getResourceId(resource)\n\t\t);\n\n\t\tif (Is.empty(existing) || !Is.empty(existing?.dateDeleted)) {\n\t\t\t// Did not find a matching item, or found one which is deleted.\n\t\t\tvertex.resources ??= [];\n\n\t\t\tconst model: AuditableItemGraphResource = {\n\t\t\t\tid: resource.id,\n\t\t\t\tdateCreated: context.now,\n\t\t\t\tresourceObject: resource.resourceObject\n\t\t\t};\n\n\t\t\tvertex.resources.push(model);\n\t\t} else if (!ObjectHelper.equal(existing.resourceObject, resource.resourceObject, false)) {\n\t\t\t// Existing resource found, update the resourceObject.\n\t\t\texisting.dateModified = context.now;\n\t\t\texisting.resourceObject = resource.resourceObject;\n\t\t}\n\t}\n\n\t/**\n\t * Update the edges of a vertex.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param edges The edges to update.\n\t * @internal\n\t */\n\tprivate async updateEdgeList(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tedges?: IAuditableItemGraphEdge[]\n\t): Promise<void> {\n\t\tconst active = vertex.edges?.filter(e => Is.empty(e.dateDeleted)) ?? [];\n\n\t\t// The active edges that are not in the update list should be marked as deleted.\n\t\tif (Is.arrayValue(active)) {\n\t\t\tfor (const edge of active) {\n\t\t\t\tif (!edges?.find(e => Is.stringValue(e.id) && this.reduceEdgeId(e.id) === edge.id)) {\n\t\t\t\t\tedge.dateDeleted = context.now;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(edges)) {\n\t\t\tfor (const edge of edges) {\n\t\t\t\tawait this.updateEdge(context, vertex, edge);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Add an edge to the vertex.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param edge The edge.\n\t * @internal\n\t */\n\tprivate async updateEdge(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tedge: IAuditableItemGraphEdge\n\t): Promise<void> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(edge), edge);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(edge.targetId), edge.targetId);\n\t\tGuards.arrayValue(\n\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\tnameof(edge.edgeRelationships),\n\t\t\tedge.edgeRelationships\n\t\t);\n\n\t\tconst validationFailures: IValidationFailure[] = [];\n\t\tif (edge.targetId === vertex.id) {\n\t\t\tvalidationFailures.push({\n\t\t\t\tproperty: \"id\",\n\t\t\t\treason: `validation.${StringHelper.camelCase(AuditableItemGraphService.CLASS_NAME)}.edgeIdSameAsVertexId`,\n\t\t\t\tproperties: {\n\t\t\t\t\ttargetId: edge.targetId\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tif (Is.object(edge.annotationObject)) {\n\t\t\tawait JsonLdHelper.validate(edge.annotationObject, validationFailures);\n\t\t}\n\t\tValidation.asValidationError(\n\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\tnameof(edge.annotationObject),\n\t\t\tvalidationFailures\n\t\t);\n\n\t\tlet findId = Is.stringValue(edge.id) ? this.reduceEdgeId(edge.id) : undefined;\n\t\tif (Is.empty(findId)) {\n\t\t\tfindId = RandomHelper.generateUuidV7(\"compact\");\n\t\t}\n\n\t\t// Try to find an existing edge with the same id.\n\t\tconst existing = vertex.edges?.find(r => r.id === findId);\n\n\t\tif (Is.empty(existing) || !Is.empty(existing?.dateDeleted)) {\n\t\t\t// Did not find a matching item, or found one which is deleted.\n\t\t\tvertex.edges ??= [];\n\n\t\t\tconst model: AuditableItemGraphEdge = {\n\t\t\t\tid: findId,\n\t\t\t\ttargetId: edge.targetId,\n\t\t\t\tdateCreated: context.now,\n\t\t\t\tannotationObject: edge.annotationObject,\n\t\t\t\tedgeRelationships: edge.edgeRelationships\n\t\t\t};\n\n\t\t\tvertex.edges.push(model);\n\t\t} else if (\n\t\t\texisting.targetId !== edge.targetId ||\n\t\t\t!ArrayHelper.matches(existing.edgeRelationships, edge.edgeRelationships) ||\n\t\t\t!ObjectHelper.equal(existing.annotationObject, edge.annotationObject, false)\n\t\t) {\n\t\t\t// Existing edge found, update the properties.\n\t\t\texisting.targetId = edge.targetId;\n\t\t\texisting.dateModified = context.now;\n\t\t\texisting.edgeRelationships = edge.edgeRelationships;\n\t\t\texisting.annotationObject = edge.annotationObject;\n\t\t}\n\t}\n\n\t/**\n\t * Add a changeset to the vertex and generate the associated verifications.\n\t * @param context The context for the operation.\n\t * @param original The original vertex.\n\t * @param updated The updated vertex.\n\t * @param isNew Whether this is a new item.\n\t * @param version The version number of the vertex after this changeset.\n\t * @returns True if there were changes.\n\t * @internal\n\t */\n\tprivate async addChangeset(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\toriginal: AuditableItemGraphVertex,\n\t\tupdated: AuditableItemGraphVertex,\n\t\tisNew: boolean,\n\t\tversion: number\n\t): Promise<IPatchOperation[]> {\n\t\tconst patches = JsonHelper.diff(original, updated);\n\n\t\t// If there is a diff set or this is the first time the item is created.\n\t\tif (patches.length > 0 || isNew) {\n\t\t\tconst changesetEntity: AuditableItemGraphChangeset = {\n\t\t\t\tid: RandomHelper.generateUuidV7(\"compact\"),\n\t\t\t\tvertexId: updated.id,\n\t\t\t\tdateCreated: context.now,\n\t\t\t\tuserIdentity: context.contextIds?.[ContextIdKeys.User],\n\t\t\t\tpatches,\n\t\t\t\tversion\n\t\t\t};\n\n\t\t\t// Create the JSON-LD object we want to use for the proof\n\t\t\t// this is a subset of fixed properties from the changeset object.\n\t\t\tconst reducedChangesetJsonLd = this.changesetEntityToJsonLd(\n\t\t\t\toriginal.id,\n\t\t\t\tObjectHelper.pick(\n\t\t\t\t\tchangesetEntity,\n\t\t\t\t\tAuditableItemGraphService._PROOF_KEYS_CHANGESET\n\t\t\t\t) as AuditableItemGraphChangeset\n\t\t\t);\n\n\t\t\t// Create the proof for the changeset object\n\t\t\tchangesetEntity.proofId = await this._immutableProofComponent.create(\n\t\t\t\tJsonLdHelper.toNodeObject(reducedChangesetJsonLd)\n\t\t\t);\n\n\t\t\t// Link the verifiable storage id to the changeset\n\t\t\tawait this._changesetStorage.set(changesetEntity);\n\n\t\t\treturn patches;\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Verify the changesets of a vertex.\n\t * @param vertex The vertex to verify.\n\t * @param verifySignatureDepth How many signatures to verify.\n\t * @internal\n\t */\n\tprivate async verifyChangesets(\n\t\tvertex: IAuditableItemGraphVertex,\n\t\tverifySignatureDepth: VerifyDepth\n\t): Promise<{\n\t\tverified: boolean;\n\t\tchangesets: IAuditableItemGraphChangeset[];\n\t}> {\n\t\tconst changesets: IAuditableItemGraphChangeset[] = [];\n\n\t\tlet verified = true;\n\n\t\tconst vertexIdUrn = Urn.fromValidString(vertex.id);\n\t\tconst vertexId = vertexIdUrn.namespaceSpecific();\n\t\tlet cursor;\n\n\t\tdo {\n\t\t\tconst chunk = await this.verifyChangesetChunk(vertexId, verifySignatureDepth, cursor);\n\t\t\tcursor = chunk.cursor;\n\t\t\tif (!chunk.verified) {\n\t\t\t\tverified = false;\n\t\t\t}\n\t\t\tchangesets.push(...chunk.changesets);\n\t\t} while (Is.stringValue(cursor));\n\n\t\treturn {\n\t\t\tverified,\n\t\t\tchangesets\n\t\t};\n\t}\n\n\t/**\n\t * Verify a chunk of changesets for a vertex.\n\t * @param vertexId The id of the vertex to verify the changesets for.\n\t * @param verifySignatureDepth How many signatures to verify.\n\t * @param cursor The cursor to request the next chunk of changesets.\n\t * @param limit The maximum number of changesets to verify in this chunk.\n\t * @returns The changesets and whether they were verified.\n\t * @internal\n\t */\n\tprivate async verifyChangesetChunk(\n\t\tvertexId: string,\n\t\tverifySignatureDepth: string,\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tchangesets: IAuditableItemGraphChangeset[];\n\t\tverified: boolean;\n\t\tcursor?: string;\n\t}> {\n\t\tconst changesets: IAuditableItemGraphChangeset[] = [];\n\t\tlet verified = true;\n\n\t\tconst changesetsResult = await this._changesetStorage.query(\n\t\t\t{\n\t\t\t\tproperty: \"vertexId\",\n\t\t\t\tvalue: vertexId,\n\t\t\t\tcomparison: ComparisonOperator.Equals\n\t\t\t},\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\t\tsortDirection: SortDirection.Ascending\n\t\t\t\t}\n\t\t\t],\n\t\t\tundefined,\n\t\t\tcursor,\n\t\t\tlimit\n\t\t);\n\n\t\tconst storedChangesets = changesetsResult.entities as AuditableItemGraphChangeset[];\n\t\tif (Is.arrayValue(storedChangesets)) {\n\t\t\tfor (let i = 0; i < storedChangesets.length; i++) {\n\t\t\t\tconst storedChangeset = storedChangesets[i];\n\n\t\t\t\tconst storedChangesetJsonLd = this.changesetEntityToJsonLd(vertexId, storedChangeset);\n\t\t\t\tchangesets.push(storedChangesetJsonLd);\n\n\t\t\t\t// If we are verifying all signatures\n\t\t\t\t// or this is the last changeset (cursor is empty)\n\t\t\t\t// and the changeset has a proofId, then verify the proof.\n\t\t\t\tif (\n\t\t\t\t\tverifySignatureDepth === VerifyDepth.All ||\n\t\t\t\t\t(verifySignatureDepth === VerifyDepth.Current &&\n\t\t\t\t\t\t!Is.stringValue(changesetsResult.cursor) &&\n\t\t\t\t\t\ti === storedChangesets.length - 1)\n\t\t\t\t) {\n\t\t\t\t\tstoredChangesetJsonLd.verification =\n\t\t\t\t\t\tawait this.verifyChangesetSignature(storedChangesetJsonLd);\n\t\t\t\t\tif (storedChangesetJsonLd.verification?.verified !== true) {\n\t\t\t\t\t\tverified = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn { changesets, verified, cursor: changesetsResult.cursor };\n\t}\n\n\t/**\n\t * Verify the signature of a changeset and add the verification result to the changeset JSON-LD.\n\t * @param storedChangeset The changeset to verify.\n\t * @returns Whether the changeset is verified.\n\t */\n\tprivate async verifyChangesetSignature(\n\t\tstoredChangeset: IAuditableItemGraphChangeset\n\t): Promise<IImmutableProofVerification | undefined> {\n\t\tlet verification: IImmutableProofVerification | undefined;\n\t\tif (!Is.stringValue(storedChangeset.proofId)) {\n\t\t\tverification = {\n\t\t\t\t\"@context\": ImmutableProofContexts.Context,\n\t\t\t\ttype: ImmutableProofTypes.ImmutableProofVerification,\n\t\t\t\tverified: false,\n\t\t\t\tfailure: ImmutableProofFailure.ProofMissing\n\t\t\t};\n\t\t} else {\n\t\t\t// Verify the proof for the changeset object\n\t\t\tverification = await this._immutableProofComponent.verify(storedChangeset.proofId);\n\t\t}\n\t\treturn verification;\n\t}\n\n\t/**\n\t * Get the resource id from a resource object.\n\t * @param resource The resource.\n\t * @param resource.id The id of the resource.\n\t * @param resource.resourceObject The resource object.\n\t * @returns The resource id if it can find one.\n\t */\n\tprivate getResourceId(resource: {\n\t\tid?: string;\n\t\tresourceObject?: IJsonLdNodeObject;\n\t}): string | undefined {\n\t\treturn (\n\t\t\tresource.id ??\n\t\t\tObjectHelper.extractProperty<string>(resource.resourceObject, [\"id\", \"@id\"], false)\n\t\t);\n\t}\n\n\t/**\n\t * Build the indexes for the vertex.\n\t * @param vertex The vertex to build the indexes for.\n\t * @returns The indexes.\n\t * @internal\n\t */\n\tprivate buildIndexes(vertex: AuditableItemGraphVertex): {\n\t\taliasIndex?: string;\n\t\tresourceTypeIndex?: string;\n\t} {\n\t\tconst aliasIndex = vertex.aliases\n\t\t\t?.filter(a => Is.empty(a.dateDeleted))\n\t\t\t.map(a => a.id)\n\t\t\t.join(\"||\")\n\t\t\t.toLowerCase();\n\n\t\tconst resourceTypes: string[] = [];\n\t\tif (Is.arrayValue(vertex.resources)) {\n\t\t\tfor (const resource of vertex.resources) {\n\t\t\t\tconst resourceType = ObjectHelper.extractProperty<string>(\n\t\t\t\t\tresource.resourceObject,\n\t\t\t\t\t[\"@type\", \"type\"],\n\t\t\t\t\tfalse\n\t\t\t\t);\n\n\t\t\t\tif (Is.stringValue(resourceType) && !resourceTypes.includes(resourceType)) {\n\t\t\t\t\tresourceTypes.push(resourceType);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst resourceTypeIndex = resourceTypes.join(\"||\").toLowerCase();\n\n\t\treturn {\n\t\t\taliasIndex: Is.stringValue(aliasIndex) ? `||${aliasIndex}||` : undefined,\n\t\t\tresourceTypeIndex: Is.stringValue(resourceTypeIndex) ? `||${resourceTypeIndex}||` : undefined\n\t\t};\n\t}\n\n\t/**\n\t * Find vertices with matching aliases.\n\t * @param context The context for the operation.\n\t * @param vertexId The id of the vertex to exclude from the search.\n\t * @param aliasId The alias id to try and find.\n\t * @returns True if any other vertices have matching aliases.\n\t * @internal\n\t */\n\tprivate async findMatchingVertices(vertexId: string, aliasId: string): Promise<boolean> {\n\t\tconst results = await this._vertexStorage.query({\n\t\t\tconditions: [\n\t\t\t\t{\n\t\t\t\t\tproperty: \"aliasIndex\",\n\t\t\t\t\tcomparison: ComparisonOperator.Includes,\n\t\t\t\t\tvalue: `||${aliasId.toLowerCase()}||`\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tproperty: \"id\",\n\t\t\t\t\tvalue: vertexId,\n\t\t\t\t\tcomparison: ComparisonOperator.NotEquals\n\t\t\t\t}\n\t\t\t],\n\t\t\tlogicalOperator: LogicalOperator.And\n\t\t});\n\n\t\treturn results.entities.length > 0;\n\t}\n\n\t/**\n\t * Reduce the edge ID from a URN.\n\t * @param urn The URN to reduce.\n\t * @returns The edge ID.\n\t * @throws GeneralError if the URN is not valid or not an edge URN.\n\t * @internal\n\t */\n\tprivate reduceEdgeId(urn: string): string {\n\t\tconst urnParsed = Urn.fromValidString(urn);\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid: urn\n\t\t\t});\n\t\t}\n\t\tif (urnParsed.namespaceSpecificParts().length !== 3) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"invalidEdgeId\", {\n\t\t\t\tedgeId: urn\n\t\t\t});\n\t\t}\n\t\tif (urnParsed.namespaceSpecificParts()[1] !== AuditableItemGraphService.NAMESPACE_EDGE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"invalidEdgeId\", {\n\t\t\t\tedgeId: urn\n\t\t\t});\n\t\t}\n\t\treturn urnParsed.namespaceSpecificParts()[2];\n\t}\n\n\t/**\n\t * Create a full edge ID URN from a vertex ID and edge ID.\n\t * @param vertexId The vertex id the edge belongs to.\n\t * @param edgeId The edge id.\n\t * @returns The full edge ID URN.\n\t * @internal\n\t */\n\tprivate fullEdgeId(vertexId: string, edgeId: string): string {\n\t\treturn new Urn(AuditableItemGraphService.NAMESPACE, [\n\t\t\tvertexId,\n\t\t\tAuditableItemGraphService.NAMESPACE_EDGE,\n\t\t\tedgeId\n\t\t]).toString();\n\t}\n}\n"]}
1
+ {"version":3,"file":"auditableItemGraphService.js","sourceRoot":"","sources":["../../src/auditableItemGraphService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tAuditableItemGraphContexts,\n\tAuditableItemGraphDataTypes,\n\tAuditableItemGraphMetricIds,\n\tAuditableItemGraphMetrics,\n\tAuditableItemGraphTopics,\n\tAuditableItemGraphTypes,\n\tVerifyDepth,\n\ttype IAuditableItemGraphAlias,\n\ttype IAuditableItemGraphChangeset,\n\ttype IAuditableItemGraphChangesetList,\n\ttype IAuditableItemGraphComponent,\n\ttype IAuditableItemGraphEdge,\n\ttype IAuditableItemGraphEventBusVertexCreated,\n\ttype IAuditableItemGraphEventBusVertexUpdated,\n\ttype IAuditableItemGraphResource,\n\ttype IAuditableItemGraphVertex,\n\ttype IAuditableItemGraphVertexList,\n\ttype IAuditableItemGraphVertexVersionList\n} from \"@twin.org/auditable-item-graph-models\";\nimport { ContextIdKeys, ContextIdStore } from \"@twin.org/context\";\nimport {\n\tArrayHelper,\n\tCoerce,\n\tComponentFactory,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tJsonHelper,\n\tNotFoundError,\n\tObjectHelper,\n\tRandomHelper,\n\tStringHelper,\n\tUrn,\n\tValidation,\n\ttype IPatchOperation,\n\ttype IValidationFailure\n} from \"@twin.org/core\";\nimport { DataTypeHelper } from \"@twin.org/data-core\";\nimport {\n\tJsonLdDataTypes,\n\tJsonLdHelper,\n\tJsonLdProcessor,\n\ttype IJsonLdNodeObject\n} from \"@twin.org/data-json-ld\";\nimport {\n\tComparisonOperator,\n\tLogicalOperator,\n\tSortDirection,\n\ttype IComparator\n} from \"@twin.org/entity\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport type { IEventBusComponent } from \"@twin.org/event-bus-models\";\nimport {\n\tImmutableProofContexts,\n\tImmutableProofFailure,\n\tImmutableProofTypes,\n\ttype IImmutableProofComponent,\n\ttype IImmutableProofVerification\n} from \"@twin.org/immutable-proof-models\";\nimport { nameof, nameofKebabCase } from \"@twin.org/nameof\";\nimport {\n\tSchemaOrgContexts,\n\tSchemaOrgDataTypes,\n\tSchemaOrgTypes\n} from \"@twin.org/standards-schema-org\";\nimport { MetricHelper, type ITelemetryComponent } from \"@twin.org/telemetry-models\";\nimport type { AuditableItemGraphAlias } from \"./entities/auditableItemGraphAlias.js\";\nimport type { AuditableItemGraphChangeset } from \"./entities/auditableItemGraphChangeset.js\";\nimport type { AuditableItemGraphEdge } from \"./entities/auditableItemGraphEdge.js\";\nimport type { AuditableItemGraphResource } from \"./entities/auditableItemGraphResource.js\";\nimport type { AuditableItemGraphVertex } from \"./entities/auditableItemGraphVertex.js\";\nimport type { IAuditableItemGraphServiceConstructorOptions } from \"./models/IAuditableItemGraphServiceConstructorOptions.js\";\nimport type { IAuditableItemGraphServiceContext } from \"./models/IAuditableItemGraphServiceContext.js\";\n\n/**\n * Class for performing auditable item graph operations.\n */\nexport class AuditableItemGraphService implements IAuditableItemGraphComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<AuditableItemGraphService>();\n\n\t/**\n\t * The namespace for the service.\n\t * @internal\n\t */\n\tpublic static readonly NAMESPACE: string = \"aig\";\n\n\t/**\n\t * The namespace for the service changeset.\n\t */\n\tpublic static readonly NAMESPACE_CHANGESET: string = \"changeset\";\n\n\t/**\n\t * The namespace for the service edge.\n\t */\n\tpublic static readonly NAMESPACE_EDGE: string = \"edge\";\n\n\t/**\n\t * The keys to pick when creating the proof for the stream.\n\t * @internal\n\t */\n\tprivate static readonly _PROOF_KEYS_CHANGESET: (keyof AuditableItemGraphChangeset)[] = [\n\t\t\"id\",\n\t\t\"vertexId\",\n\t\t\"userIdentity\",\n\t\t\"dateCreated\",\n\t\t\"patches\"\n\t];\n\n\t/**\n\t * The immutable proof component.\n\t * @internal\n\t */\n\tprivate readonly _immutableProofComponent: IImmutableProofComponent;\n\n\t/**\n\t * The entity storage for vertices.\n\t * @internal\n\t */\n\tprivate readonly _vertexStorage: IEntityStorageConnector<AuditableItemGraphVertex>;\n\n\t/**\n\t * The entity storage for changesets.\n\t * @internal\n\t */\n\tprivate readonly _changesetStorage: IEntityStorageConnector<AuditableItemGraphChangeset>;\n\n\t/**\n\t * The event bus component.\n\t * @internal\n\t */\n\tprivate readonly _eventBusComponent?: IEventBusComponent;\n\n\t/**\n\t * The telemetry component.\n\t * @internal\n\t */\n\tprivate readonly _telemetryComponent?: ITelemetryComponent;\n\n\t/**\n\t * Create a new instance of AuditableItemGraphService.\n\t * @param options The dependencies for the auditable item graph connector.\n\t */\n\tconstructor(options?: IAuditableItemGraphServiceConstructorOptions) {\n\t\tthis._immutableProofComponent = ComponentFactory.get(\n\t\t\toptions?.immutableProofComponentType ?? \"immutable-proof\"\n\t\t);\n\n\t\tthis._vertexStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.vertexEntityStorageType ?? nameofKebabCase<AuditableItemGraphVertex>()\n\t\t);\n\n\t\tthis._changesetStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.changesetEntityStorageType ?? nameofKebabCase<AuditableItemGraphChangeset>()\n\t\t);\n\n\t\tthis._eventBusComponent = ComponentFactory.getIfExists<IEventBusComponent>(\n\t\t\toptions?.eventBusComponentType\n\t\t);\n\n\t\tthis._telemetryComponent = ComponentFactory.getIfExists<ITelemetryComponent>(\n\t\t\toptions?.telemetryComponentType\n\t\t);\n\n\t\tSchemaOrgDataTypes.registerRedirects();\n\t\tAuditableItemGraphDataTypes.registerTypes();\n\t\tJsonLdDataTypes.registerTypes();\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn AuditableItemGraphService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Register all AIG metrics with the telemetry component.\n\t */\n\tpublic async start(): Promise<void> {\n\t\tif (Is.undefined(this._telemetryComponent)) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait MetricHelper.createMetrics(this._telemetryComponent, AuditableItemGraphMetrics);\n\t}\n\n\t/**\n\t * Create a new graph vertex.\n\t * @param vertex The vertex to create.\n\t * @param vertex.annotationObject The annotation object for the vertex as JSON-LD.\n\t * @param vertex.aliases Alternative aliases that can be used to identify the vertex.\n\t * @param vertex.resources The resources attached to the vertex.\n\t * @param vertex.edges The edges connected to the vertex.\n\t * @returns The id of the new graph item.\n\t */\n\tpublic async create(vertex: Omit<IAuditableItemGraphVertex, \"id\">): Promise<string> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(vertex), vertex);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\ttry {\n\t\t\tconst id = RandomHelper.generateUuidV7(\"compact\");\n\n\t\t\tconst schemaValidationFailures: IValidationFailure[] = [];\n\t\t\tawait DataTypeHelper.validate(\n\t\t\t\tnameof(vertex),\n\t\t\t\t`${AuditableItemGraphContexts.Namespace}${AuditableItemGraphTypes.Vertex}`,\n\t\t\t\t{\n\t\t\t\t\t...vertex,\n\t\t\t\t\tid\n\t\t\t\t},\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(vertex),\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\n\t\t\tif (Is.object(vertex.annotationObject)) {\n\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\tawait JsonLdHelper.validate(vertex.annotationObject, validationFailures);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\tnameof(vertex.annotationObject),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst context: IAuditableItemGraphServiceContext = {\n\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\tcontextIds\n\t\t\t};\n\n\t\t\tconst vertexModel: AuditableItemGraphVertex = {\n\t\t\t\tid,\n\t\t\t\torganizationIdentity: contextIds?.[ContextIdKeys.Organization],\n\t\t\t\tdateCreated: context.now\n\t\t\t};\n\t\t\tconst originalEntity = ObjectHelper.clone(vertexModel);\n\n\t\t\tvertexModel.annotationObject = vertex.annotationObject;\n\n\t\t\tawait this.updateAliasList(context, vertexModel, vertex.aliases);\n\t\t\tawait this.updateResourceList(context, vertexModel, vertex.resources);\n\t\t\tawait this.updateEdgeList(context, vertexModel, vertex.edges);\n\n\t\t\tdelete originalEntity.aliasIndex;\n\t\t\tdelete originalEntity.resourceTypeIndex;\n\t\t\tawait this.addChangeset(context, originalEntity, vertexModel, true, 0);\n\n\t\t\tvertexModel.version = 0;\n\n\t\t\tawait this._vertexStorage.set({\n\t\t\t\t...vertexModel,\n\t\t\t\t...this.buildIndexes(vertexModel)\n\t\t\t});\n\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.VerticesCreated\n\t\t\t);\n\n\t\t\tconst fullId = new Urn(AuditableItemGraphService.NAMESPACE, id).toString();\n\n\t\t\tawait this._eventBusComponent?.publish<IAuditableItemGraphEventBusVertexCreated>(\n\t\t\t\tAuditableItemGraphTopics.VertexCreated,\n\t\t\t\t{ id: fullId }\n\t\t\t);\n\n\t\t\treturn fullId;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"createFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Update a graph vertex.\n\t * @param vertex The vertex to update.\n\t * @param vertex.id The id of the vertex to update.\n\t * @param vertex.annotationObject The annotation object for the vertex as JSON-LD.\n\t * @param vertex.aliases Alternative aliases that can be used to identify the vertex.\n\t * @param vertex.resources The resources attached to the vertex.\n\t * @param vertex.edges The edges connected to the vertex.\n\t * @returns Nothing.\n\t */\n\tpublic async update(vertex: IAuditableItemGraphVertex): Promise<void> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(vertex), vertex);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(vertex.id), vertex.id);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\tconst urnParsed = Urn.fromValidString(vertex.id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid: vertex.id\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst schemaValidationFailures: IValidationFailure[] = [];\n\t\t\tawait DataTypeHelper.validate(\n\t\t\t\tnameof(vertex),\n\t\t\t\t`${AuditableItemGraphContexts.Namespace}${AuditableItemGraphTypes.Vertex}`,\n\t\t\t\tvertex,\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(vertex),\n\t\t\t\tschemaValidationFailures\n\t\t\t);\n\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", vertex.id);\n\t\t\t}\n\n\t\t\tif (Is.object(vertex.annotationObject)) {\n\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\tawait JsonLdHelper.validate(vertex.annotationObject, validationFailures);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\tnameof(vertex.annotationObject),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst context: IAuditableItemGraphServiceContext = {\n\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\tcontextIds\n\t\t\t};\n\n\t\t\tdelete vertexEntity.aliasIndex;\n\t\t\tconst originalEntity = ObjectHelper.clone(vertexEntity);\n\t\t\tconst newEntity = ObjectHelper.clone(vertexEntity);\n\n\t\t\tnewEntity.annotationObject = vertex.annotationObject;\n\n\t\t\tawait this.updateAliasList(context, newEntity, vertex.aliases);\n\t\t\tawait this.updateResourceList(context, newEntity, vertex.resources);\n\t\t\tawait this.updateEdgeList(context, newEntity, vertex.edges);\n\n\t\t\tconst nextVersion = Is.empty(vertexEntity.version)\n\t\t\t\t? (await this.internalGetChangesets(vertexId)).length\n\t\t\t\t: vertexEntity.version + 1;\n\t\t\tconst patches = await this.addChangeset(\n\t\t\t\tcontext,\n\t\t\t\toriginalEntity,\n\t\t\t\tnewEntity,\n\t\t\t\tfalse,\n\t\t\t\tnextVersion\n\t\t\t);\n\t\t\tif (patches.length > 0) {\n\t\t\t\tnewEntity.dateModified = context.now;\n\t\t\t\tnewEntity.version = nextVersion;\n\n\t\t\t\tconst indexes = this.buildIndexes(newEntity);\n\n\t\t\t\tawait this._vertexStorage.set({\n\t\t\t\t\t...newEntity,\n\t\t\t\t\t...indexes\n\t\t\t\t});\n\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tAuditableItemGraphMetricIds.VerticesUpdated,\n\t\t\t\t\t{\n\t\t\t\t\t\tpatchCount: patches.length\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tawait this._eventBusComponent?.publish<IAuditableItemGraphEventBusVertexUpdated>(\n\t\t\t\t\tAuditableItemGraphTopics.VertexUpdated,\n\t\t\t\t\t{ id: vertex.id, patches }\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"updatingFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get a graph vertex.\n\t * @param id The id of the vertex to get.\n\t * @param options Additional options for the get operation.\n\t * @param options.includeDeleted Whether to include deleted/updated aliases, resource, edges, defaults to false.\n\t * @param options.verifySignatureDepth How many signatures to verify, defaults to \"none\".\n\t * @returns The vertex if found.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async get(\n\t\tid: string,\n\t\toptions?: {\n\t\t\tincludeDeleted?: boolean;\n\t\t\tverifySignatureDepth?: VerifyDepth;\n\t\t}\n\t): Promise<IAuditableItemGraphVertex> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tconst vertexModel = this.vertexEntityToJsonLd(vertexEntity);\n\n\t\t\tconst verifySignatureDepth = options?.verifySignatureDepth ?? VerifyDepth.None;\n\n\t\t\tlet verified: boolean | undefined;\n\n\t\t\tif (\n\t\t\t\tverifySignatureDepth === VerifyDepth.Current ||\n\t\t\t\tverifySignatureDepth === VerifyDepth.All\n\t\t\t) {\n\t\t\t\tconst verifyResult = await this.verifyChangesets(vertexModel, verifySignatureDepth);\n\t\t\t\tverified = verifyResult.verified;\n\t\t\t\tvertexModel[\"@context\"].push(ImmutableProofContexts.Context);\n\t\t\t}\n\n\t\t\tif (!(options?.includeDeleted ?? false)) {\n\t\t\t\tif (Is.arrayValue(vertexModel.aliases)) {\n\t\t\t\t\tvertexModel.aliases = vertexModel.aliases.filter(a => Is.undefined(a.dateDeleted));\n\t\t\t\t\tif (vertexModel.aliases.length === 0) {\n\t\t\t\t\t\tdelete vertexModel.aliases;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (Is.arrayValue(vertexModel.resources)) {\n\t\t\t\t\tvertexModel.resources = vertexModel.resources.filter(r => Is.undefined(r.dateDeleted));\n\t\t\t\t\tif (vertexModel.resources.length === 0) {\n\t\t\t\t\t\tdelete vertexModel.resources;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (Is.arrayValue(vertexModel.edges)) {\n\t\t\t\t\tvertexModel.edges = vertexModel.edges.filter(r => Is.undefined(r.dateDeleted));\n\t\t\t\t\tif (vertexModel.edges.length === 0) {\n\t\t\t\t\t\tdelete vertexModel.edges;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (verifySignatureDepth !== VerifyDepth.None) {\n\t\t\t\tvertexModel.verified = verified;\n\t\t\t}\n\n\t\t\tconst result = await JsonLdProcessor.compact(vertexModel, vertexModel[\"@context\"]);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get a graph vertex changeset list.\n\t * @param id The id of the vertex to get.\n\t * @param cursor The optional cursor to get next chunk.\n\t * @param limit Limit the number of entities to return.\n\t * @param options Additional options for the get operation.\n\t * @param options.verifySignatureDepth How many signatures to verify, defaults to \"none\".\n\t * @returns The vertex if found.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async getChangesets(\n\t\tid: string,\n\t\tcursor?: string,\n\t\tlimit?: number,\n\t\toptions?: {\n\t\t\tverifySignatureDepth?: VerifyDepth;\n\t\t}\n\t): Promise<{\n\t\tchangesets: IAuditableItemGraphChangesetList;\n\t\tcursor?: string;\n\t}> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tconst chunk = await this.verifyChangesetChunk(\n\t\t\t\tvertexId,\n\t\t\t\toptions?.verifySignatureDepth ?? VerifyDepth.None,\n\t\t\t\tcursor,\n\t\t\t\tlimit\n\t\t\t);\n\n\t\t\tif ((options?.verifySignatureDepth ?? VerifyDepth.None) !== VerifyDepth.None) {\n\t\t\t\tif (chunk.verified) {\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.VerificationsSucceeded\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.VerificationsFailed\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst changesetList: IAuditableItemGraphChangesetList = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.ChangesetList],\n\t\t\t\t[SchemaOrgTypes.ItemListElement]: chunk.changesets\n\t\t\t};\n\n\t\t\tconst result = await JsonLdProcessor.compact(changesetList, changesetList[\"@context\"]);\n\t\t\treturn {\n\t\t\t\tchangesets: result,\n\t\t\t\tcursor: chunk.cursor\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get a graph vertex changeset.\n\t * @param id The id of the vertex to get.\n\t * @param options Additional options for the get operation.\n\t * @param options.verifySignatureDepth How many signatures to verify, defaults to \"none\".\n\t * @returns The vertex if found.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async getChangeset(\n\t\tid: string,\n\t\toptions?: {\n\t\t\tverifySignatureDepth?: VerifyDepth;\n\t\t}\n\t): Promise<IAuditableItemGraphChangeset> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst namespaceSpecificParts = urnParsed.namespaceSpecificParts();\n\t\t\tconst vertexId = namespaceSpecificParts[0];\n\t\t\tconst changesetId = namespaceSpecificParts[2];\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tconst changesetEntity = await this._changesetStorage.get(changesetId);\n\t\t\tif (Is.empty(changesetEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"changesetNotFound\", id);\n\t\t\t}\n\n\t\t\tconst changesetModel = this.changesetEntityToJsonLd(vertexId, changesetEntity);\n\n\t\t\tconst verifySignatureDepth = options?.verifySignatureDepth ?? VerifyDepth.None;\n\t\t\tif (verifySignatureDepth !== VerifyDepth.None) {\n\t\t\t\tchangesetModel[\"@context\"]?.push(ImmutableProofContexts.Context);\n\t\t\t\tchangesetModel.verification = await this.verifyChangesetSignature(changesetModel);\n\t\t\t\tif (changesetModel.verification?.verified) {\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.VerificationsSucceeded\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.VerificationsFailed,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfailureReason: changesetModel.verification?.failure\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = await JsonLdProcessor.compact(changesetModel, changesetModel[\"@context\"]);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get a graph vertex at a specific version.\n\t * @param id The id of the vertex.\n\t * @param versionId The id of the version (changeset id) to retrieve.\n\t * @returns The vertex reconstructed at that version.\n\t * @throws NotFoundError if the vertex or version is not found.\n\t */\n\tpublic async getVersion(id: string, versionId: string): Promise<IAuditableItemGraphVertex> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(versionId), versionId);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tconst targetChangeset = await this._changesetStorage.get(versionId);\n\t\t\tif (Is.empty(targetChangeset) || targetChangeset.vertexId !== vertexId) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"versionNotFound\", versionId);\n\t\t\t}\n\n\t\t\tconst changesets = await this.internalGetChangesets(vertexId, {\n\t\t\t\tmaxVersion: targetChangeset.version\n\t\t\t});\n\n\t\t\tlet entityState: AuditableItemGraphVertex = {\n\t\t\t\tid: vertexEntity.id,\n\t\t\t\tdateCreated: vertexEntity.dateCreated,\n\t\t\t\torganizationIdentity: vertexEntity.organizationIdentity\n\t\t\t};\n\t\t\tfor (const changeset of changesets) {\n\t\t\t\tentityState = JsonHelper.patch(entityState, changeset.patches);\n\t\t\t}\n\n\t\t\tconst vertexModel = this.vertexEntityToJsonLd(entityState);\n\t\t\tvertexModel.version = targetChangeset.version;\n\n\t\t\tconst result = await JsonLdProcessor.compact(vertexModel, vertexModel[\"@context\"]);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"getVersionFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get all versions of a graph vertex.\n\t * @param id The id of the vertex.\n\t * @param options Additional options for the operation.\n\t * @param options.after Only return versions created after this ISO 8601 timestamp (exclusive).\n\t * @param options.before Only return versions created before this ISO 8601 timestamp (exclusive).\n\t * @returns The list of vertex versions.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async getVersions(\n\t\tid: string,\n\t\toptions?: {\n\t\t\tafter?: string;\n\t\t\tbefore?: string;\n\t\t}\n\t): Promise<IAuditableItemGraphVertexVersionList> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tconst beforeDate = Coerce.dateTime(options?.before);\n\t\t\tconst afterDate = Coerce.dateTime(options?.after);\n\n\t\t\tconst allChangesets = await this.internalGetChangesets(vertexId, {\n\t\t\t\tbefore: beforeDate?.toISOString()\n\t\t\t});\n\n\t\t\tconst versions: number[] = [];\n\t\t\tfor (const changeset of allChangesets) {\n\t\t\t\tconst changesetDate = Coerce.dateTime(changeset.dateCreated);\n\t\t\t\tconst afterExcluded =\n\t\t\t\t\t!Is.empty(afterDate) && !Is.empty(changesetDate) && changesetDate <= afterDate;\n\n\t\t\t\tif (!afterExcluded) {\n\t\t\t\t\tversions.push(changeset.version ?? 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst versionList: IAuditableItemGraphVertexVersionList = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.VertexVersionList],\n\t\t\t\t[SchemaOrgTypes.ItemListElement]: versions\n\t\t\t};\n\n\t\t\treturn await JsonLdProcessor.compact(versionList, versionList[\"@context\"]);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"getVersionsFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove the verifiable storage for an item.\n\t * @param id The id of the vertex to get.\n\t * @returns Nothing.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async removeVerifiable(id: string): Promise<void> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst vertexId = urnParsed.namespaceSpecific(0);\n\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\tthrow new NotFoundError(AuditableItemGraphService.CLASS_NAME, \"vertexNotFound\", id);\n\t\t\t}\n\n\t\t\tlet changesetsResult;\n\t\t\tdo {\n\t\t\t\tchangesetsResult = await this._changesetStorage.query(\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: \"vertexId\",\n\t\t\t\t\t\tvalue: vertexId,\n\t\t\t\t\t\tcomparison: ComparisonOperator.Equals\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\t\t\t\tsortDirection: SortDirection.Ascending\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\tundefined,\n\t\t\t\t\tchangesetsResult?.cursor\n\t\t\t\t);\n\n\t\t\t\tfor (const changeset of changesetsResult.entities) {\n\t\t\t\t\tif (Is.stringValue(changeset.proofId)) {\n\t\t\t\t\t\tawait this._immutableProofComponent.removeVerifiable(changeset.proofId);\n\t\t\t\t\t\tdelete changeset.proofId;\n\t\t\t\t\t\tawait this._changesetStorage.set(changeset as AuditableItemGraphChangeset);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} while (Is.stringValue(changesetsResult.cursor));\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"removeVerifiableFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Query the graph for vertices.\n\t * @param options The query options.\n\t * @param options.id The optional id to look for.\n\t * @param options.idMode Look in id, alias or both, defaults to both.\n\t * @param options.idExact Find only exact matches, default to false meaning partial matching.\n\t * @param options.resourceTypes Include vertices with specific resource types.\n\t * @param conditions Conditions to use in the query.\n\t * @param orderBy The order for the results, defaults to created.\n\t * @param orderByDirection The direction for the order, defaults to desc.\n\t * @param properties The properties to return, if not provided defaults to id, created, aliases and object.\n\t * @param cursor The cursor to request the next chunk of entities.\n\t * @param limit Limit the number of entities to return.\n\t * @returns The entities, which can be partial if a limited keys list was provided.\n\t */\n\tpublic async query(\n\t\toptions?: {\n\t\t\tid?: string;\n\t\t\tidMode?: \"id\" | \"alias\" | \"both\";\n\t\t\tidExact?: boolean;\n\t\t\tresourceTypes?: string[];\n\t\t},\n\t\tconditions?: IComparator[],\n\t\torderBy?: keyof Pick<IAuditableItemGraphVertex, \"dateCreated\" | \"dateModified\">,\n\t\torderByDirection?: SortDirection,\n\t\tproperties?: (keyof IAuditableItemGraphVertex)[],\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tentries: IAuditableItemGraphVertexList;\n\t\tcursor?: string;\n\t}> {\n\t\ttry {\n\t\t\tconst propertiesToReturn: (keyof IAuditableItemGraphVertex)[] = properties ?? [\n\t\t\t\t\"id\",\n\t\t\t\t\"dateCreated\",\n\t\t\t\t\"dateModified\",\n\t\t\t\t\"aliases\",\n\t\t\t\t\"annotationObject\"\n\t\t\t];\n\t\t\tconst combinedConditions = conditions ?? [];\n\t\t\tconst orderProperty = orderBy ?? \"dateCreated\";\n\t\t\tconst orderDirection = orderByDirection ?? SortDirection.Descending;\n\t\t\tconst idExact = options?.idExact ?? false;\n\n\t\t\tconst idOrAlias = options?.id;\n\t\t\tif (Is.stringValue(idOrAlias)) {\n\t\t\t\tconst idMode = options?.idMode ?? \"both\";\n\t\t\t\tif (idMode === \"id\" || idMode === \"both\") {\n\t\t\t\t\tcombinedConditions.push({\n\t\t\t\t\t\tproperty: \"id\",\n\t\t\t\t\t\tcomparison: idExact ? ComparisonOperator.Equals : ComparisonOperator.Includes,\n\t\t\t\t\t\tvalue: idOrAlias\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (idMode === \"alias\" || idMode === \"both\") {\n\t\t\t\t\tcombinedConditions.push({\n\t\t\t\t\t\tproperty: \"aliasIndex\",\n\t\t\t\t\t\tcomparison: ComparisonOperator.Includes,\n\t\t\t\t\t\tvalue: idExact ? `||${idOrAlias.toLowerCase()}||` : idOrAlias.toLowerCase()\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Is.arrayValue(options?.resourceTypes)) {\n\t\t\t\tfor (const resourceType of options.resourceTypes) {\n\t\t\t\t\tcombinedConditions.push({\n\t\t\t\t\t\tproperty: \"resourceTypeIndex\",\n\t\t\t\t\t\tcomparison: ComparisonOperator.Includes,\n\t\t\t\t\t\tvalue: `||${resourceType.toLowerCase()}||`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!propertiesToReturn.includes(\"id\")) {\n\t\t\t\tpropertiesToReturn.unshift(\"id\");\n\t\t\t}\n\n\t\t\tconst results = await this._vertexStorage.query(\n\t\t\t\tcombinedConditions.length > 0\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tconditions: combinedConditions,\n\t\t\t\t\t\t\tlogicalOperator: LogicalOperator.Or\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tproperty: orderProperty,\n\t\t\t\t\t\tsortDirection: orderDirection\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tpropertiesToReturn as (keyof AuditableItemGraphVertex)[],\n\t\t\t\tcursor,\n\t\t\t\tlimit\n\t\t\t);\n\n\t\t\tconst models: IAuditableItemGraphVertex[] = results.entities.map(e =>\n\t\t\t\tthis.vertexEntityToJsonLd(e as AuditableItemGraphVertex)\n\t\t\t);\n\n\t\t\tconst vertexList: IAuditableItemGraphVertexList = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.VertexList],\n\t\t\t\t[SchemaOrgTypes.ItemListElement]: models\n\t\t\t};\n\n\t\t\tconst result = await JsonLdProcessor.compact(vertexList, vertexList[\"@context\"]);\n\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.QueriesExecuted,\n\t\t\t\t{\n\t\t\t\t\tresultCount: models.length,\n\t\t\t\t\thasMore: Is.stringValue(results.cursor)\n\t\t\t\t}\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tentries: result,\n\t\t\t\tcursor: results.cursor\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\"queryingFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Map the vertex entity to JSON-LD.\n\t * @param vertexEntity The vertex entity.\n\t * @returns The model.\n\t * @internal\n\t */\n\tprivate vertexEntityToJsonLd(vertexEntity: AuditableItemGraphVertex): IAuditableItemGraphVertex {\n\t\tconst model: IAuditableItemGraphVertex = {\n\t\t\t\"@context\": [\n\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\tSchemaOrgContexts.Context\n\t\t\t],\n\t\t\ttype: AuditableItemGraphTypes.Vertex,\n\t\t\tid: new Urn(AuditableItemGraphService.NAMESPACE, vertexEntity.id).toString(),\n\t\t\tdateCreated: vertexEntity.dateCreated,\n\t\t\tdateModified: vertexEntity.dateModified,\n\t\t\torganizationIdentity: vertexEntity.organizationIdentity,\n\t\t\tannotationObject: vertexEntity.annotationObject\n\t\t};\n\n\t\tif (Is.arrayValue(vertexEntity.aliases)) {\n\t\t\tmodel.aliases ??= [];\n\t\t\tfor (const aliasEntity of vertexEntity.aliases) {\n\t\t\t\tconst aliasModel: IAuditableItemGraphAlias = {\n\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t],\n\t\t\t\t\ttype: AuditableItemGraphTypes.Alias,\n\t\t\t\t\tid: aliasEntity.id,\n\t\t\t\t\taliasFormat: aliasEntity.aliasFormat,\n\t\t\t\t\tdateCreated: aliasEntity.dateCreated,\n\t\t\t\t\tdateModified: aliasEntity.dateModified,\n\t\t\t\t\tdateDeleted: aliasEntity.dateDeleted,\n\t\t\t\t\tannotationObject: aliasEntity.annotationObject\n\t\t\t\t};\n\t\t\t\tmodel.aliases.push(aliasModel);\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(vertexEntity.resources)) {\n\t\t\tmodel.resources ??= [];\n\t\t\tfor (const resourceEntity of vertexEntity.resources) {\n\t\t\t\tconst resourceModel: IAuditableItemGraphResource = {\n\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t],\n\t\t\t\t\ttype: AuditableItemGraphTypes.Resource,\n\t\t\t\t\tid: resourceEntity.id,\n\t\t\t\t\tdateCreated: resourceEntity.dateCreated,\n\t\t\t\t\tdateModified: resourceEntity.dateModified,\n\t\t\t\t\tdateDeleted: resourceEntity.dateDeleted,\n\t\t\t\t\tresourceObject: resourceEntity.resourceObject\n\t\t\t\t};\n\t\t\t\tmodel.resources.push(resourceModel);\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(vertexEntity.edges)) {\n\t\t\tmodel.edges ??= [];\n\t\t\tfor (const edgeEntity of vertexEntity.edges) {\n\t\t\t\tconst edgeModel: IAuditableItemGraphEdge = {\n\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t],\n\t\t\t\t\ttype: AuditableItemGraphTypes.Edge,\n\t\t\t\t\tid: this.fullEdgeId(vertexEntity.id, edgeEntity.id),\n\t\t\t\t\ttargetId: edgeEntity.targetId,\n\t\t\t\t\tdateCreated: edgeEntity.dateCreated,\n\t\t\t\t\tdateModified: edgeEntity.dateModified,\n\t\t\t\t\tdateDeleted: edgeEntity.dateDeleted,\n\t\t\t\t\tedgeRelationships: edgeEntity.edgeRelationships,\n\t\t\t\t\tannotationObject: edgeEntity.annotationObject\n\t\t\t\t};\n\t\t\t\tmodel.edges.push(edgeModel);\n\t\t\t}\n\t\t}\n\n\t\treturn model;\n\t}\n\n\t/**\n\t * Map the changeset entity to a JSON-LD.\n\t * @param vertexId The id of the vertex the changeset belongs to.\n\t * @param changesetEntity The changeset entity.\n\t * @returns The model.\n\t * @internal\n\t */\n\tprivate changesetEntityToJsonLd(\n\t\tvertexId: string,\n\t\tchangesetEntity: AuditableItemGraphChangeset\n\t): IAuditableItemGraphChangeset {\n\t\tconst model: IAuditableItemGraphChangeset = {\n\t\t\t\"@context\": [\n\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\tSchemaOrgContexts.Context\n\t\t\t],\n\t\t\ttype: AuditableItemGraphTypes.Changeset,\n\t\t\tid: new Urn(AuditableItemGraphService.NAMESPACE, [\n\t\t\t\tvertexId,\n\t\t\t\tAuditableItemGraphService.NAMESPACE_CHANGESET,\n\t\t\t\tchangesetEntity.id\n\t\t\t]).toString(),\n\t\t\tdateCreated: changesetEntity.dateCreated,\n\t\t\tuserIdentity: changesetEntity.userIdentity,\n\t\t\tpatches: changesetEntity.patches.map(p => ({\n\t\t\t\t\"@context\": [\n\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\tAuditableItemGraphContexts.ContextCommon,\n\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t],\n\t\t\t\ttype: AuditableItemGraphTypes.PatchOperation,\n\t\t\t\tpatchOperation: p.op,\n\t\t\t\tpatchPath: p.path,\n\t\t\t\tpatchFrom: p.from,\n\t\t\t\tpatchValue: p.value\n\t\t\t})),\n\t\t\tproofId: changesetEntity.proofId,\n\t\t\tversion: changesetEntity.version\n\t\t};\n\n\t\treturn model;\n\t}\n\n\t/**\n\t * Fetch all changesets for a vertex in ascending date order.\n\t * @param vertexId The internal vertex id.\n\t * @param options Optional filtering options.\n\t * @param options.before Only fetch changesets created strictly before this ISO 8601 timestamp.\n\t * @param options.maxVersion Only fetch changesets with version <= this value.\n\t * @returns All changeset entities sorted ascending by dateCreated.\n\t * @internal\n\t */\n\tprivate async internalGetChangesets(\n\t\tvertexId: string,\n\t\toptions?: { before?: string; maxVersion?: number }\n\t): Promise<AuditableItemGraphChangeset[]> {\n\t\tconst all: AuditableItemGraphChangeset[] = [];\n\t\tlet cursor: string | undefined;\n\n\t\tconst conditions: IComparator[] = [\n\t\t\t{ property: \"vertexId\", value: vertexId, comparison: ComparisonOperator.Equals }\n\t\t];\n\t\tif (Is.stringValue(options?.before)) {\n\t\t\tconditions.push({\n\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\tvalue: options.before,\n\t\t\t\tcomparison: ComparisonOperator.LessThan\n\t\t\t});\n\t\t}\n\t\tif (!Is.empty(options?.maxVersion)) {\n\t\t\tconditions.push({\n\t\t\t\tproperty: \"version\",\n\t\t\t\tvalue: options.maxVersion,\n\t\t\t\tcomparison: ComparisonOperator.LessThanOrEqual\n\t\t\t});\n\t\t}\n\n\t\tdo {\n\t\t\tconst result = await this._changesetStorage.query(\n\t\t\t\t{ conditions, logicalOperator: LogicalOperator.And },\n\t\t\t\t[{ property: \"dateCreated\", sortDirection: SortDirection.Ascending }],\n\t\t\t\tundefined,\n\t\t\t\tcursor\n\t\t\t);\n\t\t\tall.push(...(result.entities as AuditableItemGraphChangeset[]));\n\t\t\tcursor = result.cursor;\n\t\t} while (Is.stringValue(cursor));\n\n\t\treturn all;\n\t}\n\n\t/**\n\t * Update the aliases of a vertex model.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param aliases The aliases to update.\n\t * @internal\n\t */\n\tprivate async updateAliasList(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\taliases?: IAuditableItemGraphAlias[]\n\t): Promise<void> {\n\t\tconst active = vertex.aliases?.filter(a => Is.empty(a.dateDeleted)) ?? [];\n\n\t\t// The active aliases that are not in the update list should be marked as deleted.\n\t\tif (Is.arrayValue(active)) {\n\t\t\tfor (const alias of active) {\n\t\t\t\tif (!aliases?.find(a => a.id === alias.id)) {\n\t\t\t\t\talias.dateDeleted = context.now;\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.AliasesDeleted\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(aliases)) {\n\t\t\tfor (const alias of aliases) {\n\t\t\t\tawait this.updateAlias(context, vertex, alias);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Update an alias in the vertex.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param alias The alias.\n\t * @internal\n\t */\n\tprivate async updateAlias(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\talias: IAuditableItemGraphAlias\n\t): Promise<void> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(alias), alias);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(alias.id), alias.id);\n\n\t\tif (alias.unique ?? false) {\n\t\t\tconst existingVertices = await this.findMatchingVertices(vertex.id, alias.id);\n\t\t\tif (existingVertices) {\n\t\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"aliasNotUnique\", {\n\t\t\t\t\taliasId: alias.id\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (Is.object(alias.annotationObject)) {\n\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\tawait JsonLdHelper.validate(alias.annotationObject, validationFailures);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(alias.annotationObject),\n\t\t\t\tvalidationFailures\n\t\t\t);\n\t\t}\n\n\t\t// Try to find an existing alias with the same id.\n\t\tconst existing = vertex.aliases?.find(a => a.id === alias.id);\n\n\t\tif (Is.empty(existing) || !Is.empty(existing?.dateDeleted)) {\n\t\t\t// Did not find a matching item, or found one which is deleted.\n\t\t\tvertex.aliases ??= [];\n\n\t\t\tconst model: AuditableItemGraphAlias = {\n\t\t\t\tid: alias.id,\n\t\t\t\taliasFormat: alias.aliasFormat,\n\t\t\t\tdateCreated: context.now,\n\t\t\t\tannotationObject: alias.annotationObject,\n\t\t\t\tunique: alias.unique\n\t\t\t};\n\n\t\t\tvertex.aliases.push(model);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.AliasesAdded\n\t\t\t);\n\t\t} else if (\n\t\t\texisting.aliasFormat !== alias.aliasFormat ||\n\t\t\t!ObjectHelper.equal(existing.annotationObject, alias.annotationObject, false) ||\n\t\t\texisting.unique !== alias.unique\n\t\t) {\n\t\t\t// Existing alias found, update the annotationObject.\n\t\t\texisting.dateModified = context.now;\n\t\t\texisting.aliasFormat = alias.aliasFormat;\n\t\t\texisting.annotationObject = alias.annotationObject;\n\t\t\texisting.unique = alias.unique;\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.AliasesModified\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Update the resources of a vertex.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param resources The resources to update.\n\t * @internal\n\t */\n\tprivate async updateResourceList(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tresources?: IAuditableItemGraphResource[]\n\t): Promise<void> {\n\t\tif (Is.arrayValue(resources)) {\n\t\t\tfor (let i = 0; i < resources.length; i++) {\n\t\t\t\tconst id = this.getResourceId(resources[i]);\n\t\t\t\tif (Is.empty(id)) {\n\t\t\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"resourceIdMissing\", {\n\t\t\t\t\t\tindex: i\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst active = vertex.resources?.filter(r => Is.empty(r.dateDeleted)) ?? [];\n\n\t\t// The active resources that are not in the update list should be marked as deleted.\n\t\tif (Is.arrayValue(active)) {\n\t\t\tfor (const resource of active) {\n\t\t\t\tif (!resources?.find(a => this.getResourceId(a) === this.getResourceId(resource))) {\n\t\t\t\t\tresource.dateDeleted = context.now;\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.ResourcesDeleted\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(resources)) {\n\t\t\tfor (const resource of resources) {\n\t\t\t\tawait this.updateResource(context, vertex, resource);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Add a resource to the vertex.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param resource The resource.\n\t * @internal\n\t */\n\tprivate async updateResource(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tresource: IAuditableItemGraphResource\n\t): Promise<void> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(resource), resource);\n\n\t\tif (Is.object(resource.resourceObject)) {\n\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\tawait JsonLdHelper.validate(resource.resourceObject, validationFailures);\n\t\t\tValidation.asValidationError(\n\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\tnameof(resource.resourceObject),\n\t\t\t\tvalidationFailures\n\t\t\t);\n\t\t}\n\n\t\t// Try to find an existing resource with the same id.\n\t\tconst existing = vertex.resources?.find(\n\t\t\tr => this.getResourceId(r) === this.getResourceId(resource)\n\t\t);\n\n\t\tif (Is.empty(existing) || !Is.empty(existing?.dateDeleted)) {\n\t\t\t// Did not find a matching item, or found one which is deleted.\n\t\t\tvertex.resources ??= [];\n\n\t\t\tconst model: AuditableItemGraphResource = {\n\t\t\t\tid: resource.id,\n\t\t\t\tdateCreated: context.now,\n\t\t\t\tresourceObject: resource.resourceObject\n\t\t\t};\n\n\t\t\tvertex.resources.push(model);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.ResourcesAdded\n\t\t\t);\n\t\t} else if (!ObjectHelper.equal(existing.resourceObject, resource.resourceObject, false)) {\n\t\t\t// Existing resource found, update the resourceObject.\n\t\t\texisting.dateModified = context.now;\n\t\t\texisting.resourceObject = resource.resourceObject;\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.ResourcesModified\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Update the edges of a vertex.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param edges The edges to update.\n\t * @internal\n\t */\n\tprivate async updateEdgeList(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tedges?: IAuditableItemGraphEdge[]\n\t): Promise<void> {\n\t\tconst active = vertex.edges?.filter(e => Is.empty(e.dateDeleted)) ?? [];\n\n\t\t// The active edges that are not in the update list should be marked as deleted.\n\t\tif (Is.arrayValue(active)) {\n\t\t\tfor (const edge of active) {\n\t\t\t\tif (!edges?.find(e => Is.stringValue(e.id) && this.reduceEdgeId(e.id) === edge.id)) {\n\t\t\t\t\tedge.dateDeleted = context.now;\n\t\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\t\tAuditableItemGraphMetricIds.EdgesDeleted\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(edges)) {\n\t\t\tfor (const edge of edges) {\n\t\t\t\tawait this.updateEdge(context, vertex, edge);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Add an edge to the vertex.\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param edge The edge.\n\t * @internal\n\t */\n\tprivate async updateEdge(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tedge: IAuditableItemGraphEdge\n\t): Promise<void> {\n\t\tGuards.object(AuditableItemGraphService.CLASS_NAME, nameof(edge), edge);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(edge.targetId), edge.targetId);\n\t\tGuards.arrayValue(\n\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\tnameof(edge.edgeRelationships),\n\t\t\tedge.edgeRelationships\n\t\t);\n\n\t\tconst validationFailures: IValidationFailure[] = [];\n\t\tif (edge.targetId === vertex.id) {\n\t\t\tvalidationFailures.push({\n\t\t\t\tproperty: \"id\",\n\t\t\t\treason: `validation.${StringHelper.camelCase(AuditableItemGraphService.CLASS_NAME)}.edgeIdSameAsVertexId`,\n\t\t\t\tproperties: {\n\t\t\t\t\ttargetId: edge.targetId\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tif (Is.object(edge.annotationObject)) {\n\t\t\tawait JsonLdHelper.validate(edge.annotationObject, validationFailures);\n\t\t}\n\t\tValidation.asValidationError(\n\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\tnameof(edge.annotationObject),\n\t\t\tvalidationFailures\n\t\t);\n\n\t\tlet findId = Is.stringValue(edge.id) ? this.reduceEdgeId(edge.id) : undefined;\n\t\tif (Is.empty(findId)) {\n\t\t\tfindId = RandomHelper.generateUuidV7(\"compact\");\n\t\t}\n\n\t\t// Try to find an existing edge with the same id.\n\t\tconst existing = vertex.edges?.find(r => r.id === findId);\n\n\t\tif (Is.empty(existing) || !Is.empty(existing?.dateDeleted)) {\n\t\t\t// Did not find a matching item, or found one which is deleted.\n\t\t\tvertex.edges ??= [];\n\n\t\t\tconst model: AuditableItemGraphEdge = {\n\t\t\t\tid: findId,\n\t\t\t\ttargetId: edge.targetId,\n\t\t\t\tdateCreated: context.now,\n\t\t\t\tannotationObject: edge.annotationObject,\n\t\t\t\tedgeRelationships: edge.edgeRelationships\n\t\t\t};\n\n\t\t\tvertex.edges.push(model);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.EdgesAdded\n\t\t\t);\n\t\t} else if (\n\t\t\texisting.targetId !== edge.targetId ||\n\t\t\t!ArrayHelper.matches(existing.edgeRelationships, edge.edgeRelationships) ||\n\t\t\t!ObjectHelper.equal(existing.annotationObject, edge.annotationObject, false)\n\t\t) {\n\t\t\t// Existing edge found, update the properties.\n\t\t\texisting.targetId = edge.targetId;\n\t\t\texisting.dateModified = context.now;\n\t\t\texisting.edgeRelationships = edge.edgeRelationships;\n\t\t\texisting.annotationObject = edge.annotationObject;\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.EdgesModified\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add a changeset to the vertex and generate the associated verifications.\n\t * @param context The context for the operation.\n\t * @param original The original vertex.\n\t * @param updated The updated vertex.\n\t * @param isNew Whether this is a new item.\n\t * @param version The version number of the vertex after this changeset.\n\t * @returns True if there were changes.\n\t * @internal\n\t */\n\tprivate async addChangeset(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\toriginal: AuditableItemGraphVertex,\n\t\tupdated: AuditableItemGraphVertex,\n\t\tisNew: boolean,\n\t\tversion: number\n\t): Promise<IPatchOperation[]> {\n\t\tconst patches = JsonHelper.diff(original, updated);\n\n\t\t// If there is a diff set or this is the first time the item is created.\n\t\tif (patches.length > 0 || isNew) {\n\t\t\tconst changesetEntity: AuditableItemGraphChangeset = {\n\t\t\t\tid: RandomHelper.generateUuidV7(\"compact\"),\n\t\t\t\tvertexId: updated.id,\n\t\t\t\tdateCreated: context.now,\n\t\t\t\tuserIdentity: context.contextIds?.[ContextIdKeys.User],\n\t\t\t\tpatches,\n\t\t\t\tversion\n\t\t\t};\n\n\t\t\t// Create the JSON-LD object we want to use for the proof\n\t\t\t// this is a subset of fixed properties from the changeset object.\n\t\t\tconst reducedChangesetJsonLd = this.changesetEntityToJsonLd(\n\t\t\t\toriginal.id,\n\t\t\t\tObjectHelper.pick(changesetEntity, AuditableItemGraphService._PROOF_KEYS_CHANGESET)\n\t\t\t);\n\n\t\t\t// Create the proof for the changeset object\n\t\t\tchangesetEntity.proofId = await this._immutableProofComponent.create(\n\t\t\t\tJsonLdHelper.toNodeObject(reducedChangesetJsonLd)\n\t\t\t);\n\n\t\t\t// Link the verifiable storage id to the changeset\n\t\t\tawait this._changesetStorage.set(changesetEntity);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.ChangesetsCreated\n\t\t\t);\n\n\t\t\treturn patches;\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Verify the changesets of a vertex.\n\t * @param vertex The vertex to verify.\n\t * @param verifySignatureDepth How many signatures to verify.\n\t * @internal\n\t */\n\tprivate async verifyChangesets(\n\t\tvertex: IAuditableItemGraphVertex,\n\t\tverifySignatureDepth: VerifyDepth\n\t): Promise<{\n\t\tverified: boolean;\n\t\tchangesets: IAuditableItemGraphChangeset[];\n\t}> {\n\t\tconst changesets: IAuditableItemGraphChangeset[] = [];\n\n\t\tlet verified = true;\n\n\t\tconst vertexIdUrn = Urn.fromValidString(vertex.id);\n\t\tconst vertexId = vertexIdUrn.namespaceSpecific();\n\t\tlet cursor;\n\n\t\tdo {\n\t\t\tconst chunk = await this.verifyChangesetChunk(vertexId, verifySignatureDepth, cursor);\n\t\t\tcursor = chunk.cursor;\n\t\t\tif (!chunk.verified) {\n\t\t\t\tverified = false;\n\t\t\t}\n\t\t\tchangesets.push(...chunk.changesets);\n\t\t} while (Is.stringValue(cursor));\n\n\t\tif (verified) {\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.VerificationsSucceeded\n\t\t\t);\n\t\t} else {\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.VerificationsFailed\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tverified,\n\t\t\tchangesets\n\t\t};\n\t}\n\n\t/**\n\t * Verify a chunk of changesets for a vertex.\n\t * @param vertexId The id of the vertex to verify the changesets for.\n\t * @param verifySignatureDepth How many signatures to verify.\n\t * @param cursor The cursor to request the next chunk of changesets.\n\t * @param limit The maximum number of changesets to verify in this chunk.\n\t * @returns The changesets and whether they were verified.\n\t * @internal\n\t */\n\tprivate async verifyChangesetChunk(\n\t\tvertexId: string,\n\t\tverifySignatureDepth: string,\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tchangesets: IAuditableItemGraphChangeset[];\n\t\tverified: boolean;\n\t\tcursor?: string;\n\t}> {\n\t\tconst changesets: IAuditableItemGraphChangeset[] = [];\n\t\tlet verified = true;\n\n\t\tconst changesetsResult = await this._changesetStorage.query(\n\t\t\t{\n\t\t\t\tproperty: \"vertexId\",\n\t\t\t\tvalue: vertexId,\n\t\t\t\tcomparison: ComparisonOperator.Equals\n\t\t\t},\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tproperty: \"dateCreated\",\n\t\t\t\t\tsortDirection: SortDirection.Ascending\n\t\t\t\t}\n\t\t\t],\n\t\t\tundefined,\n\t\t\tcursor,\n\t\t\tlimit\n\t\t);\n\n\t\tconst storedChangesets = changesetsResult.entities as AuditableItemGraphChangeset[];\n\t\tif (Is.arrayValue(storedChangesets)) {\n\t\t\tfor (let i = 0; i < storedChangesets.length; i++) {\n\t\t\t\tconst storedChangeset = storedChangesets[i];\n\n\t\t\t\tconst storedChangesetJsonLd = this.changesetEntityToJsonLd(vertexId, storedChangeset);\n\t\t\t\tchangesets.push(storedChangesetJsonLd);\n\n\t\t\t\t// If we are verifying all signatures\n\t\t\t\t// or this is the last changeset (cursor is empty)\n\t\t\t\t// and the changeset has a proofId, then verify the proof.\n\t\t\t\tif (\n\t\t\t\t\tverifySignatureDepth === VerifyDepth.All ||\n\t\t\t\t\t(verifySignatureDepth === VerifyDepth.Current &&\n\t\t\t\t\t\t!Is.stringValue(changesetsResult.cursor) &&\n\t\t\t\t\t\ti === storedChangesets.length - 1)\n\t\t\t\t) {\n\t\t\t\t\tstoredChangesetJsonLd.verification =\n\t\t\t\t\t\tawait this.verifyChangesetSignature(storedChangesetJsonLd);\n\t\t\t\t\tif (storedChangesetJsonLd.verification?.verified !== true) {\n\t\t\t\t\t\tverified = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn { changesets, verified, cursor: changesetsResult.cursor };\n\t}\n\n\t/**\n\t * Verify the signature of a changeset and add the verification result to the changeset JSON-LD.\n\t * @param storedChangeset The changeset to verify.\n\t * @returns Whether the changeset is verified.\n\t */\n\tprivate async verifyChangesetSignature(\n\t\tstoredChangeset: IAuditableItemGraphChangeset\n\t): Promise<IImmutableProofVerification | undefined> {\n\t\tlet verification: IImmutableProofVerification | undefined;\n\t\tif (!Is.stringValue(storedChangeset.proofId)) {\n\t\t\tverification = {\n\t\t\t\t\"@context\": ImmutableProofContexts.Context,\n\t\t\t\ttype: ImmutableProofTypes.ImmutableProofVerification,\n\t\t\t\tverified: false,\n\t\t\t\tfailure: ImmutableProofFailure.ProofMissing\n\t\t\t};\n\t\t} else {\n\t\t\t// Verify the proof for the changeset object\n\t\t\tverification = await this._immutableProofComponent.verify(storedChangeset.proofId);\n\t\t}\n\t\treturn verification;\n\t}\n\n\t/**\n\t * Get the resource id from a resource object.\n\t * @param resource The resource.\n\t * @param resource.id The id of the resource.\n\t * @param resource.resourceObject The resource object.\n\t * @returns The resource id if it can find one.\n\t */\n\tprivate getResourceId(resource: {\n\t\tid?: string;\n\t\tresourceObject?: IJsonLdNodeObject;\n\t}): string | undefined {\n\t\treturn (\n\t\t\tresource.id ??\n\t\t\tObjectHelper.extractProperty<string>(resource.resourceObject, [\"id\", \"@id\"], false)\n\t\t);\n\t}\n\n\t/**\n\t * Build the indexes for the vertex.\n\t * @param vertex The vertex to build the indexes for.\n\t * @returns The indexes.\n\t * @internal\n\t */\n\tprivate buildIndexes(vertex: AuditableItemGraphVertex): {\n\t\taliasIndex?: string;\n\t\tresourceTypeIndex?: string;\n\t} {\n\t\tconst aliasIndex = vertex.aliases\n\t\t\t?.filter(a => Is.empty(a.dateDeleted))\n\t\t\t.map(a => a.id)\n\t\t\t.join(\"||\")\n\t\t\t.toLowerCase();\n\n\t\tconst resourceTypes: string[] = [];\n\t\tif (Is.arrayValue(vertex.resources)) {\n\t\t\tfor (const resource of vertex.resources) {\n\t\t\t\tconst resourceType = ObjectHelper.extractProperty<string>(\n\t\t\t\t\tresource.resourceObject,\n\t\t\t\t\t[\"@type\", \"type\"],\n\t\t\t\t\tfalse\n\t\t\t\t);\n\n\t\t\t\tif (Is.stringValue(resourceType) && !resourceTypes.includes(resourceType)) {\n\t\t\t\t\tresourceTypes.push(resourceType);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst resourceTypeIndex = resourceTypes.join(\"||\").toLowerCase();\n\n\t\treturn {\n\t\t\taliasIndex: Is.stringValue(aliasIndex) ? `||${aliasIndex}||` : undefined,\n\t\t\tresourceTypeIndex: Is.stringValue(resourceTypeIndex) ? `||${resourceTypeIndex}||` : undefined\n\t\t};\n\t}\n\n\t/**\n\t * Find vertices with matching aliases.\n\t * @param context The context for the operation.\n\t * @param vertexId The id of the vertex to exclude from the search.\n\t * @param aliasId The alias id to try and find.\n\t * @returns True if any other vertices have matching aliases.\n\t * @internal\n\t */\n\tprivate async findMatchingVertices(vertexId: string, aliasId: string): Promise<boolean> {\n\t\tconst results = await this._vertexStorage.query({\n\t\t\tconditions: [\n\t\t\t\t{\n\t\t\t\t\tproperty: \"aliasIndex\",\n\t\t\t\t\tcomparison: ComparisonOperator.Includes,\n\t\t\t\t\tvalue: `||${aliasId.toLowerCase()}||`\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tproperty: \"id\",\n\t\t\t\t\tvalue: vertexId,\n\t\t\t\t\tcomparison: ComparisonOperator.NotEquals\n\t\t\t\t}\n\t\t\t],\n\t\t\tlogicalOperator: LogicalOperator.And\n\t\t});\n\n\t\treturn results.entities.length > 0;\n\t}\n\n\t/**\n\t * Reduce the edge ID from a URN.\n\t * @param urn The URN to reduce.\n\t * @returns The edge ID.\n\t * @throws GeneralError if the URN is not valid or not an edge URN.\n\t * @internal\n\t */\n\tprivate reduceEdgeId(urn: string): string {\n\t\tconst urnParsed = Urn.fromValidString(urn);\n\t\tif (urnParsed.namespaceIdentifier() !== AuditableItemGraphService.NAMESPACE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: AuditableItemGraphService.NAMESPACE,\n\t\t\t\tid: urn\n\t\t\t});\n\t\t}\n\t\tif (urnParsed.namespaceSpecificParts().length !== 3) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"invalidEdgeId\", {\n\t\t\t\tedgeId: urn\n\t\t\t});\n\t\t}\n\t\tif (urnParsed.namespaceSpecificParts()[1] !== AuditableItemGraphService.NAMESPACE_EDGE) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"invalidEdgeId\", {\n\t\t\t\tedgeId: urn\n\t\t\t});\n\t\t}\n\t\treturn urnParsed.namespaceSpecificParts()[2];\n\t}\n\n\t/**\n\t * Create a full edge ID URN from a vertex ID and edge ID.\n\t * @param vertexId The vertex id the edge belongs to.\n\t * @param edgeId The edge id.\n\t * @returns The full edge ID URN.\n\t * @internal\n\t */\n\tprivate fullEdgeId(vertexId: string, edgeId: string): string {\n\t\treturn new Urn(AuditableItemGraphService.NAMESPACE, [\n\t\t\tvertexId,\n\t\t\tAuditableItemGraphService.NAMESPACE_EDGE,\n\t\t\tedgeId\n\t\t]).toString();\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IAuditableItemGraphServiceConstructorOptions.js","sourceRoot":"","sources":["../../../src/models/IAuditableItemGraphServiceConstructorOptions.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IAuditableItemGraphServiceConfig } from \"./IAuditableItemGraphServiceConfig.js\";\n\n/**\n * Options for the constructor of the auditable item graph service.\n */\nexport interface IAuditableItemGraphServiceConstructorOptions {\n\t/**\n\t * The immutable proof component type.\n\t * @default immutable-proof\n\t */\n\timmutableProofComponentType?: string;\n\n\t/**\n\t * The entity storage for vertices.\n\t * @default auditable-item-graph-vertex\n\t */\n\tvertexEntityStorageType?: string;\n\n\t/**\n\t * The entity storage for changesets.\n\t * @default auditable-item-graph-changeset\n\t */\n\tchangesetEntityStorageType?: string;\n\n\t/**\n\t * The event bus component type, defaults to no event bus.\n\t */\n\teventBusComponentType?: string;\n\n\t/**\n\t * The configuration for the service.\n\t */\n\tconfig?: IAuditableItemGraphServiceConfig;\n}\n"]}
1
+ {"version":3,"file":"IAuditableItemGraphServiceConstructorOptions.js","sourceRoot":"","sources":["../../../src/models/IAuditableItemGraphServiceConstructorOptions.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IAuditableItemGraphServiceConfig } from \"./IAuditableItemGraphServiceConfig.js\";\n\n/**\n * Options for the constructor of the auditable item graph service.\n */\nexport interface IAuditableItemGraphServiceConstructorOptions {\n\t/**\n\t * The immutable proof component type.\n\t * @default immutable-proof\n\t */\n\timmutableProofComponentType?: string;\n\n\t/**\n\t * The entity storage for vertices.\n\t * @default auditable-item-graph-vertex\n\t */\n\tvertexEntityStorageType?: string;\n\n\t/**\n\t * The entity storage for changesets.\n\t * @default auditable-item-graph-changeset\n\t */\n\tchangesetEntityStorageType?: string;\n\n\t/**\n\t * The event bus component type, defaults to no event bus.\n\t */\n\teventBusComponentType?: string;\n\n\t/**\n\t * The component type for the optional telemetry component used for event metrics, defaults to no telemetry.\n\t */\n\ttelemetryComponentType?: string;\n\n\t/**\n\t * The configuration for the service.\n\t */\n\tconfig?: IAuditableItemGraphServiceConfig;\n}\n"]}
@@ -27,6 +27,10 @@ export declare class AuditableItemGraphService implements IAuditableItemGraphCom
27
27
  * @returns The class name of the component.
28
28
  */
29
29
  className(): string;
30
+ /**
31
+ * Register all AIG metrics with the telemetry component.
32
+ */
33
+ start(): Promise<void>;
30
34
  /**
31
35
  * Create a new graph vertex.
32
36
  * @param vertex The vertex to create.
@@ -22,6 +22,10 @@ export interface IAuditableItemGraphServiceConstructorOptions {
22
22
  * The event bus component type, defaults to no event bus.
23
23
  */
24
24
  eventBusComponentType?: string;
25
+ /**
26
+ * The component type for the optional telemetry component used for event metrics, defaults to no telemetry.
27
+ */
28
+ telemetryComponentType?: string;
25
29
  /**
26
30
  * The configuration for the service.
27
31
  */
package/docs/changelog.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.0.3-next.15](https://github.com/iotaledger/twin-auditable-item-graph/compare/auditable-item-graph-service-v0.0.3-next.14...auditable-item-graph-service-v0.0.3-next.15) (2026-05-20)
4
+
5
+
6
+ ### Features
7
+
8
+ * add event-driven telemetry metrics ([#63](https://github.com/iotaledger/twin-auditable-item-graph/issues/63)) ([8fe6cdd](https://github.com/iotaledger/twin-auditable-item-graph/commit/8fe6cdd0d56496402b766c151f002f475ddb8c0e))
9
+ * update dependencies ([482c97e](https://github.com/iotaledger/twin-auditable-item-graph/commit/482c97e16109e504cb495084ef51e860a7f86669))
10
+
11
+
12
+ ### Dependencies
13
+
14
+ * The following workspace dependencies were updated
15
+ * dependencies
16
+ * @twin.org/auditable-item-graph-models bumped from 0.0.3-next.14 to 0.0.3-next.15
17
+
3
18
  ## [0.0.3-next.14](https://github.com/iotaledger/twin-auditable-item-graph/compare/auditable-item-graph-service-v0.0.3-next.13...auditable-item-graph-service-v0.0.3-next.14) (2026-05-18)
4
19
 
5
20
 
@@ -70,6 +70,22 @@ The class name of the component.
70
70
 
71
71
  ***
72
72
 
73
+ ### start() {#start}
74
+
75
+ > **start**(): `Promise`\<`void`\>
76
+
77
+ Register all AIG metrics with the telemetry component.
78
+
79
+ #### Returns
80
+
81
+ `Promise`\<`void`\>
82
+
83
+ #### Implementation of
84
+
85
+ `IAuditableItemGraphComponent.start`
86
+
87
+ ***
88
+
73
89
  ### create() {#create}
74
90
 
75
91
  > **create**(`vertex`): `Promise`\<`string`\>
@@ -54,6 +54,14 @@ The event bus component type, defaults to no event bus.
54
54
 
55
55
  ***
56
56
 
57
+ ### telemetryComponentType? {#telemetrycomponenttype}
58
+
59
+ > `optional` **telemetryComponentType?**: `string`
60
+
61
+ The component type for the optional telemetry component used for event metrics, defaults to no telemetry.
62
+
63
+ ***
64
+
57
65
  ### config? {#config}
58
66
 
59
67
  > `optional` **config?**: [`IAuditableItemGraphServiceConfig`](IAuditableItemGraphServiceConfig.md)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twin.org/auditable-item-graph-service",
3
- "version": "0.0.3-next.14",
3
+ "version": "0.0.3-next.15",
4
4
  "description": "Implements graph lifecycle operations and audited change tracking with API route definitions.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -15,7 +15,7 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "@twin.org/api-models": "next",
18
- "@twin.org/auditable-item-graph-models": "0.0.3-next.14",
18
+ "@twin.org/auditable-item-graph-models": "0.0.3-next.15",
19
19
  "@twin.org/context": "next",
20
20
  "@twin.org/core": "next",
21
21
  "@twin.org/crypto": "next",
@@ -27,6 +27,7 @@
27
27
  "@twin.org/nameof": "next",
28
28
  "@twin.org/standards-schema-org": "next",
29
29
  "@twin.org/standards-w3c-did": "next",
30
+ "@twin.org/telemetry-models": "next",
30
31
  "@twin.org/verifiable-storage-models": "next",
31
32
  "@twin.org/web": "next"
32
33
  },