@twin.org/auditable-item-graph-service 0.0.3-next.19 → 0.0.3-next.20
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.
|
@@ -537,15 +537,9 @@ export class AuditableItemGraphService {
|
|
|
537
537
|
*/
|
|
538
538
|
async removeProof(id) {
|
|
539
539
|
Guards.stringValue(AuditableItemGraphService.CLASS_NAME, "id", id);
|
|
540
|
-
const
|
|
541
|
-
|
|
542
|
-
throw new GeneralError(AuditableItemGraphService.CLASS_NAME, "namespaceMismatch", {
|
|
543
|
-
namespace: AuditableItemGraphService.NAMESPACE,
|
|
544
|
-
id
|
|
545
|
-
});
|
|
546
|
-
}
|
|
540
|
+
const vertexId = this.parseVertexId(id);
|
|
541
|
+
await Mutex.lock(vertexId, { throwOnTimeout: true });
|
|
547
542
|
try {
|
|
548
|
-
const vertexId = urnParsed.namespaceSpecific(0);
|
|
549
543
|
const vertexEntity = await this._vertexStorage.get(vertexId);
|
|
550
544
|
if (Is.empty(vertexEntity)) {
|
|
551
545
|
throw new NotFoundError(AuditableItemGraphService.CLASS_NAME, "vertexNotFound", id);
|
|
@@ -574,6 +568,9 @@ export class AuditableItemGraphService {
|
|
|
574
568
|
catch (error) {
|
|
575
569
|
throw new GeneralError(AuditableItemGraphService.CLASS_NAME, "removeProofFailed", undefined, error);
|
|
576
570
|
}
|
|
571
|
+
finally {
|
|
572
|
+
Mutex.unlock(vertexId);
|
|
573
|
+
}
|
|
577
574
|
}
|
|
578
575
|
/**
|
|
579
576
|
* Query the graph for vertices.
|
|
@@ -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\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 IAuditableItemGraphListPatch,\n\ttype IAuditableItemGraphPartialVertex,\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\tMutex,\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 (PUT — full replacement of vertex state).\n\t * Concurrent updates for the same vertex are serialized via `Mutex` on the vertex id.\n\t * @param vertex The vertex to update.\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 vertexId = this.parseVertexId(vertex.id);\n\n\t\tawait Mutex.lock(vertexId, { throwOnTimeout: true });\n\t\ttry {\n\t\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\t\ttry {\n\t\t\t\tconst schemaValidationFailures: IValidationFailure[] = [];\n\t\t\t\tawait DataTypeHelper.validate(\n\t\t\t\t\tnameof(vertex),\n\t\t\t\t\t`${AuditableItemGraphContexts.Namespace}${AuditableItemGraphTypes.Vertex}`,\n\t\t\t\t\tvertex,\n\t\t\t\t\tschemaValidationFailures\n\t\t\t\t);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\tnameof(vertex),\n\t\t\t\t\tschemaValidationFailures\n\t\t\t\t);\n\n\t\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\t\"vertexNotFound\",\n\t\t\t\t\t\tvertex.id\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (Is.object(vertex.annotationObject)) {\n\t\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\t\tawait JsonLdHelper.validate(vertex.annotationObject, validationFailures);\n\t\t\t\t\tValidation.asValidationError(\n\t\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\tnameof(vertex.annotationObject),\n\t\t\t\t\t\tvalidationFailures\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst context: IAuditableItemGraphServiceContext = {\n\t\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\t\tcontextIds\n\t\t\t\t};\n\n\t\t\t\tdelete vertexEntity.aliasIndex;\n\t\t\t\tconst originalEntity = ObjectHelper.clone(vertexEntity);\n\t\t\t\tconst newEntity = ObjectHelper.clone(vertexEntity);\n\n\t\t\t\tnewEntity.annotationObject = vertex.annotationObject;\n\t\t\t\tawait this.updateAliasList(context, newEntity, vertex.aliases);\n\t\t\t\tawait this.updateResourceList(context, newEntity, vertex.resources);\n\t\t\t\tawait this.updateEdgeList(context, newEntity, vertex.edges);\n\n\t\t\t\tawait this.persistVertexChanges(context, vertexId, vertex.id, originalEntity, newEntity);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\"updatingFailed\",\n\t\t\t\t\tundefined,\n\t\t\t\t\terror\n\t\t\t\t);\n\t\t\t}\n\t\t} finally {\n\t\t\tMutex.unlock(vertexId);\n\t\t}\n\t}\n\n\t/**\n\t * Partially update a graph vertex (PATCH — explicit list patches; only defined properties applied).\n\t * Serialized with `update` via `Mutex` on the same vertex id within this instance.\n\t * @param partial The partial vertex update.\n\t * @returns Nothing.\n\t */\n\tpublic async updatePartial(partial: IAuditableItemGraphPartialVertex): Promise<void> {\n\t\tGuards.object<IAuditableItemGraphPartialVertex>(\n\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\tnameof(partial),\n\t\t\tpartial\n\t\t);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(partial.id), partial.id);\n\n\t\tconst vertexId = this.parseVertexId(partial.id);\n\n\t\tawait Mutex.lock(vertexId, { throwOnTimeout: true });\n\n\t\ttry {\n\t\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\t\ttry {\n\t\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\t\"vertexNotFound\",\n\t\t\t\t\t\tpartial.id\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (partial.annotationObject !== undefined && Is.object(partial.annotationObject)) {\n\t\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\t\tawait JsonLdHelper.validate(partial.annotationObject, validationFailures);\n\t\t\t\t\tValidation.asValidationError(\n\t\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\tnameof(partial.annotationObject),\n\t\t\t\t\t\tvalidationFailures\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst context: IAuditableItemGraphServiceContext = {\n\t\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\t\tcontextIds\n\t\t\t\t};\n\n\t\t\t\tdelete vertexEntity.aliasIndex;\n\t\t\t\tconst originalEntity = ObjectHelper.clone(vertexEntity);\n\t\t\t\tconst newEntity = ObjectHelper.clone(vertexEntity);\n\n\t\t\t\tif (partial.annotationObject !== undefined) {\n\t\t\t\t\tnewEntity.annotationObject = partial.annotationObject;\n\t\t\t\t}\n\t\t\t\tif (partial.aliasPatches !== undefined) {\n\t\t\t\t\tconst aliasPatch = this.validateListPatch<IAuditableItemGraphAlias>(\n\t\t\t\t\t\tnameof(partial.aliasPatches),\n\t\t\t\t\t\tpartial.aliasPatches\n\t\t\t\t\t);\n\t\t\t\t\tawait this.applyAliasPatch(context, newEntity, aliasPatch);\n\t\t\t\t}\n\t\t\t\tif (partial.resourcePatches !== undefined) {\n\t\t\t\t\tconst resourcePatch = this.validateListPatch<IAuditableItemGraphResource>(\n\t\t\t\t\t\tnameof(partial.resourcePatches),\n\t\t\t\t\t\tpartial.resourcePatches\n\t\t\t\t\t);\n\t\t\t\t\tawait this.applyResourcePatch(context, newEntity, resourcePatch);\n\t\t\t\t}\n\t\t\t\tif (partial.edgePatches !== undefined) {\n\t\t\t\t\tconst edgePatch = this.validateListPatch<IAuditableItemGraphEdge>(\n\t\t\t\t\t\tnameof(partial.edgePatches),\n\t\t\t\t\t\tpartial.edgePatches\n\t\t\t\t\t);\n\t\t\t\t\tawait this.applyEdgePatch(context, newEntity, edgePatch);\n\t\t\t\t}\n\n\t\t\t\tawait this.persistVertexChanges(context, vertexId, partial.id, originalEntity, newEntity);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\"updatingFailed\",\n\t\t\t\t\tundefined,\n\t\t\t\t\terror\n\t\t\t\t);\n\t\t\t}\n\t\t} finally {\n\t\t\tMutex.unlock(vertexId);\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 version The version number 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, version: number): Promise<IAuditableItemGraphVertex> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\t\tGuards.integer(AuditableItemGraphService.CLASS_NAME, nameof(version), version);\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 currentVersion = vertexEntity.version ?? 0;\n\t\t\tif (version > currentVersion || version < 0) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\"versionNotFound\",\n\t\t\t\t\tversion.toString()\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Short circuit if requesting the current version to avoid unnecessary changeset retrieval and patching\n\t\t\tif (version === currentVersion) {\n\t\t\t\tconst vertexModel = this.vertexEntityToJsonLd(vertexEntity);\n\t\t\t\tvertexModel.version = version;\n\t\t\t\treturn await JsonLdProcessor.compact(vertexModel, vertexModel[\"@context\"]);\n\t\t\t}\n\n\t\t\tconst changesets = await this.internalGetChangesets(vertexId, {\n\t\t\t\tmaxVersion: 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 = 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: { version: number; dateCreated: string }[] = [];\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({\n\t\t\t\t\t\tversion: changeset.version ?? 0,\n\t\t\t\t\t\tdateCreated: changeset.dateCreated\n\t\t\t\t\t});\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 proof for an item.\n\t * @param id The id of the vertex to remove the proof from.\n\t * @returns Nothing.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async removeProof(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.removeNotarization(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\"removeProofFailed\",\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 * Parse and validate a vertex URN; return the compact storage id.\n\t * @param id The vertex URN.\n\t * @returns The compact vertex id.\n\t * @internal\n\t */\n\tprivate parseVertexId(id: string): string {\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\treturn urnParsed.namespaceSpecific(0);\n\t}\n\n\t/**\n\t * Validate that a PATCH sub-list value is a list patch object, not a bare array.\n\t * @param propertyName The property name for error reporting.\n\t * @param patch The patch value.\n\t * @returns The validated list patch.\n\t * @internal\n\t */\n\tprivate validateListPatch<TItem>(\n\t\tpropertyName: string,\n\t\tpatch: unknown\n\t): IAuditableItemGraphListPatch<TItem> {\n\t\tif (Is.array(patch)) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"listPatchInvalidFormat\", {\n\t\t\t\tproperty: propertyName\n\t\t\t});\n\t\t}\n\n\t\tGuards.object<IAuditableItemGraphListPatch<TItem>>(\n\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\tpropertyName,\n\t\t\tpatch\n\t\t);\n\n\t\treturn patch;\n\t}\n\n\t/**\n\t * Persist vertex changes after update or partial update.\n\t * @param context The context for the operation.\n\t * @param vertexId The compact vertex id.\n\t * @param vertexUrn The vertex URN for events.\n\t * @param originalEntity The entity before changes.\n\t * @param newEntity The entity after changes.\n\t * @internal\n\t */\n\tprivate async persistVertexChanges(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertexId: string,\n\t\tvertexUrn: string,\n\t\toriginalEntity: AuditableItemGraphVertex,\n\t\tnewEntity: AuditableItemGraphVertex\n\t): Promise<void> {\n\t\tconst nextVersion = Is.empty(originalEntity.version)\n\t\t\t? (await this.internalGetChangesets(vertexId)).length\n\t\t\t: originalEntity.version + 1;\n\t\tconst patches = await this.addChangeset(context, originalEntity, newEntity, false, nextVersion);\n\t\tif (patches.length > 0) {\n\t\t\tnewEntity.dateModified = context.now;\n\t\t\tnewEntity.version = nextVersion;\n\n\t\t\tconst indexes = this.buildIndexes(newEntity);\n\n\t\t\tawait this._vertexStorage.set({\n\t\t\t\t...newEntity,\n\t\t\t\t...indexes\n\t\t\t});\n\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.VerticesUpdated,\n\t\t\t\t{\n\t\t\t\t\tpatchCount: patches.length\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tawait this._eventBusComponent?.publish<IAuditableItemGraphEventBusVertexUpdated>(\n\t\t\t\tAuditableItemGraphTopics.VertexUpdated,\n\t\t\t\t{ id: vertexUrn, patches }\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 * Replace the aliases of a vertex model (PUT).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param aliases The new active alias set.\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\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 * Apply alias patch operations (PATCH).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param patch The alias patch.\n\t * @internal\n\t */\n\tprivate async applyAliasPatch(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tpatch: IAuditableItemGraphListPatch<IAuditableItemGraphAlias>\n\t): Promise<void> {\n\t\tif (Is.arrayValue(patch.remove)) {\n\t\t\tfor (const removeId of patch.remove) {\n\t\t\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(removeId), removeId);\n\t\t\t\tconst alias = vertex.aliases?.find(a => a.id === removeId && Is.empty(a.dateDeleted));\n\t\t\t\tif (!Is.empty(alias)) {\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(patch.add)) {\n\t\t\tfor (const alias of patch.add) {\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 * Replace the resources of a vertex (PUT).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param resources The new active resource set.\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\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 * Apply resource patch operations (PATCH).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param patch The resource patch.\n\t * @internal\n\t */\n\tprivate async applyResourcePatch(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tpatch: IAuditableItemGraphListPatch<IAuditableItemGraphResource>\n\t): Promise<void> {\n\t\tif (Is.arrayValue(patch.remove)) {\n\t\t\tfor (const removeId of patch.remove) {\n\t\t\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(removeId), removeId);\n\t\t\t\tconst resource = vertex.resources?.find(\n\t\t\t\t\tr => this.getResourceId(r) === removeId && Is.empty(r.dateDeleted)\n\t\t\t\t);\n\t\t\t\tif (!Is.empty(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(patch.add)) {\n\t\t\tfor (const resource of patch.add) {\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 * Replace the edges of a vertex (PUT).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param edges The new active edge set.\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\t// `active` shares element refs with `vertex.edges` (the cloned newEntity); mutating `edge` below is intended.\n\t\tconst active = vertex.edges?.filter(e => Is.empty(e.dateDeleted)) ?? [];\n\n\t\tif (Is.arrayValue(active)) {\n\t\t\tfor (const edge of active) {\n\t\t\t\tif (\n\t\t\t\t\t!edges?.find(\n\t\t\t\t\t\te =>\n\t\t\t\t\t\t\tthis.edgeMatchesStoredEdge(e, edge.id) ||\n\t\t\t\t\t\t\tthis.edgeMatchesActiveEdgeByRelationship(e, edge)\n\t\t\t\t\t)\n\t\t\t\t) {\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 * Apply edge patch operations (PATCH).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param patch The edge patch.\n\t * @internal\n\t */\n\tprivate async applyEdgePatch(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tpatch: IAuditableItemGraphListPatch<IAuditableItemGraphEdge>\n\t): Promise<void> {\n\t\tif (Is.arrayValue(patch.remove)) {\n\t\t\tfor (const removeId of patch.remove) {\n\t\t\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(removeId), removeId);\n\t\t\t\tconst edge = vertex.edges?.find(\n\t\t\t\t\te => Is.empty(e.dateDeleted) && this.edgeRemoveIdMatches(e.id, removeId)\n\t\t\t\t);\n\t\t\t\tif (!Is.empty(edge)) {\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(patch.add)) {\n\t\t\tfor (const edge of patch.add) {\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\tconst existingActive = vertex.edges?.find(\n\t\t\t\te =>\n\t\t\t\t\tIs.empty(e.dateDeleted) &&\n\t\t\t\t\te.targetId === edge.targetId &&\n\t\t\t\t\tArrayHelper.matches(e.edgeRelationships, edge.edgeRelationships)\n\t\t\t);\n\t\t\tfindId = existingActive?.id ?? 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 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 * Whether an incoming edge matches a stored edge id.\n\t * @param incoming The incoming edge.\n\t * @param storedEdgeId The compact stored edge id.\n\t * @returns True if the incoming edge matches the stored edge id.\n\t * @internal\n\t */\n\tprivate edgeMatchesStoredEdge(incoming: IAuditableItemGraphEdge, storedEdgeId: string): boolean {\n\t\treturn Is.stringValue(incoming.id) && this.reduceEdgeId(incoming.id) === storedEdgeId;\n\t}\n\n\t/**\n\t * Whether a PATCH remove id matches a stored compact edge id (full URN or compact).\n\t * @param storedEdgeId The compact stored edge id.\n\t * @param removeId The id from the patch remove list.\n\t * @returns True if the remove id identifies the stored edge.\n\t * @internal\n\t */\n\tprivate edgeRemoveIdMatches(storedEdgeId: string, removeId: string): boolean {\n\t\tif (storedEdgeId === removeId) {\n\t\t\treturn true;\n\t\t}\n\n\t\ttry {\n\t\t\treturn this.reduceEdgeId(removeId) === storedEdgeId;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Whether an incoming id-less edge matches an active stored edge by target and relationships.\n\t * @param incoming The incoming edge.\n\t * @param stored The stored edge.\n\t * @returns True if they match.\n\t * @internal\n\t */\n\tprivate edgeMatchesActiveEdgeByRelationship(\n\t\tincoming: IAuditableItemGraphEdge,\n\t\tstored: AuditableItemGraphEdge\n\t): boolean {\n\t\treturn (\n\t\t\tIs.empty(incoming.id) &&\n\t\t\tIs.empty(stored.dateDeleted) &&\n\t\t\tincoming.targetId === stored.targetId &&\n\t\t\tArrayHelper.matches(incoming.edgeRelationships, stored.edgeRelationships)\n\t\t);\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 IAuditableItemGraphListPatch,\n\ttype IAuditableItemGraphPartialVertex,\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\tMutex,\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 (PUT — full replacement of vertex state).\n\t * Concurrent updates for the same vertex are serialized via `Mutex` on the vertex id.\n\t * @param vertex The vertex to update.\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 vertexId = this.parseVertexId(vertex.id);\n\n\t\tawait Mutex.lock(vertexId, { throwOnTimeout: true });\n\t\ttry {\n\t\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\t\ttry {\n\t\t\t\tconst schemaValidationFailures: IValidationFailure[] = [];\n\t\t\t\tawait DataTypeHelper.validate(\n\t\t\t\t\tnameof(vertex),\n\t\t\t\t\t`${AuditableItemGraphContexts.Namespace}${AuditableItemGraphTypes.Vertex}`,\n\t\t\t\t\tvertex,\n\t\t\t\t\tschemaValidationFailures\n\t\t\t\t);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\tnameof(vertex),\n\t\t\t\t\tschemaValidationFailures\n\t\t\t\t);\n\n\t\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\t\"vertexNotFound\",\n\t\t\t\t\t\tvertex.id\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (Is.object(vertex.annotationObject)) {\n\t\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\t\tawait JsonLdHelper.validate(vertex.annotationObject, validationFailures);\n\t\t\t\t\tValidation.asValidationError(\n\t\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\tnameof(vertex.annotationObject),\n\t\t\t\t\t\tvalidationFailures\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst context: IAuditableItemGraphServiceContext = {\n\t\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\t\tcontextIds\n\t\t\t\t};\n\n\t\t\t\tdelete vertexEntity.aliasIndex;\n\t\t\t\tconst originalEntity = ObjectHelper.clone(vertexEntity);\n\t\t\t\tconst newEntity = ObjectHelper.clone(vertexEntity);\n\n\t\t\t\tnewEntity.annotationObject = vertex.annotationObject;\n\t\t\t\tawait this.updateAliasList(context, newEntity, vertex.aliases);\n\t\t\t\tawait this.updateResourceList(context, newEntity, vertex.resources);\n\t\t\t\tawait this.updateEdgeList(context, newEntity, vertex.edges);\n\n\t\t\t\tawait this.persistVertexChanges(context, vertexId, vertex.id, originalEntity, newEntity);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\"updatingFailed\",\n\t\t\t\t\tundefined,\n\t\t\t\t\terror\n\t\t\t\t);\n\t\t\t}\n\t\t} finally {\n\t\t\tMutex.unlock(vertexId);\n\t\t}\n\t}\n\n\t/**\n\t * Partially update a graph vertex (PATCH — explicit list patches; only defined properties applied).\n\t * Serialized with `update` via `Mutex` on the same vertex id within this instance.\n\t * @param partial The partial vertex update.\n\t * @returns Nothing.\n\t */\n\tpublic async updatePartial(partial: IAuditableItemGraphPartialVertex): Promise<void> {\n\t\tGuards.object<IAuditableItemGraphPartialVertex>(\n\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\tnameof(partial),\n\t\t\tpartial\n\t\t);\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(partial.id), partial.id);\n\n\t\tconst vertexId = this.parseVertexId(partial.id);\n\n\t\tawait Mutex.lock(vertexId, { throwOnTimeout: true });\n\n\t\ttry {\n\t\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\t\ttry {\n\t\t\t\tconst vertexEntity = await this._vertexStorage.get(vertexId);\n\n\t\t\t\tif (Is.empty(vertexEntity)) {\n\t\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\t\"vertexNotFound\",\n\t\t\t\t\t\tpartial.id\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (partial.annotationObject !== undefined && Is.object(partial.annotationObject)) {\n\t\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\t\tawait JsonLdHelper.validate(partial.annotationObject, validationFailures);\n\t\t\t\t\tValidation.asValidationError(\n\t\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\tnameof(partial.annotationObject),\n\t\t\t\t\t\tvalidationFailures\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst context: IAuditableItemGraphServiceContext = {\n\t\t\t\t\tnow: new Date(Date.now()).toISOString(),\n\t\t\t\t\tcontextIds\n\t\t\t\t};\n\n\t\t\t\tdelete vertexEntity.aliasIndex;\n\t\t\t\tconst originalEntity = ObjectHelper.clone(vertexEntity);\n\t\t\t\tconst newEntity = ObjectHelper.clone(vertexEntity);\n\n\t\t\t\tif (partial.annotationObject !== undefined) {\n\t\t\t\t\tnewEntity.annotationObject = partial.annotationObject;\n\t\t\t\t}\n\t\t\t\tif (partial.aliasPatches !== undefined) {\n\t\t\t\t\tconst aliasPatch = this.validateListPatch<IAuditableItemGraphAlias>(\n\t\t\t\t\t\tnameof(partial.aliasPatches),\n\t\t\t\t\t\tpartial.aliasPatches\n\t\t\t\t\t);\n\t\t\t\t\tawait this.applyAliasPatch(context, newEntity, aliasPatch);\n\t\t\t\t}\n\t\t\t\tif (partial.resourcePatches !== undefined) {\n\t\t\t\t\tconst resourcePatch = this.validateListPatch<IAuditableItemGraphResource>(\n\t\t\t\t\t\tnameof(partial.resourcePatches),\n\t\t\t\t\t\tpartial.resourcePatches\n\t\t\t\t\t);\n\t\t\t\t\tawait this.applyResourcePatch(context, newEntity, resourcePatch);\n\t\t\t\t}\n\t\t\t\tif (partial.edgePatches !== undefined) {\n\t\t\t\t\tconst edgePatch = this.validateListPatch<IAuditableItemGraphEdge>(\n\t\t\t\t\t\tnameof(partial.edgePatches),\n\t\t\t\t\t\tpartial.edgePatches\n\t\t\t\t\t);\n\t\t\t\t\tawait this.applyEdgePatch(context, newEntity, edgePatch);\n\t\t\t\t}\n\n\t\t\t\tawait this.persistVertexChanges(context, vertexId, partial.id, originalEntity, newEntity);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new GeneralError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\"updatingFailed\",\n\t\t\t\t\tundefined,\n\t\t\t\t\terror\n\t\t\t\t);\n\t\t\t}\n\t\t} finally {\n\t\t\tMutex.unlock(vertexId);\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 version The version number 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, version: number): Promise<IAuditableItemGraphVertex> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\t\tGuards.integer(AuditableItemGraphService.CLASS_NAME, nameof(version), version);\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 currentVersion = vertexEntity.version ?? 0;\n\t\t\tif (version > currentVersion || version < 0) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\t\t\t\"versionNotFound\",\n\t\t\t\t\tversion.toString()\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Short circuit if requesting the current version to avoid unnecessary changeset retrieval and patching\n\t\t\tif (version === currentVersion) {\n\t\t\t\tconst vertexModel = this.vertexEntityToJsonLd(vertexEntity);\n\t\t\t\tvertexModel.version = version;\n\t\t\t\treturn await JsonLdProcessor.compact(vertexModel, vertexModel[\"@context\"]);\n\t\t\t}\n\n\t\t\tconst changesets = await this.internalGetChangesets(vertexId, {\n\t\t\t\tmaxVersion: 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 = 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: { version: number; dateCreated: string }[] = [];\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({\n\t\t\t\t\t\tversion: changeset.version ?? 0,\n\t\t\t\t\t\tdateCreated: changeset.dateCreated\n\t\t\t\t\t});\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 proof for an item.\n\t * @param id The id of the vertex to remove the proof from.\n\t * @returns Nothing.\n\t * @throws NotFoundError if the vertex is not found.\n\t */\n\tpublic async removeProof(id: string): Promise<void> {\n\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(id), id);\n\n\t\tconst vertexId = this.parseVertexId(id);\n\n\t\tawait Mutex.lock(vertexId, { throwOnTimeout: true });\n\n\t\ttry {\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.removeNotarization(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\"removeProofFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t} finally {\n\t\t\tMutex.unlock(vertexId);\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 * Parse and validate a vertex URN; return the compact storage id.\n\t * @param id The vertex URN.\n\t * @returns The compact vertex id.\n\t * @internal\n\t */\n\tprivate parseVertexId(id: string): string {\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\treturn urnParsed.namespaceSpecific(0);\n\t}\n\n\t/**\n\t * Validate that a PATCH sub-list value is a list patch object, not a bare array.\n\t * @param propertyName The property name for error reporting.\n\t * @param patch The patch value.\n\t * @returns The validated list patch.\n\t * @internal\n\t */\n\tprivate validateListPatch<TItem>(\n\t\tpropertyName: string,\n\t\tpatch: unknown\n\t): IAuditableItemGraphListPatch<TItem> {\n\t\tif (Is.array(patch)) {\n\t\t\tthrow new GeneralError(AuditableItemGraphService.CLASS_NAME, \"listPatchInvalidFormat\", {\n\t\t\t\tproperty: propertyName\n\t\t\t});\n\t\t}\n\n\t\tGuards.object<IAuditableItemGraphListPatch<TItem>>(\n\t\t\tAuditableItemGraphService.CLASS_NAME,\n\t\t\tpropertyName,\n\t\t\tpatch\n\t\t);\n\n\t\treturn patch;\n\t}\n\n\t/**\n\t * Persist vertex changes after update or partial update.\n\t * @param context The context for the operation.\n\t * @param vertexId The compact vertex id.\n\t * @param vertexUrn The vertex URN for events.\n\t * @param originalEntity The entity before changes.\n\t * @param newEntity The entity after changes.\n\t * @internal\n\t */\n\tprivate async persistVertexChanges(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertexId: string,\n\t\tvertexUrn: string,\n\t\toriginalEntity: AuditableItemGraphVertex,\n\t\tnewEntity: AuditableItemGraphVertex\n\t): Promise<void> {\n\t\tconst nextVersion = Is.empty(originalEntity.version)\n\t\t\t? (await this.internalGetChangesets(vertexId)).length\n\t\t\t: originalEntity.version + 1;\n\t\tconst patches = await this.addChangeset(context, originalEntity, newEntity, false, nextVersion);\n\t\tif (patches.length > 0) {\n\t\t\tnewEntity.dateModified = context.now;\n\t\t\tnewEntity.version = nextVersion;\n\n\t\t\tconst indexes = this.buildIndexes(newEntity);\n\n\t\t\tawait this._vertexStorage.set({\n\t\t\t\t...newEntity,\n\t\t\t\t...indexes\n\t\t\t});\n\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tAuditableItemGraphMetricIds.VerticesUpdated,\n\t\t\t\t{\n\t\t\t\t\tpatchCount: patches.length\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tawait this._eventBusComponent?.publish<IAuditableItemGraphEventBusVertexUpdated>(\n\t\t\t\tAuditableItemGraphTopics.VertexUpdated,\n\t\t\t\t{ id: vertexUrn, patches }\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 * Replace the aliases of a vertex model (PUT).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param aliases The new active alias set.\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\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 * Apply alias patch operations (PATCH).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param patch The alias patch.\n\t * @internal\n\t */\n\tprivate async applyAliasPatch(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tpatch: IAuditableItemGraphListPatch<IAuditableItemGraphAlias>\n\t): Promise<void> {\n\t\tif (Is.arrayValue(patch.remove)) {\n\t\t\tfor (const removeId of patch.remove) {\n\t\t\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(removeId), removeId);\n\t\t\t\tconst alias = vertex.aliases?.find(a => a.id === removeId && Is.empty(a.dateDeleted));\n\t\t\t\tif (!Is.empty(alias)) {\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(patch.add)) {\n\t\t\tfor (const alias of patch.add) {\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 * Replace the resources of a vertex (PUT).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param resources The new active resource set.\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\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 * Apply resource patch operations (PATCH).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param patch The resource patch.\n\t * @internal\n\t */\n\tprivate async applyResourcePatch(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tpatch: IAuditableItemGraphListPatch<IAuditableItemGraphResource>\n\t): Promise<void> {\n\t\tif (Is.arrayValue(patch.remove)) {\n\t\t\tfor (const removeId of patch.remove) {\n\t\t\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(removeId), removeId);\n\t\t\t\tconst resource = vertex.resources?.find(\n\t\t\t\t\tr => this.getResourceId(r) === removeId && Is.empty(r.dateDeleted)\n\t\t\t\t);\n\t\t\t\tif (!Is.empty(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(patch.add)) {\n\t\t\tfor (const resource of patch.add) {\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 * Replace the edges of a vertex (PUT).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param edges The new active edge set.\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\t// `active` shares element refs with `vertex.edges` (the cloned newEntity); mutating `edge` below is intended.\n\t\tconst active = vertex.edges?.filter(e => Is.empty(e.dateDeleted)) ?? [];\n\n\t\tif (Is.arrayValue(active)) {\n\t\t\tfor (const edge of active) {\n\t\t\t\tif (\n\t\t\t\t\t!edges?.find(\n\t\t\t\t\t\te =>\n\t\t\t\t\t\t\tthis.edgeMatchesStoredEdge(e, edge.id) ||\n\t\t\t\t\t\t\tthis.edgeMatchesActiveEdgeByRelationship(e, edge)\n\t\t\t\t\t)\n\t\t\t\t) {\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 * Apply edge patch operations (PATCH).\n\t * @param context The context for the operation.\n\t * @param vertex The vertex.\n\t * @param patch The edge patch.\n\t * @internal\n\t */\n\tprivate async applyEdgePatch(\n\t\tcontext: IAuditableItemGraphServiceContext,\n\t\tvertex: AuditableItemGraphVertex,\n\t\tpatch: IAuditableItemGraphListPatch<IAuditableItemGraphEdge>\n\t): Promise<void> {\n\t\tif (Is.arrayValue(patch.remove)) {\n\t\t\tfor (const removeId of patch.remove) {\n\t\t\t\tGuards.stringValue(AuditableItemGraphService.CLASS_NAME, nameof(removeId), removeId);\n\t\t\t\tconst edge = vertex.edges?.find(\n\t\t\t\t\te => Is.empty(e.dateDeleted) && this.edgeRemoveIdMatches(e.id, removeId)\n\t\t\t\t);\n\t\t\t\tif (!Is.empty(edge)) {\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(patch.add)) {\n\t\t\tfor (const edge of patch.add) {\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\tconst existingActive = vertex.edges?.find(\n\t\t\t\te =>\n\t\t\t\t\tIs.empty(e.dateDeleted) &&\n\t\t\t\t\te.targetId === edge.targetId &&\n\t\t\t\t\tArrayHelper.matches(e.edgeRelationships, edge.edgeRelationships)\n\t\t\t);\n\t\t\tfindId = existingActive?.id ?? 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 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 * Whether an incoming edge matches a stored edge id.\n\t * @param incoming The incoming edge.\n\t * @param storedEdgeId The compact stored edge id.\n\t * @returns True if the incoming edge matches the stored edge id.\n\t * @internal\n\t */\n\tprivate edgeMatchesStoredEdge(incoming: IAuditableItemGraphEdge, storedEdgeId: string): boolean {\n\t\treturn Is.stringValue(incoming.id) && this.reduceEdgeId(incoming.id) === storedEdgeId;\n\t}\n\n\t/**\n\t * Whether a PATCH remove id matches a stored compact edge id (full URN or compact).\n\t * @param storedEdgeId The compact stored edge id.\n\t * @param removeId The id from the patch remove list.\n\t * @returns True if the remove id identifies the stored edge.\n\t * @internal\n\t */\n\tprivate edgeRemoveIdMatches(storedEdgeId: string, removeId: string): boolean {\n\t\tif (storedEdgeId === removeId) {\n\t\t\treturn true;\n\t\t}\n\n\t\ttry {\n\t\t\treturn this.reduceEdgeId(removeId) === storedEdgeId;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Whether an incoming id-less edge matches an active stored edge by target and relationships.\n\t * @param incoming The incoming edge.\n\t * @param stored The stored edge.\n\t * @returns True if they match.\n\t * @internal\n\t */\n\tprivate edgeMatchesActiveEdgeByRelationship(\n\t\tincoming: IAuditableItemGraphEdge,\n\t\tstored: AuditableItemGraphEdge\n\t): boolean {\n\t\treturn (\n\t\t\tIs.empty(incoming.id) &&\n\t\t\tIs.empty(stored.dateDeleted) &&\n\t\t\tincoming.targetId === stored.targetId &&\n\t\t\tArrayHelper.matches(incoming.edgeRelationships, stored.edgeRelationships)\n\t\t);\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"]}
|
package/docs/changelog.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.3-next.20](https://github.com/iotaledger/twin-auditable-item-graph/compare/auditable-item-graph-service-v0.0.3-next.19...auditable-item-graph-service-v0.0.3-next.20) (2026-06-03)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* mutex on remove proof operation ([d3697a0](https://github.com/iotaledger/twin-auditable-item-graph/commit/d3697a010997c2f9da1d13922a321be002ee27d3))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Dependencies
|
|
12
|
+
|
|
13
|
+
* The following workspace dependencies were updated
|
|
14
|
+
* dependencies
|
|
15
|
+
* @twin.org/auditable-item-graph-models bumped from 0.0.3-next.19 to 0.0.3-next.20
|
|
16
|
+
|
|
3
17
|
## [0.0.3-next.19](https://github.com/iotaledger/twin-auditable-item-graph/compare/auditable-item-graph-service-v0.0.3-next.18...auditable-item-graph-service-v0.0.3-next.19) (2026-06-02)
|
|
4
18
|
|
|
5
19
|
|
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.
|
|
3
|
+
"version": "0.0.3-next.20",
|
|
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.
|
|
18
|
+
"@twin.org/auditable-item-graph-models": "0.0.3-next.20",
|
|
19
19
|
"@twin.org/context": "next",
|
|
20
20
|
"@twin.org/core": "next",
|
|
21
21
|
"@twin.org/crypto": "next",
|