@twin.org/document-management-service 0.0.3-next.15 → 0.0.3-next.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"documentManagementService.js","sourceRoot":"","sources":["../../src/documentManagementService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IAttestationComponent } from \"@twin.org/attestation-models\";\nimport {\n\tAuditableItemGraphContexts,\n\tAuditableItemGraphTypes,\n\ttype IAuditableItemGraphVertexList,\n\ttype IAuditableItemGraphAlias,\n\ttype IAuditableItemGraphComponent,\n\ttype IAuditableItemGraphEdge,\n\ttype IAuditableItemGraphVertex\n} from \"@twin.org/auditable-item-graph-models\";\nimport type { IBlobStorageComponent } from \"@twin.org/blob-storage-models\";\nimport { BlobStorageContexts } from \"@twin.org/blob-storage-models\";\nimport { ContextIdKeys, ContextIdStore } from \"@twin.org/context\";\nimport {\n\tBaseError,\n\tCoerce,\n\tComponentFactory,\n\tConverter,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tNotFoundError,\n\tObjectHelper,\n\tUrn\n} from \"@twin.org/core\";\nimport { IntegrityAlgorithm, IntegrityHelper, Sha256 } from \"@twin.org/crypto\";\nimport { JsonLdProcessor, type IJsonLdNodeObject } from \"@twin.org/data-json-ld\";\nimport type { IDataProcessingComponent } from \"@twin.org/data-processing-models\";\nimport {\n\tDocumentContexts,\n\tDocumentManagementMetricIds,\n\tDocumentManagementMetrics,\n\tDocumentTypes,\n\ttype IDocument,\n\ttype IDocumentAttestation,\n\ttype IDocumentList,\n\ttype IDocumentManagementComponent\n} from \"@twin.org/document-management-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport {\n\tSchemaOrgContexts,\n\tSchemaOrgDataTypes,\n\tSchemaOrgTypes\n} from \"@twin.org/standards-schema-org\";\nimport { UneceDocumentCodeList } from \"@twin.org/standards-unece\";\nimport { MetricHelper, type ITelemetryComponent } from \"@twin.org/telemetry-models\";\nimport type { IDocumentManagementServiceConstructorOptions } from \"./models/IDocumentManagementStorageServiceConstructorOptions.js\";\n\n/**\n * Service for performing document management operations.\n */\nexport class DocumentManagementService implements IDocumentManagementComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<DocumentManagementService>();\n\n\t/**\n\t * The component for the auditable item graph.\n\t * @internal\n\t */\n\tprivate readonly _auditableItemGraphComponent: IAuditableItemGraphComponent;\n\n\t/**\n\t * The connector for the blob component.\n\t * @internal\n\t */\n\tprivate readonly _blobStorageComponent: IBlobStorageComponent;\n\n\t/**\n\t * The connector for the attestation.\n\t * @internal\n\t */\n\tprivate readonly _attestationComponent: IAttestationComponent;\n\n\t/**\n\t * The connector for the data processing.\n\t * @internal\n\t */\n\tprivate readonly _dataProcessingComponent: IDataProcessingComponent;\n\n\t/**\n\t * The optional telemetry component used for event metrics.\n\t * @internal\n\t */\n\tprivate readonly _telemetryComponent?: ITelemetryComponent;\n\n\t/**\n\t * Create a new instance of DocumentManagementService.\n\t * @param options The options for the service.\n\t */\n\tconstructor(options?: IDocumentManagementServiceConstructorOptions) {\n\t\tthis._auditableItemGraphComponent = ComponentFactory.get<IAuditableItemGraphComponent>(\n\t\t\toptions?.auditableItemGraphComponentType ?? \"auditable-item-graph\"\n\t\t);\n\t\tthis._blobStorageComponent = ComponentFactory.get<IBlobStorageComponent>(\n\t\t\toptions?.blobStorageComponentType ?? \"blob-storage\"\n\t\t);\n\t\tthis._attestationComponent = ComponentFactory.get<IAttestationComponent>(\n\t\t\toptions?.attestationComponentType ?? \"attestation\"\n\t\t);\n\t\tthis._dataProcessingComponent = ComponentFactory.get<IDataProcessingComponent>(\n\t\t\toptions?.dataProcessingComponentType ?? \"data-processing\"\n\t\t);\n\t\tthis._telemetryComponent = ComponentFactory.getIfExists<ITelemetryComponent>(\n\t\t\toptions?.telemetryComponentType\n\t\t);\n\n\t\tSchemaOrgDataTypes.registerRedirects();\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 DocumentManagementService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Register all document management 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\t\tawait MetricHelper.createMetrics(this._telemetryComponent, DocumentManagementMetrics);\n\t}\n\n\t/**\n\t * Store a document as an auditable item graph vertex and add its content to blob storage.\n\t * If the document id already exists and the blob data is different a new revision will be created.\n\t * For any other changes the current revision will be updated.\n\t * @param documentId The document id to create.\n\t * @param documentIdFormat The format of the document identifier.\n\t * @param documentCode The code for the document type.\n\t * @param blob The data to create the document with.\n\t * @param annotationObject Additional information to associate with the document.\n\t * @param auditableItemGraphEdges The auditable item graph vertices to connect the document to.\n\t * @param options Additional options for the set operation.\n\t * @param options.createAttestation Flag to create an attestation for the document, defaults to false.\n\t * @param options.addAlias Flag to add the document id as an alias to the aig vertex, defaults to true.\n\t * @param options.aliasAnnotationObject Annotation object for the alias.\n\t * @returns The auditable item graph vertex created for the document including its revision.\n\t */\n\tpublic async create(\n\t\tdocumentId: string,\n\t\tdocumentIdFormat: string | undefined,\n\t\tdocumentCode: UneceDocumentCodeList,\n\t\tblob: Uint8Array,\n\t\tannotationObject?: IJsonLdNodeObject,\n\t\tauditableItemGraphEdges?: {\n\t\t\ttargetId: string;\n\t\t\taddAlias?: boolean;\n\t\t\taliasAnnotationObject?: IJsonLdNodeObject;\n\t\t}[],\n\t\toptions?: {\n\t\t\tcreateAttestation?: boolean;\n\t\t\taddAlias?: boolean;\n\t\t\taliasAnnotationObject?: IJsonLdNodeObject;\n\t\t}\n\t): Promise<string> {\n\t\tGuards.stringValue(DocumentManagementService.CLASS_NAME, nameof(documentId), documentId);\n\t\tGuards.arrayOneOf(\n\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\tnameof(documentCode),\n\t\t\tdocumentCode,\n\t\t\tObject.values(UneceDocumentCodeList)\n\t\t);\n\t\tGuards.uint8Array(DocumentManagementService.CLASS_NAME, nameof(blob), blob);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\ttry {\n\t\t\t// Get the connected vertices first, if one fails we abort the create\n\t\t\tconst connectedVertices: { [id: string]: IAuditableItemGraphVertex } = {};\n\t\t\tif (Is.arrayValue(auditableItemGraphEdges)) {\n\t\t\t\tfor (const edge of auditableItemGraphEdges) {\n\t\t\t\t\tconnectedVertices[edge.targetId] = await this._auditableItemGraphComponent.get(\n\t\t\t\t\t\tedge.targetId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst documentVertex: Omit<IAuditableItemGraphVertex, \"id\"> = {\n\t\t\t\t\"@context\": [AuditableItemGraphContexts.Context, AuditableItemGraphContexts.ContextCommon],\n\t\t\t\ttype: AuditableItemGraphTypes.Vertex\n\t\t\t};\n\n\t\t\tif (options?.addAlias ?? true) {\n\t\t\t\tdocumentVertex.aliases ??= [];\n\t\t\t\tdocumentVertex.aliases.push({\n\t\t\t\t\t\"@context\": AuditableItemGraphContexts.Context,\n\t\t\t\t\ttype: AuditableItemGraphTypes.Alias,\n\t\t\t\t\tid: documentId,\n\t\t\t\t\taliasFormat: documentIdFormat,\n\t\t\t\t\tannotationObject: options?.aliasAnnotationObject\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Add the blob to blob storage\n\t\t\tconst blobStorageId = await this._blobStorageComponent.create(Converter.bytesToBase64(blob));\n\n\t\t\tconst currentRevision: IDocument & IJsonLdNodeObject = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tDocumentContexts.Context,\n\t\t\t\t\tDocumentContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: DocumentTypes.Document,\n\t\t\t\tid: this.createDocumentId(documentId, 0),\n\t\t\t\tdocumentId,\n\t\t\t\tdocumentIdFormat,\n\t\t\t\tdocumentCode,\n\t\t\t\tdocumentRevision: 0,\n\t\t\t\tannotationObject,\n\t\t\t\tintegrity: IntegrityHelper.generate(IntegrityAlgorithm.Sha256, blob),\n\t\t\t\tblobStorageId,\n\t\t\t\tdateCreated: new Date(Date.now()).toISOString(),\n\t\t\t\torganizationIdentity: contextIds?.[ContextIdKeys.Organization],\n\t\t\t\tuserIdentity: contextIds?.[ContextIdKeys.User]\n\t\t\t};\n\n\t\t\tif (options?.createAttestation ?? false) {\n\t\t\t\tcurrentRevision.attestationId = await this.createAttestation(currentRevision);\n\t\t\t}\n\n\t\t\t// Add the new revision in to the vertex\n\t\t\tdocumentVertex.resources ??= [];\n\t\t\tdocumentVertex.resources.push({\n\t\t\t\t\"@context\": AuditableItemGraphContexts.Context,\n\t\t\t\ttype: AuditableItemGraphTypes.Resource,\n\t\t\t\tresourceObject: currentRevision\n\t\t\t});\n\n\t\t\t// Add the edges from the document to the items\n\t\t\tthis.updateEdges(documentVertex, auditableItemGraphEdges);\n\n\t\t\t// And create the vertex\n\t\t\tconst vertexId = await this._auditableItemGraphComponent.create(\n\t\t\t\tObjectHelper.removeEmptyProperties(documentVertex)\n\t\t\t);\n\n\t\t\t// Now add the edges to the connected vertices\n\t\t\tawait this.updateConnectedEdges(\n\t\t\t\tconnectedVertices,\n\t\t\t\tvertexId,\n\t\t\t\t[],\n\t\t\t\tauditableItemGraphEdges,\n\t\t\t\tdocumentId,\n\t\t\t\tdocumentIdFormat\n\t\t\t);\n\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tDocumentManagementMetricIds.DocumentsCreated,\n\t\t\t\t{ hasAttestation: Is.stringValue(currentRevision.attestationId) }\n\t\t\t);\n\n\t\t\treturn vertexId;\n\t\t} catch (error) {\n\t\t\tif (BaseError.someErrorName(error, nameof<NotFoundError>())) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tDocumentManagementService.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 document as an auditable item graph vertex and add its content to blob storage.\n\t * If the blob data is different a new revision will be created.\n\t * For any other changes the current revision will be updated.\n\t * @param auditableItemGraphDocumentId The auditable item graph vertex id which contains the document.\n\t * @param blob The data to update the document with.\n\t * @param annotationObject Additional information to associate with the document.\n\t * @param auditableItemGraphEdges The auditable item graph vertices to connect the document to, if undefined retains current connections.\n\t * @returns Nothing.\n\t */\n\tpublic async update(\n\t\tauditableItemGraphDocumentId: string,\n\t\tblob?: Uint8Array,\n\t\tannotationObject?: IJsonLdNodeObject,\n\t\tauditableItemGraphEdges?: {\n\t\t\ttargetId: string;\n\t\t\taddAlias?: boolean;\n\t\t\taliasAnnotationObject?: IJsonLdNodeObject;\n\t\t}[]\n\t): Promise<void> {\n\t\tUrn.guard(\n\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\tnameof(auditableItemGraphDocumentId),\n\t\t\tauditableItemGraphDocumentId\n\t\t);\n\n\t\ttry {\n\t\t\tconst documentVertex = await this._auditableItemGraphComponent.get(\n\t\t\t\tauditableItemGraphDocumentId,\n\t\t\t\t{ includeDeleted: true }\n\t\t\t);\n\n\t\t\tif (Is.empty(documentVertex.resources)) {\n\t\t\t\tthrow new NotFoundError(DocumentManagementService.CLASS_NAME, \"documentRevisionNone\");\n\t\t\t}\n\n\t\t\tconst documents = await this.getDocumentsFromVertex(documentVertex);\n\t\t\tconst latestRevision: IDocument | undefined = documents.entries.itemListElement[0];\n\n\t\t\tdocumentVertex.resources = documentVertex.resources.filter(r => Is.empty(r.dateDeleted));\n\n\t\t\tif (Is.empty(latestRevision)) {\n\t\t\t\tthrow new NotFoundError(DocumentManagementService.CLASS_NAME, \"documentRevisionNone\");\n\t\t\t}\n\n\t\t\t// If auditableItemGraphEdges is undefined we are not updating the edges\n\t\t\t// an empty array can be passed to remove all edges\n\t\t\tconst connectedVertices: { [targetId: string]: IAuditableItemGraphVertex } = {};\n\t\t\tif (Is.array(auditableItemGraphEdges)) {\n\t\t\t\t// Get the updated connected vertices first, if one fails we abort the update\n\t\t\t\tfor (const edge of auditableItemGraphEdges) {\n\t\t\t\t\tconnectedVertices[edge.targetId] = await this._auditableItemGraphComponent.get(\n\t\t\t\t\t\tedge.targetId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// Also get the current edges in case some need disconnecting\n\t\t\t\tif (Is.arrayValue(documents.entries.edges)) {\n\t\t\t\t\tfor (const edgeId of documents.entries.edges) {\n\t\t\t\t\t\t// If we haven't retrieved the edge then it must be one that needs removing\n\t\t\t\t\t\tif (Is.empty(connectedVertices[edgeId])) {\n\t\t\t\t\t\t\tconnectedVertices[edgeId] = await this._auditableItemGraphComponent.get(edgeId);\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\tlet updatedVertex = false;\n\t\t\tlet blobRevisionCreated = false;\n\t\t\tlet newRevisionHasAttestation = false;\n\n\t\t\t// If the blob is set and its hash has changed then we create a new revision\n\t\t\tif (Is.uint8Array(blob)) {\n\t\t\t\tconst newIntegrity = IntegrityHelper.generate(IntegrityAlgorithm.Sha256, blob);\n\n\t\t\t\tif (latestRevision.integrity !== newIntegrity) {\n\t\t\t\t\t// Add the blob to blob storage\n\t\t\t\t\tconst blobStorageId = await this._blobStorageComponent.create(\n\t\t\t\t\t\tConverter.bytesToBase64(blob)\n\t\t\t\t\t);\n\n\t\t\t\t\tconst newRevision = ObjectHelper.clone(latestRevision);\n\n\t\t\t\t\tnewRevision.documentRevision++;\n\t\t\t\t\tnewRevision.id = this.createDocumentId(\n\t\t\t\t\t\tnewRevision.documentId,\n\t\t\t\t\t\tnewRevision.documentRevision\n\t\t\t\t\t);\n\t\t\t\t\tnewRevision.integrity = newIntegrity;\n\t\t\t\t\tnewRevision.blobStorageId = blobStorageId;\n\t\t\t\t\tnewRevision.annotationObject = annotationObject;\n\n\t\t\t\t\tif (Is.stringValue(latestRevision.attestationId)) {\n\t\t\t\t\t\tnewRevision.attestationId = await this.createAttestation(newRevision);\n\t\t\t\t\t}\n\n\t\t\t\t\tdocumentVertex.resources.push({\n\t\t\t\t\t\t\"@context\": AuditableItemGraphContexts.Context,\n\t\t\t\t\t\ttype: AuditableItemGraphTypes.Resource,\n\t\t\t\t\t\tresourceObject: newRevision as unknown as IJsonLdNodeObject\n\t\t\t\t\t});\n\n\t\t\t\t\tnewRevisionHasAttestation = Is.stringValue(newRevision.attestationId);\n\t\t\t\t\tblobRevisionCreated = true;\n\t\t\t\t\tupdatedVertex = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If the blob wasn't updated but the annotation object has then update the current revision\n\t\t\t// instead of creating a new one\n\t\t\tif (\n\t\t\t\t!updatedVertex &&\n\t\t\t\t!ObjectHelper.equal(latestRevision.annotationObject, annotationObject)\n\t\t\t) {\n\t\t\t\tupdatedVertex = true;\n\t\t\t\tlatestRevision.annotationObject = annotationObject;\n\t\t\t\tlatestRevision.dateModified = new Date(Date.now()).toISOString();\n\t\t\t}\n\n\t\t\tconst existingEdgeIds = documentVertex.edges?.map(e => e.targetId) ?? [];\n\n\t\t\t// Update the edges from the document to the items\n\t\t\tconst edgesUpdated = this.updateEdges(documentVertex, auditableItemGraphEdges);\n\t\t\tif (edgesUpdated) {\n\t\t\t\tupdatedVertex = true;\n\t\t\t}\n\n\t\t\tif (updatedVertex) {\n\t\t\t\tawait this._auditableItemGraphComponent.update(\n\t\t\t\t\tObjectHelper.removeEmptyProperties(documentVertex)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (edgesUpdated) {\n\t\t\t\tawait this.updateConnectedEdges(\n\t\t\t\t\tconnectedVertices,\n\t\t\t\t\tauditableItemGraphDocumentId,\n\t\t\t\t\texistingEdgeIds,\n\t\t\t\t\tauditableItemGraphEdges,\n\t\t\t\t\tlatestRevision.documentId,\n\t\t\t\t\tlatestRevision.documentIdFormat\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (blobRevisionCreated) {\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tDocumentManagementMetricIds.RevisionsCreated,\n\t\t\t\t\t{ hasAttestation: newRevisionHasAttestation }\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (updatedVertex) {\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tDocumentManagementMetricIds.DocumentsUpdated,\n\t\t\t\t\t{ hasNewRevision: blobRevisionCreated }\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (BaseError.someErrorName(error, nameof<NotFoundError>())) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\t\t\"updateFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get a document using it's auditable item graph vertex id and optional revision.\n\t * @param auditableItemGraphDocumentId The auditable item graph vertex id which contains the document.\n\t * @param options Additional options for the get operation.\n\t * @param options.includeBlobStorageMetadata Flag to include the blob storage metadata for the document, defaults to false.\n\t * @param options.includeBlobStorageData Flag to include the blob storage data for the document, defaults to false.\n\t * @param options.includeAttestation Flag to include the attestation information for the document, defaults to false.\n\t * @param options.includeRemoved Flag to include deleted documents, defaults to false.\n\t * @param options.extractRuleGroupId If provided will extract data from the document using the specified rule group id.\n\t * @param options.extractMimeType By default extraction will auto detect the mime type of the document, this can be used to override the detection.\n\t * @param cursor The cursor to get the next chunk of revisions.\n\t * @param limit Limit the number of items to return, defaults to 1 so only most recent is returned.\n\t * @returns The documents and revisions if requested, ordered by revision descending, cursor is set if there are more document revisions.\n\t */\n\tpublic async get(\n\t\tauditableItemGraphDocumentId: string,\n\t\toptions?: {\n\t\t\tincludeBlobStorageMetadata?: boolean;\n\t\t\tincludeBlobStorageData?: boolean;\n\t\t\tincludeAttestation?: boolean;\n\t\t\tincludeRemoved?: boolean;\n\t\t\textractRuleGroupId?: string;\n\t\t\textractMimeType?: string;\n\t\t},\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tentries: IDocumentList;\n\t\tcursor?: string;\n\t}> {\n\t\tUrn.guard(\n\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\tnameof(auditableItemGraphDocumentId),\n\t\t\tauditableItemGraphDocumentId\n\t\t);\n\n\t\ttry {\n\t\t\tconst documentVertex = await this._auditableItemGraphComponent.get(\n\t\t\t\tauditableItemGraphDocumentId,\n\t\t\t\t{ includeDeleted: options?.includeRemoved }\n\t\t\t);\n\n\t\t\t// Populate the document and revisions with the options set\n\t\t\tconst documents = await this.getDocumentsFromVertex(documentVertex, options, cursor, limit);\n\n\t\t\tconst result = await JsonLdProcessor.compact(\n\t\t\t\tdocuments.entries,\n\t\t\t\tdocuments.entries[\"@context\"]\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tentries: result,\n\t\t\t\tcursor: documents.cursor\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (BaseError.someErrorName(error, nameof<NotFoundError>())) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new GeneralError(DocumentManagementService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get a document revision using it's auditable item graph vertex id.\n\t * @param auditableItemGraphDocumentId The auditable item graph vertex id which contains the document.\n\t * @param revision The revision id for the document.\n\t * @param options Additional options for the get operation.\n\t * @param options.includeBlobStorageMetadata Flag to include the blob storage metadata for the document, defaults to false.\n\t * @param options.includeBlobStorageData Flag to include the blob storage data for the document, defaults to false.\n\t * @param options.includeAttestation Flag to include the attestation information for the document, defaults to false.\n\t * @param options.extractRuleGroupId If provided will extract data from the document using the specified rule group id.\n\t * @param options.extractMimeType By default extraction will auto detect the mime type of the document, this can be used to override the detection.\n\t * @returns The documents and revisions if requested, ordered by revision descending, cursor is set if there are more document revisions.\n\t */\n\tpublic async getRevision(\n\t\tauditableItemGraphDocumentId: string,\n\t\trevision: number,\n\t\toptions?: {\n\t\t\tincludeBlobStorageMetadata?: boolean;\n\t\t\tincludeBlobStorageData?: boolean;\n\t\t\tincludeAttestation?: boolean;\n\t\t\textractRuleGroupId?: string;\n\t\t\textractMimeType?: string;\n\t\t}\n\t): Promise<IDocument> {\n\t\tUrn.guard(\n\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\tnameof(auditableItemGraphDocumentId),\n\t\t\tauditableItemGraphDocumentId\n\t\t);\n\t\tGuards.integer(DocumentManagementService.CLASS_NAME, nameof(revision), revision);\n\n\t\ttry {\n\t\t\tconst documentVertex = await this._auditableItemGraphComponent.get(\n\t\t\t\tauditableItemGraphDocumentId,\n\t\t\t\t{ includeDeleted: true }\n\t\t\t);\n\n\t\t\tif (Is.empty(documentVertex.resources)) {\n\t\t\t\tthrow new NotFoundError(DocumentManagementService.CLASS_NAME, \"documentRevisionNone\");\n\t\t\t}\n\n\t\t\tdocumentVertex.resources = documentVertex.resources.filter(\n\t\t\t\td => d.resourceObject?.documentRevision === revision\n\t\t\t);\n\n\t\t\tif (documentVertex.resources.length === 0) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\t\t\t\"documentRevisionNotFound\",\n\t\t\t\t\trevision.toString()\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Populate the document and revisions with the options set\n\t\t\tconst docList = await this.getDocumentsFromVertex(documentVertex, options);\n\n\t\t\tconst result = await JsonLdProcessor.compact(\n\t\t\t\tdocList.entries.itemListElement[0],\n\t\t\t\tdocList.entries.itemListElement[0][\"@context\"]\n\t\t\t);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tif (BaseError.someErrorName(error, nameof<NotFoundError>())) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\t\t\"getRevisionFailed\",\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 an auditable item graph vertex using it's id.\n\t * The document dateDeleted will be set, but can still be queried with the includeRemoved flag.\n\t * @param auditableItemGraphDocumentId The auditable item graph vertex id which contains the document.\n\t * @param revision The revision of the document to remove.\n\t * @returns Nothing.\n\t */\n\tpublic async removeRevision(\n\t\tauditableItemGraphDocumentId: string,\n\t\trevision: number\n\t): Promise<void> {\n\t\tUrn.guard(\n\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\tnameof(auditableItemGraphDocumentId),\n\t\t\tauditableItemGraphDocumentId\n\t\t);\n\t\tGuards.number(DocumentManagementService.CLASS_NAME, nameof(revision), revision);\n\n\t\ttry {\n\t\t\tconst documentVertex = await this._auditableItemGraphComponent.get(\n\t\t\t\tauditableItemGraphDocumentId\n\t\t\t);\n\n\t\t\tif (Is.empty(documentVertex.resources)) {\n\t\t\t\tthrow new NotFoundError(DocumentManagementService.CLASS_NAME, \"documentRevisionNone\");\n\t\t\t}\n\n\t\t\tconst docRevisionIndex = documentVertex.resources.findIndex(\n\t\t\t\td => d.resourceObject?.documentRevision === revision\n\t\t\t);\n\n\t\t\tif (docRevisionIndex === -1) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\t\t\t\"documentRevisionNotFound\",\n\t\t\t\t\trevision.toString()\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tdocumentVertex.resources.splice(docRevisionIndex, 1);\n\n\t\t\tawait this._auditableItemGraphComponent.update(documentVertex);\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tDocumentManagementMetricIds.RevisionsRemoved\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (BaseError.someErrorName(error, nameof<NotFoundError>())) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\t\t\"removeRevisionFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Find all the document with a specific id.\n\t * @param documentId The document id to find in the graph.\n\t * @param cursor The cursor to get the next chunk of documents.\n\t * @param limit The limit to get the next chunk of documents.\n\t * @returns The graph vertices that contain documents referencing the specified document id.\n\t */\n\tpublic async query(\n\t\tdocumentId: string,\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tentries: IAuditableItemGraphVertexList;\n\t\tcursor?: string;\n\t}> {\n\t\tGuards.stringValue(DocumentManagementService.CLASS_NAME, nameof(documentId), documentId);\n\n\t\ttry {\n\t\t\tconst result = await this._auditableItemGraphComponent.query(\n\t\t\t\t{\n\t\t\t\t\tid: documentId,\n\t\t\t\t\tidMode: \"both\",\n\t\t\t\t\tresourceTypes: [DocumentTypes.Document]\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\t[\"id\", \"dateCreated\", \"dateModified\", \"aliases\", \"annotationObject\", \"resources\", \"edges\"],\n\t\t\t\tcursor,\n\t\t\t\tlimit\n\t\t\t);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tif (BaseError.someErrorName(error, nameof<NotFoundError>())) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new GeneralError(DocumentManagementService.CLASS_NAME, \"queryFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Update the edges of the document vertex.\n\t * @param documentVertex The document vertex to update.\n\t * @param auditableItemGraphEdges The list of edges to use.\n\t * @returns True if the edges were updated.\n\t * @internal\n\t */\n\tprivate updateEdges(\n\t\tdocumentVertex: Omit<IAuditableItemGraphVertex, \"@context\" | \"id\" | \"type\">,\n\t\tauditableItemGraphEdges:\n\t\t\t| { targetId: string; addAlias?: boolean; aliasAnnotationObject?: IJsonLdNodeObject }[]\n\t\t\t| undefined\n\t): boolean {\n\t\tlet changed = false;\n\n\t\tconst existingEdgeIds = documentVertex.edges?.map(e => e.targetId) ?? [];\n\n\t\tif (Is.array(auditableItemGraphEdges)) {\n\t\t\tfor (const aigEdge of auditableItemGraphEdges) {\n\t\t\t\tconst existingIndex = existingEdgeIds.indexOf(aigEdge.targetId);\n\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t// If the edge already exists then we don't need to add it again\n\t\t\t\t\t// We just need to remove it from the list of existing ids\n\t\t\t\t\t// any remaining after this loop will be need to be removed\n\t\t\t\t\texistingEdgeIds.splice(existingIndex, 1);\n\t\t\t\t} else {\n\t\t\t\t\tconst vertexEdge: IAuditableItemGraphEdge = {\n\t\t\t\t\t\t\"@context\": AuditableItemGraphContexts.Context,\n\t\t\t\t\t\ttype: AuditableItemGraphTypes.Edge,\n\t\t\t\t\t\ttargetId: aigEdge.targetId,\n\t\t\t\t\t\tedgeRelationships: [\"document\"]\n\t\t\t\t\t};\n\n\t\t\t\t\tdocumentVertex.edges ??= [];\n\t\t\t\t\tdocumentVertex.edges?.push(vertexEdge);\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Anything left in the existingEdgeIds array means they need to be removed\n\t\t\tif (existingEdgeIds.length > 0 && Is.array(documentVertex.edges)) {\n\t\t\t\tfor (const existingEdgeId of existingEdgeIds) {\n\t\t\t\t\tconst existingIndex = documentVertex.edges.findIndex(e => e.targetId === existingEdgeId);\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tdocumentVertex.edges.splice(existingIndex, 1);\n\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn changed;\n\t}\n\n\t/**\n\t * Update the edges.\n\t * @param connectedVertices The connected vertices for the edges.\n\t * @param auditableItemGraphDocumentId The document id to use.\n\t * @param documentVertex The document vertex to update.\n\t * @param auditableItemGraphEdges The list of edges to use.\n\t * @param documentId The document identifier.\n\t * @param documentIdFormat The format of the document identifier.\n\t * @internal\n\t */\n\tprivate async updateConnectedEdges(\n\t\tconnectedVertices: { [id: string]: IAuditableItemGraphVertex },\n\t\tauditableItemGraphDocumentId: string,\n\t\texistingEdgeIds: string[],\n\t\tauditableItemGraphEdges:\n\t\t\t| { targetId: string; addAlias?: boolean; aliasAnnotationObject?: IJsonLdNodeObject }[]\n\t\t\t| undefined,\n\t\tdocumentId: string,\n\t\tdocumentIdFormat: string | undefined\n\t): Promise<void> {\n\t\tif (Is.array(auditableItemGraphEdges)) {\n\t\t\tfor (const aigEdge of auditableItemGraphEdges) {\n\t\t\t\tconst connected = connectedVertices[aigEdge.targetId];\n\n\t\t\t\tif (!Is.empty(connected)) {\n\t\t\t\t\tlet updatedConnected = false;\n\n\t\t\t\t\tconst existingIndex = existingEdgeIds.indexOf(aigEdge.targetId);\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\t// If the edge already exists we remove it from the list of existing ids\n\t\t\t\t\t\t// any remaining after this loop will be need to be disconnected\n\t\t\t\t\t\texistingEdgeIds.splice(existingIndex, 1);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Add the edge with the document vertex id if it doesn't already exist\n\t\t\t\t\tconst hasEdge = connected.edges?.some(e => e.targetId === auditableItemGraphDocumentId);\n\t\t\t\t\tif (!hasEdge) {\n\t\t\t\t\t\tconst vertexEdge: IAuditableItemGraphEdge = {\n\t\t\t\t\t\t\t\"@context\": AuditableItemGraphContexts.Context,\n\t\t\t\t\t\t\ttype: AuditableItemGraphTypes.Edge,\n\t\t\t\t\t\t\ttargetId: auditableItemGraphDocumentId,\n\t\t\t\t\t\t\tedgeRelationships: [\"document\"]\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconnected.edges ??= [];\n\t\t\t\t\t\tconnected.edges?.push(vertexEdge);\n\t\t\t\t\t\tupdatedConnected = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Add alias with the document id if option flag is set and it doesn't already exist\n\t\t\t\t\tif (aigEdge.addAlias) {\n\t\t\t\t\t\tconst alias = connected.aliases?.find(a => a.id === documentId);\n\t\t\t\t\t\tif (Is.empty(alias)) {\n\t\t\t\t\t\t\t// No existing alias, so create one\n\t\t\t\t\t\t\tconst vertexAlias: IAuditableItemGraphAlias = {\n\t\t\t\t\t\t\t\t\"@context\": AuditableItemGraphContexts.Context,\n\t\t\t\t\t\t\t\ttype: AuditableItemGraphTypes.Alias,\n\t\t\t\t\t\t\t\tid: documentId,\n\t\t\t\t\t\t\t\taliasFormat: documentIdFormat,\n\t\t\t\t\t\t\t\tannotationObject: aigEdge.aliasAnnotationObject\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tconnected.aliases ??= [];\n\t\t\t\t\t\t\tconnected.aliases?.push(vertexAlias);\n\t\t\t\t\t\t\tupdatedConnected = true;\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t!ObjectHelper.equal(alias.annotationObject, aigEdge.aliasAnnotationObject) ||\n\t\t\t\t\t\t\tdocumentIdFormat !== alias.aliasFormat\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// The alias already exists, but the format or annotation object has changed\n\t\t\t\t\t\t\talias.annotationObject = aigEdge.aliasAnnotationObject;\n\t\t\t\t\t\t\talias.aliasFormat = documentIdFormat;\n\t\t\t\t\t\t\tupdatedConnected = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (updatedConnected) {\n\t\t\t\t\t\tawait this._auditableItemGraphComponent.update(connected);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Anything left in the existingEdgeIds array means they need to be removed\n\t\tif (existingEdgeIds.length > 0) {\n\t\t\tfor (const existingEdgeId of existingEdgeIds) {\n\t\t\t\tconst connected = connectedVertices[existingEdgeId];\n\n\t\t\t\tif (!Is.empty(connected)) {\n\t\t\t\t\tlet updatedConnected = false;\n\n\t\t\t\t\t// Remove the edge from the connected vertex\n\t\t\t\t\tif (Is.arrayValue(connected.edges)) {\n\t\t\t\t\t\tconst existingIndex = connected.edges.findIndex(\n\t\t\t\t\t\t\te => e.targetId === auditableItemGraphDocumentId\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\t\tconnected.edges.splice(existingIndex, 1);\n\t\t\t\t\t\t\tupdatedConnected = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove the alias from the connected vertex\n\t\t\t\t\tif (Is.arrayValue(connected.aliases)) {\n\t\t\t\t\t\tconst existingIndex = connected.aliases.findIndex(e => e.id === documentId);\n\t\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\t\tconnected.aliases.splice(existingIndex, 1);\n\t\t\t\t\t\t\tupdatedConnected = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (updatedConnected) {\n\t\t\t\t\t\tawait this._auditableItemGraphComponent.update(connected);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get the documents from the auditable item graph vertex.\n\t * @param documentVertex The vertex containing the documents.\n\t * @param options Additional options for the get operation.\n\t * @param options.includeBlobStorageMetadata Flag to include the blob storage metadata for the document, defaults to false.\n\t * @param options.includeBlobStorageData Flag to include the blob storage data for the document, defaults to false.\n\t * @param options.includeAttestation Flag to include the attestation information for the document, defaults to false.\n\t * @param options.extractRuleGroupId If provided will extract data from the document using the specified rule group id.\n\t * @param options.extractMimeType By default extraction will auto detect the mime type of the document, this can be used to override the detection.\n\t * @param cursor The cursor to get the next chunk of revisions.\n\t * @param limit Limit the number of items to return, defaults to 1 so only most recent is returned.\n\t * @returns The finalised list of documents.\n\t * @internal\n\t */\n\tprivate async getDocumentsFromVertex(\n\t\tdocumentVertex: IAuditableItemGraphVertex,\n\t\toptions?: {\n\t\t\tincludeBlobStorageMetadata?: boolean;\n\t\t\tincludeBlobStorageData?: boolean;\n\t\t\tincludeAttestation?: boolean;\n\t\t\textractRuleGroupId?: string;\n\t\t\textractMimeType?: string;\n\t\t},\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tentries: IDocumentList;\n\t\tcursor?: string;\n\t}> {\n\t\tconst docList: IDocumentList = {\n\t\t\t\"@context\": [\n\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\tDocumentContexts.Context,\n\t\t\t\tDocumentContexts.ContextCommon\n\t\t\t],\n\t\t\ttype: SchemaOrgTypes.ItemList,\n\t\t\t[SchemaOrgTypes.ItemListElement]: []\n\t\t};\n\n\t\tlet nextCursor: string | undefined;\n\n\t\tif (Is.arrayValue(documentVertex.resources)) {\n\t\t\t// Sort by newest revision first\n\t\t\tdocumentVertex.resources.sort(\n\t\t\t\t(a, b) =>\n\t\t\t\t\t(Coerce.number(b.resourceObject?.documentRevision) ?? 0) -\n\t\t\t\t\t(Coerce.number(a.resourceObject?.documentRevision) ?? 0)\n\t\t\t);\n\n\t\t\tconst startIndex = Coerce.integer(cursor) ?? 0;\n\t\t\tconst endIndex = Math.min(startIndex + (limit ?? 1), documentVertex.resources.length);\n\t\t\tconst slicedResources = documentVertex.resources.slice(startIndex, endIndex);\n\t\t\tnextCursor = documentVertex.resources.length > endIndex ? endIndex.toString() : undefined;\n\n\t\t\tconst includeBlobStorageMetadata = options?.includeBlobStorageMetadata ?? false;\n\t\t\tconst includeBlobStorageData = options?.includeBlobStorageData ?? false;\n\t\t\tconst includeAttestation = options?.includeAttestation ?? false;\n\t\t\tconst extractData = Is.stringValue(options?.extractRuleGroupId);\n\n\t\t\tfor (let i = 0; i < slicedResources.length; i++) {\n\t\t\t\tconst document = slicedResources[i].resourceObject as unknown as IDocument;\n\t\t\t\tif (Is.object(document)) {\n\t\t\t\t\tdocument.dateDeleted = slicedResources[i].dateDeleted;\n\n\t\t\t\t\tdocList[SchemaOrgTypes.ItemListElement].push(document);\n\n\t\t\t\t\tconst blobRequired = includeBlobStorageMetadata || includeBlobStorageData;\n\t\t\t\t\tif (blobRequired || extractData) {\n\t\t\t\t\t\tconst blobEntry = await this._blobStorageComponent.get(document.blobStorageId, {\n\t\t\t\t\t\t\tincludeContent: includeBlobStorageData || extractData\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (blobRequired) {\n\t\t\t\t\t\t\tdocument.blobStorageEntry = blobEntry;\n\t\t\t\t\t\t\tif (Is.object(document.blobStorageEntry)) {\n\t\t\t\t\t\t\t\tObjectHelper.propertyDelete(document.blobStorageEntry, \"@context\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!docList[\"@context\"].includes(BlobStorageContexts.Context)) {\n\t\t\t\t\t\t\t\tdocList[\"@context\"].push(BlobStorageContexts.Context);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (Is.stringValue(options?.extractRuleGroupId) && Is.stringValue(blobEntry.blob)) {\n\t\t\t\t\t\t\tconst binaryBlob = Converter.base64ToBytes(blobEntry.blob);\n\t\t\t\t\t\t\tdocument.extractedData = await this._dataProcessingComponent.extract(\n\t\t\t\t\t\t\t\toptions.extractRuleGroupId,\n\t\t\t\t\t\t\t\tbinaryBlob,\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\toptions?.extractMimeType\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If we have the blob data due to extraction but we weren't asked for it\n\t\t\t\t\t\t// then we remove it from the document\n\t\t\t\t\t\tif (!blobRequired) {\n\t\t\t\t\t\t\tdelete document.blobStorageEntry;\n\t\t\t\t\t\t} else if (!includeBlobStorageData) {\n\t\t\t\t\t\t\tdelete document.blobStorageEntry?.blob;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (includeAttestation && Is.stringValue(document.attestationId)) {\n\t\t\t\t\t\tconst attestationInformation = await this._attestationComponent.get(\n\t\t\t\t\t\t\tdocument.attestationId\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdocument.attestationInformation = attestationInformation;\n\t\t\t\t\t\tif (Is.object(document.attestationInformation)) {\n\t\t\t\t\t\t\tObjectHelper.propertyDelete(document.attestationInformation, \"@context\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(documentVertex.edges)) {\n\t\t\tdocList.edges ??= [];\n\n\t\t\tfor (const edge of documentVertex.edges) {\n\t\t\t\tif (Is.object(edge)) {\n\t\t\t\t\tdocList.edges.push(edge.targetId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tentries: docList,\n\t\t\tcursor: nextCursor\n\t\t};\n\t}\n\n\t/**\n\t * Create an attestation for the document.\n\t * @param document The document to create the attestation for.\n\t * @returns The attestation identifier.\n\t */\n\tprivate async createAttestation(document: IDocument): Promise<string> {\n\t\tconst documentAttestation: IDocumentAttestation & IJsonLdNodeObject = {\n\t\t\t\"@context\": [\n\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\tDocumentContexts.Context,\n\t\t\t\tDocumentContexts.ContextCommon\n\t\t\t],\n\t\t\ttype: DocumentTypes.DocumentAttestation,\n\t\t\tid: document.id,\n\t\t\tdocumentId: document.documentId,\n\t\t\tdocumentCode: document.documentCode,\n\t\t\tdocumentRevision: document.documentRevision,\n\t\t\tdateCreated: document.dateCreated,\n\t\t\tintegrity: document.integrity\n\t\t};\n\t\tconst attestationId = await this._attestationComponent.create(documentAttestation);\n\t\tawait MetricHelper.metricIncrement(\n\t\t\tthis._telemetryComponent,\n\t\t\tDocumentManagementMetricIds.AttestationsCreated\n\t\t);\n\t\treturn attestationId;\n\t}\n\n\t/**\n\t * Create a document id from the document id and revision.\n\t * @param documentId The document id to create.\n\t * @param revision The revision of the document.\n\t * @returns The document id.\n\t * @internal\n\t */\n\tprivate createDocumentId(documentId: string, revision: number): string {\n\t\tconst documentIdHash = Converter.bytesToBase64Url(\n\t\t\tSha256.sum256(Converter.utf8ToBytes(documentId))\n\t\t);\n\t\treturn `document:${documentIdHash}:${revision}`;\n\t}\n}\n"]}
1
+ {"version":3,"file":"documentManagementService.js","sourceRoot":"","sources":["../../src/documentManagementService.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,0BAA0B,EAC1B,uBAAuB,EAOvB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EACN,SAAS,EACT,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,MAAM,EACN,EAAE,EACF,KAAK,EACL,aAAa,EACb,YAAY,EACZ,GAAG,EACH,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,eAAe,EAA0B,MAAM,wBAAwB,CAAC;AAE/F,OAAO,EACN,gBAAgB,EAChB,2BAA2B,EAC3B,yBAAyB,EACzB,aAAa,EAMb,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EACN,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAA4B,MAAM,4BAA4B,CAAC;AAGpF;;GAEG;AACH,MAAM,OAAO,yBAAyB;IACrC;;OAEG;IACI,MAAM,CAAU,UAAU,+BAA+C;IAEhF;;;OAGG;IACc,4BAA4B,CAA+B;IAE5E;;;OAGG;IACc,qBAAqB,CAAwB;IAE9D;;;OAGG;IACc,qBAAqB,CAAwB;IAE9D;;;OAGG;IACc,wBAAwB,CAA2B;IAEpE;;;OAGG;IACc,mBAAmB,CAAuB;IAE3D;;;OAGG;IACH,YAAY,OAAsD;QACjE,IAAI,CAAC,4BAA4B,GAAG,gBAAgB,CAAC,GAAG,CACvD,OAAO,EAAE,+BAA+B,IAAI,sBAAsB,CAClE,CAAC;QACF,IAAI,CAAC,qBAAqB,GAAG,gBAAgB,CAAC,GAAG,CAChD,OAAO,EAAE,wBAAwB,IAAI,cAAc,CACnD,CAAC;QACF,IAAI,CAAC,qBAAqB,GAAG,gBAAgB,CAAC,GAAG,CAChD,OAAO,EAAE,wBAAwB,IAAI,aAAa,CAClD,CAAC;QACF,IAAI,CAAC,wBAAwB,GAAG,gBAAgB,CAAC,GAAG,CACnD,OAAO,EAAE,2BAA2B,IAAI,iBAAiB,CACzD,CAAC;QACF,IAAI,CAAC,mBAAmB,GAAG,gBAAgB,CAAC,WAAW,CACtD,OAAO,EAAE,sBAAsB,CAC/B,CAAC;QAEF,kBAAkB,CAAC,iBAAiB,EAAE,CAAC;IACxC,CAAC;IAED;;;OAGG;IACI,SAAS;QACf,OAAO,yBAAyB,CAAC,UAAU,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,KAAK;QACjB,IAAI,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC5C,OAAO;QACR,CAAC;QACD,MAAM,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,EAAE,yBAAyB,CAAC,CAAC;IACvF,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACI,KAAK,CAAC,MAAM,CAClB,UAAkB,EAClB,gBAAoC,EACpC,YAAmC,EACnC,IAAgB,EAChB,gBAAoC,EACpC,uBAAwD,EACxD,OAIC;QAED,MAAM,CAAC,WAAW,CAAC,yBAAyB,CAAC,UAAU,gBAAsB,UAAU,CAAC,CAAC;QACzF,MAAM,CAAC,UAAU,CAChB,yBAAyB,CAAC,UAAU,kBAEpC,YAAY,EACZ,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CACpC,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,yBAAyB,CAAC,UAAU,UAAgB,IAAI,CAAC,CAAC;QAE5E,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,aAAa,EAAE,CAAC;QAExD,IAAI,CAAC;YACJ,MAAM,cAAc,GAA0C;gBAC7D,UAAU,EAAE,CAAC,0BAA0B,CAAC,OAAO,EAAE,0BAA0B,CAAC,aAAa,CAAC;gBAC1F,IAAI,EAAE,uBAAuB,CAAC,MAAM;aACpC,CAAC;YAEF,IAAI,OAAO,EAAE,QAAQ,IAAI,IAAI,EAAE,CAAC;gBAC/B,cAAc,CAAC,OAAO,KAAK,EAAE,CAAC;gBAC9B,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC;oBAC3B,UAAU,EAAE,0BAA0B,CAAC,OAAO;oBAC9C,IAAI,EAAE,uBAAuB,CAAC,KAAK;oBACnC,EAAE,EAAE,UAAU;oBACd,WAAW,EAAE,gBAAgB;oBAC7B,gBAAgB,EAAE,OAAO,EAAE,qBAAqB;iBAChD,CAAC,CAAC;YACJ,CAAC;YAED,+BAA+B;YAC/B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YAE7F,MAAM,eAAe,GAAkC;gBACtD,UAAU,EAAE;oBACX,iBAAiB,CAAC,OAAO;oBACzB,gBAAgB,CAAC,OAAO;oBACxB,gBAAgB,CAAC,aAAa;iBAC9B;gBACD,IAAI,EAAE,aAAa,CAAC,QAAQ;gBAC5B,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,CAAC;gBACxC,UAAU;gBACV,gBAAgB;gBAChB,YAAY;gBACZ,gBAAgB,EAAE,CAAC;gBACnB,gBAAgB;gBAChB,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC;gBACpE,aAAa;gBACb,WAAW,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE;gBAC/C,oBAAoB,EAAE,UAAU,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC;gBAC9D,YAAY,EAAE,UAAU,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC;aAC9C,CAAC;YAEF,IAAI,OAAO,EAAE,iBAAiB,IAAI,KAAK,EAAE,CAAC;gBACzC,eAAe,CAAC,aAAa,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;YAC/E,CAAC;YAED,wCAAwC;YACxC,cAAc,CAAC,SAAS,KAAK,EAAE,CAAC;YAChC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC7B,UAAU,EAAE,0BAA0B,CAAC,OAAO;gBAC9C,IAAI,EAAE,uBAAuB,CAAC,QAAQ;gBACtC,cAAc,EAAE,eAAe;aAC/B,CAAC,CAAC;YAEH,yEAAyE;YACzE,IAAI,EAAE,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBAC5C,cAAc,CAAC,KAAK,KAAK,EAAE,CAAC;gBAC5B,KAAK,MAAM,OAAO,IAAI,uBAAuB,EAAE,CAAC;oBAC/C,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC;wBACzB,UAAU,EAAE,0BAA0B,CAAC,OAAO;wBAC9C,IAAI,EAAE,uBAAuB,CAAC,IAAI;wBAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,iBAAiB,EAAE,CAAC,UAAU,CAAC;qBAC/B,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;YAED,wBAAwB;YACxB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAC9D,YAAY,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAClD,CAAC;YAEF,+CAA+C;YAC/C,kFAAkF;YAClF,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,oBAAoB,CACtD,QAAQ,EACR,uBAAuB,IAAI,EAAE,EAC7B,EAAE,EACF,UAAU,EACV,gBAAgB,EAChB,IAAI,CACJ,CAAC;YAEF,IAAI,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE,CAAC;gBACrC,kFAAkF;gBAClF,gFAAgF;gBAChF,0EAA0E;gBAC1E,IAAI,CAAC;oBACJ,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBACxD,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;gBACV,IAAI,CAAC;oBACJ,MAAM,IAAI,CAAC,4BAA4B,CAAC,aAAa,CAAC;wBACrD,UAAU,EAAE;4BACX,0BAA0B,CAAC,OAAO;4BAClC,0BAA0B,CAAC,aAAa;yBACxC;wBACD,EAAE,EAAE,QAAQ;wBACZ,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE;qBACjD,CAAC,CAAC;gBACJ,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;gBACV,MAAM,IAAI,aAAa,CACtB,yBAAyB,CAAC,UAAU,EACpC,yBAAyB,EACzB,eAAe,CACf,CAAC;YACH,CAAC;YAED,MAAM,YAAY,CAAC,eAAe,CACjC,IAAI,CAAC,mBAAmB,EACxB,2BAA2B,CAAC,gBAAgB,EAC5C,EAAE,cAAc,EAAE,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE,CACjE,CAAC;YAEF,OAAO,QAAQ,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,SAAS,CAAC,aAAa,CAAC,KAAK,kBAA0B,EAAE,CAAC;gBAC7D,MAAM,KAAK,CAAC;YACb,CAAC;YACD,MAAM,IAAI,YAAY,CACrB,yBAAyB,CAAC,UAAU,EACpC,cAAc,EACd,SAAS,EACT,KAAK,CACL,CAAC;QACH,CAAC;IACF,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACI,KAAK,CAAC,aAAa,CACzB,4BAAoC,EACpC,IAAiB,EACjB,gBAAoC,EACpC,uBAGC;QAED,GAAG,CAAC,KAAK,CACR,yBAAyB,CAAC,UAAU,kCAEpC,4BAA4B,CAC5B,CAAC;QAEF,MAAM,KAAK,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC;YACJ,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,GAAG,CACjE,4BAA4B,EAC5B,EAAE,cAAc,EAAE,IAAI,EAAE,CACxB,CAAC;YAEF,IAAI,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxC,MAAM,IAAI,aAAa,CAAC,yBAAyB,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;YACvF,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;YACpE,MAAM,cAAc,GAA0B,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAEnF,cAAc,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YAEzF,IAAI,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,aAAa,CAAC,yBAAyB,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;YACvF,CAAC;YAED,wEAAwE;YACxE,mDAAmD;YAEnD,MAAM,kBAAkB,GAAkC,EAAE,CAAC;YAC7D,IAAI,mBAAmB,GAAG,KAAK,CAAC;YAChC,IAAI,yBAAyB,GAAG,KAAK,CAAC;YAEtC,4EAA4E;YAC5E,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,YAAY,GAAG,eAAe,CAAC,QAAQ,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAE/E,IAAI,cAAc,CAAC,SAAS,KAAK,YAAY,EAAE,CAAC;oBAC/C,+BAA+B;oBAC/B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAC5D,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAC7B,CAAC;oBAEF,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;oBAEvD,WAAW,CAAC,gBAAgB,EAAE,CAAC;oBAC/B,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,gBAAgB,CACrC,WAAW,CAAC,UAAU,EACtB,WAAW,CAAC,gBAAgB,CAC5B,CAAC;oBACF,WAAW,CAAC,SAAS,GAAG,YAAY,CAAC;oBACrC,WAAW,CAAC,aAAa,GAAG,aAAa,CAAC;oBAC1C,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBACjC,WAAW,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;oBACjD,CAAC;oBAED,IAAI,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;wBAClD,WAAW,CAAC,aAAa,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;oBACvE,CAAC;oBAED,kBAAkB,CAAC,IAAI,CAAC;wBACvB,UAAU,EAAE,0BAA0B,CAAC,OAAO;wBAC9C,IAAI,EAAE,uBAAuB,CAAC,QAAQ;wBACtC,cAAc,EAAE,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC;qBACtD,CAAC,CAAC;oBAEH,yBAAyB,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;oBACtE,mBAAmB,GAAG,IAAI,CAAC;gBAC5B,CAAC;qBAAM,IAAI,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;oBACvD,wEAAwE;oBACxE,MAAM,gBAAgB,GAAG,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;oBAC5D,OAAO,gBAAgB,CAAC,WAAW,CAAC;oBACpC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBACjC,gBAAgB,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;oBACtD,CAAC;oBACD,kBAAkB,CAAC,IAAI,CAAC;wBACvB,UAAU,EAAE,0BAA0B,CAAC,OAAO;wBAC9C,IAAI,EAAE,uBAAuB,CAAC,QAAQ;wBACtC,cAAc,EAAE,YAAY,CAAC,YAAY,CAAC,gBAAgB,CAAC;qBAC3D,CAAC,CAAC;oBACH,mBAAmB,GAAG,IAAI,CAAC;gBAC5B,CAAC;YACF,CAAC;YAED,uFAAuF;YACvF,sEAAsE;YACtE,qFAAqF;YACrF,IACC,CAAC,mBAAmB;gBACpB,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC;gBAC3B,CAAC,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,EACrE,CAAC;gBACF,cAAc,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;gBACnD,cAAc,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;gBACjE,kBAAkB,CAAC,IAAI,CACtB,YAAY,CAAC,qBAAqB,CAAC;oBAClC,UAAU,EAAE,0BAA0B,CAAC,OAAO;oBAC9C,IAAI,EAAE,uBAAuB,CAAC,QAAQ;oBACtC,cAAc,EAAE,YAAY,CAAC,YAAY,CAAC,cAAc,CAAC;iBACzD,CAAC,CACF,CAAC;YACH,CAAC;YAED,uEAAuE;YACvE,MAAM,UAAU,GAAG,uBAAuB,EAAE,GAAG,IAAI,EAAE,CAAC;YACtD,MAAM,qBAAqB,GAAG,uBAAuB,EAAE,MAAM,IAAI,EAAE,CAAC;YACpE,MAAM,cAAc,GACnB,CAAC,EAAE,CAAC,KAAK,CAAC,uBAAuB,CAAC;gBAClC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAE7D,MAAM,sBAAsB,GAA8B,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACpF,UAAU,EAAE,0BAA0B,CAAC,OAAO;gBAC9C,IAAI,EAAE,uBAAuB,CAAC,IAAI;gBAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,iBAAiB,EAAE,CAAC,UAAU,CAAC;aAC/B,CAAC,CAAC,CAAC;YAEJ,6EAA6E;YAC7E,MAAM,yBAAyB,GAAa,qBAAqB;iBAC/D,GAAG,CACH,QAAQ,CAAC,EAAE,CACV,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CACxF;iBACA,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;YAEnD,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC;gBACrD,MAAM,OAAO,GAAqC;oBACjD,UAAU,EAAE;wBACX,0BAA0B,CAAC,OAAO;wBAClC,0BAA0B,CAAC,aAAa;qBACxC;oBACD,EAAE,EAAE,4BAA4B;iBAChC,CAAC;gBACF,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnC,OAAO,CAAC,eAAe,GAAG,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC;gBACvD,CAAC;gBACD,IAAI,cAAc,EAAE,CAAC;oBACpB,OAAO,CAAC,WAAW,GAAG;wBACrB,GAAG,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC7E,GAAG,CAAC,yBAAyB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACtF,CAAC;gBACH,CAAC;gBACD,MAAM,IAAI,CAAC,4BAA4B,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAChE,CAAC;YAED,IAAI,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,oBAAoB,CAC9B,4BAA4B,EAC5B,UAAU,EACV,qBAAqB,EACrB,cAAc,CAAC,UAAU,EACzB,cAAc,CAAC,gBAAgB,CAC/B,CAAC;YACH,CAAC;YAED,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC;YACtE,IAAI,mBAAmB,EAAE,CAAC;gBACzB,MAAM,YAAY,CAAC,eAAe,CACjC,IAAI,CAAC,mBAAmB,EACxB,2BAA2B,CAAC,gBAAgB,EAC5C,EAAE,cAAc,EAAE,yBAAyB,EAAE,CAC7C,CAAC;YACH,CAAC;YACD,IAAI,aAAa,EAAE,CAAC;gBACnB,MAAM,YAAY,CAAC,eAAe,CACjC,IAAI,CAAC,mBAAmB,EACxB,2BAA2B,CAAC,gBAAgB,EAC5C,EAAE,cAAc,EAAE,mBAAmB,EAAE,CACvC,CAAC;YACH,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,SAAS,CAAC,aAAa,CAAC,KAAK,kBAA0B,EAAE,CAAC;gBAC7D,MAAM,KAAK,CAAC;YACb,CAAC;YACD,MAAM,IAAI,YAAY,CACrB,yBAAyB,CAAC,UAAU,EACpC,cAAc,EACd,SAAS,EACT,KAAK,CACL,CAAC;QACH,CAAC;gBAAS,CAAC;YACV,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;IACF,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACI,KAAK,CAAC,GAAG,CACf,4BAAoC,EACpC,OAQC,EACD,MAAe,EACf,KAAc;QAKd,GAAG,CAAC,KAAK,CACR,yBAAyB,CAAC,UAAU,kCAEpC,4BAA4B,CAC5B,CAAC;QAEF,IAAI,CAAC;YACJ,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,GAAG,CACjE,4BAA4B,EAC5B;gBACC,cAAc,EACb,CAAC,OAAO,EAAE,cAAc,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,IAAI,KAAK,CAAC;aAC9E,CACD,CAAC;YAEF,qFAAqF;YACrF,6EAA6E;YAC7E,IAAI,CAAC,OAAO,EAAE,mBAAmB,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,IAAI,KAAK,CAAC,EAAE,CAAC;gBACpF,cAAc,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YAC3F,CAAC;YAED,2DAA2D;YAC3D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAE5F,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAC3C,SAAS,CAAC,OAAO,EACjB,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAC7B,CAAC;YACF,OAAO;gBACN,OAAO,EAAE,MAAM;gBACf,MAAM,EAAE,SAAS,CAAC,MAAM;aACxB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,SAAS,CAAC,aAAa,CAAC,KAAK,kBAA0B,EAAE,CAAC;gBAC7D,MAAM,KAAK,CAAC;YACb,CAAC;YACD,MAAM,IAAI,YAAY,CAAC,yBAAyB,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7F,CAAC;IACF,CAAC;IAED;;;;;;;;;;;OAWG;IACI,KAAK,CAAC,WAAW,CACvB,4BAAoC,EACpC,QAAgB,EAChB,OAMC;QAED,GAAG,CAAC,KAAK,CACR,yBAAyB,CAAC,UAAU,kCAEpC,4BAA4B,CAC5B,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,UAAU,cAAoB,QAAQ,CAAC,CAAC;QAEjF,IAAI,CAAC;YACJ,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,GAAG,CACjE,4BAA4B,EAC5B,EAAE,cAAc,EAAE,IAAI,EAAE,CACxB,CAAC;YAEF,IAAI,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxC,MAAM,IAAI,aAAa,CAAC,yBAAyB,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;YACvF,CAAC;YAED,cAAc,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,MAAM,CACzD,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,gBAAgB,KAAK,QAAQ,CACpD,CAAC;YAEF,IAAI,cAAc,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,aAAa,CACtB,yBAAyB,CAAC,UAAU,EACpC,0BAA0B,EAC1B,QAAQ,CAAC,QAAQ,EAAE,CACnB,CAAC;YACH,CAAC;YAED,2DAA2D;YAC3D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAE3E,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAC3C,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAClC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAC9C,CAAC;YACF,OAAO,MAAM,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,SAAS,CAAC,aAAa,CAAC,KAAK,kBAA0B,EAAE,CAAC;gBAC7D,MAAM,KAAK,CAAC;YACb,CAAC;YACD,MAAM,IAAI,YAAY,CACrB,yBAAyB,CAAC,UAAU,EACpC,mBAAmB,EACnB,SAAS,EACT,KAAK,CACL,CAAC;QACH,CAAC;IACF,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,cAAc,CAC1B,4BAAoC,EACpC,QAAgB;QAEhB,GAAG,CAAC,KAAK,CACR,yBAAyB,CAAC,UAAU,kCAEpC,4BAA4B,CAC5B,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,UAAU,cAAoB,QAAQ,CAAC,CAAC;QAEjF,MAAM,KAAK,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC;YACJ,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,GAAG,CACjE,4BAA4B,CAC5B,CAAC;YAEF,IAAI,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxC,MAAM,IAAI,aAAa,CAAC,yBAAyB,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;YACvF,CAAC;YAED,MAAM,gBAAgB,GAAG,cAAc,CAAC,SAAS,CAAC,SAAS,CAC1D,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,gBAAgB,KAAK,QAAQ,CACpD,CAAC;YAEF,IAAI,gBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,aAAa,CACtB,yBAAyB,CAAC,UAAU,EACpC,0BAA0B,EAC1B,QAAQ,CAAC,QAAQ,EAAE,CACnB,CAAC;YACH,CAAC;YAED,MAAM,kBAAkB,GACtB,cAAc,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,cAAc,EAAE,EAAyB;gBACpF,cAAc,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,cAAc,EAAE,CAAC,KAAK,CAAwB,CAAC;YAE5F,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACzC,sFAAsF;gBACtF,MAAM,IAAI,YAAY,CAAC,yBAAyB,CAAC,UAAU,EAAE,2BAA2B,EAAE;oBACzF,QAAQ;iBACR,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,CAAC,4BAA4B,CAAC,aAAa,CAAC;gBACrD,UAAU,EAAE,CAAC,0BAA0B,CAAC,OAAO,EAAE,0BAA0B,CAAC,aAAa,CAAC;gBAC1F,EAAE,EAAE,4BAA4B;gBAChC,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC,kBAAkB,CAAC,EAAE;aACjD,CAAC,CAAC;YACH,MAAM,YAAY,CAAC,eAAe,CACjC,IAAI,CAAC,mBAAmB,EACxB,2BAA2B,CAAC,gBAAgB,CAC5C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,SAAS,CAAC,aAAa,CAAC,KAAK,kBAA0B,EAAE,CAAC;gBAC7D,MAAM,KAAK,CAAC;YACb,CAAC;YACD,MAAM,IAAI,YAAY,CACrB,yBAAyB,CAAC,UAAU,EACpC,sBAAsB,EACtB,SAAS,EACT,KAAK,CACL,CAAC;QACH,CAAC;gBAAS,CAAC;YACV,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;IACF,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,KAAK,CACjB,UAAkB,EAClB,MAAe,EACf,KAAc;QAKd,MAAM,CAAC,WAAW,CAAC,yBAAyB,CAAC,UAAU,gBAAsB,UAAU,CAAC,CAAC;QAEzF,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAC3D;gBACC,EAAE,EAAE,UAAU;gBACd,MAAM,EAAE,MAAM;gBACd,aAAa,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC;aACvC,EACD,SAAS,EACT,SAAS,EACT,SAAS,EACT,CAAC,IAAI,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,kBAAkB,EAAE,WAAW,EAAE,OAAO,CAAC,EAC1F,MAAM,EACN,KAAK,CACL,CAAC;YACF,OAAO,MAAM,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,SAAS,CAAC,aAAa,CAAC,KAAK,kBAA0B,EAAE,CAAC;gBAC7D,MAAM,KAAK,CAAC;YACb,CAAC;YACD,MAAM,IAAI,YAAY,CAAC,yBAAyB,CAAC,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC/F,CAAC;IACF,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACK,KAAK,CAAC,oBAAoB,CACjC,4BAAoC,EACpC,UAA0C,EAC1C,qBAA+B,EAC/B,UAAkB,EAClB,gBAAoC,EACpC,eAAwB,KAAK;QAE7B,mFAAmF;QACnF,6CAA6C;QAC7C,MAAM,gBAAgB,GAAa,EAAE,CAAC;QAEtC,iDAAiD;QACjD,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;YAClC,MAAM,OAAO,GAAqC;gBACjD,UAAU,EAAE,CAAC,0BAA0B,CAAC,OAAO,EAAE,0BAA0B,CAAC,aAAa,CAAC;gBAC1F,EAAE,EAAE,OAAO,CAAC,QAAQ;gBACpB,WAAW,EAAE;oBACZ,GAAG,EAAE;wBACJ;4BACC,UAAU,EAAE,0BAA0B,CAAC,OAAO;4BAC9C,IAAI,EAAE,uBAAuB,CAAC,IAAI;4BAClC,QAAQ,EAAE,4BAA4B;4BACtC,iBAAiB,EAAE,CAAC,UAAU,CAAC;yBAC/B;qBACD;iBACD;aACD,CAAC;YAEF,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACtB,OAAO,CAAC,YAAY,GAAG;oBACtB,GAAG,EAAE;wBACJ;4BACC,UAAU,EAAE,0BAA0B,CAAC,OAAO;4BAC9C,IAAI,EAAE,uBAAuB,CAAC,KAAK;4BACnC,EAAE,EAAE,UAAU;4BACd,WAAW,EAAE,gBAAgB;4BAC7B,gBAAgB,EAAE,OAAO,CAAC,qBAAqB;yBAC/C;qBACD;iBACD,CAAC;YACH,CAAC;YAED,IAAI,YAAY,EAAE,CAAC;gBAClB,IAAI,CAAC;oBACJ,MAAM,IAAI,CAAC,4BAA4B,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;oBAC/D,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACzC,CAAC;gBAAC,MAAM,CAAC;oBACR,+DAA+D;oBAC/D,MAAM,IAAI,CAAC,sBAAsB,CAChC,4BAA4B,EAC5B,gBAAgB,EAChB,UAAU,CACV,CAAC;oBACF,OAAO,OAAO,CAAC,QAAQ,CAAC;gBACzB,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC;oBACJ,MAAM,IAAI,CAAC,4BAA4B,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBAChE,CAAC;gBAAC,MAAM,CAAC;oBACR,6FAA6F;gBAC9F,CAAC;YACF,CAAC;QACF,CAAC;QAED,gDAAgD;QAChD,KAAK,MAAM,aAAa,IAAI,qBAAqB,EAAE,CAAC;YACnD,2EAA2E;YAC3E,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAE7E,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CACnC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,4BAA4B,CAC3E,EAAE,EAAE,CAAC;YAEN,MAAM,QAAQ,GACb,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC;gBAChC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;YAE7E,MAAM,OAAO,GAAqC;gBACjD,UAAU,EAAE,CAAC,0BAA0B,CAAC,OAAO,EAAE,0BAA0B,CAAC,aAAa,CAAC;gBAC1F,EAAE,EAAE,aAAa;aACjB,CAAC;YAEF,IAAI,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,YAAY,GAAG,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;YACjD,CAAC;YAED,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,WAAW,GAAG,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,CAAC;YAED,IAAI,QAAQ,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxC,MAAM,IAAI,CAAC,4BAA4B,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAChE,CAAC;QACF,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,sBAAsB,CACnC,4BAAoC,EACpC,SAAmB,EACnB,UAAkB;QAElB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC;gBACJ,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAExE,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CACnC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,4BAA4B,CAC3E,EAAE,EAAE,CAAC;gBAEN,MAAM,QAAQ,GACb,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC;oBAChC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;gBAE7E,MAAM,OAAO,GAAqC;oBACjD,UAAU,EAAE;wBACX,0BAA0B,CAAC,OAAO;wBAClC,0BAA0B,CAAC,aAAa;qBACxC;oBACD,EAAE,EAAE,QAAQ;iBACZ,CAAC;gBAEF,IAAI,QAAQ,EAAE,CAAC;oBACd,OAAO,CAAC,YAAY,GAAG,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjD,CAAC;gBAED,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC5B,OAAO,CAAC,WAAW,GAAG,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5C,CAAC;gBAED,IAAI,QAAQ,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;oBACxC,MAAM,IAAI,CAAC,4BAA4B,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBAChE,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,qEAAqE;YACtE,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACK,KAAK,CAAC,sBAAsB,CACnC,cAAyC,EACzC,OAOC,EACD,MAAe,EACf,KAAc;QAKd,MAAM,OAAO,GAAkB;YAC9B,UAAU,EAAE;gBACX,iBAAiB,CAAC,OAAO;gBACzB,gBAAgB,CAAC,OAAO;gBACxB,gBAAgB,CAAC,aAAa;aAC9B;YACD,IAAI,EAAE,cAAc,CAAC,QAAQ;YAC7B,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,EAAE;SACpC,CAAC;QAEF,IAAI,UAA8B,CAAC;QAEnC,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,gCAAgC;YAChC,cAAc,CAAC,SAAS,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACR,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBACxD,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CACzD,CAAC;YAEF,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACtF,MAAM,eAAe,GAAG,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC7E,UAAU,GAAG,cAAc,CAAC,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAE1F,MAAM,0BAA0B,GAAG,OAAO,EAAE,0BAA0B,IAAI,KAAK,CAAC;YAChF,MAAM,sBAAsB,GAAG,OAAO,EAAE,sBAAsB,IAAI,KAAK,CAAC;YACxE,MAAM,kBAAkB,GAAG,OAAO,EAAE,kBAAkB,IAAI,KAAK,CAAC;YAChE,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;YAEhE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjD,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,cAAsC,CAAC;gBAC3E,IAAI,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzB,QAAQ,CAAC,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;oBAEtD,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAEvD,MAAM,YAAY,GAAG,0BAA0B,IAAI,sBAAsB,CAAC;oBAC1E,IAAI,YAAY,IAAI,WAAW,EAAE,CAAC;wBACjC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE;4BAC9E,cAAc,EAAE,sBAAsB,IAAI,WAAW;yBACrD,CAAC,CAAC;wBAEH,IAAI,YAAY,EAAE,CAAC;4BAClB,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC;4BACtC,IAAI,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gCAC1C,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;4BACpE,CAAC;4BAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;gCAChE,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;4BACvD,CAAC;wBACF,CAAC;wBAED,IAAI,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,kBAAkB,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;4BACnF,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;4BAC3D,QAAQ,CAAC,aAAa,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,CACnE,OAAO,CAAC,kBAAkB,EAC1B,UAAU,EACV,SAAS,EACT,OAAO,EAAE,eAAe,CACxB,CAAC;wBACH,CAAC;wBAED,yEAAyE;wBACzE,sCAAsC;wBACtC,IAAI,CAAC,YAAY,EAAE,CAAC;4BACnB,OAAO,QAAQ,CAAC,gBAAgB,CAAC;wBAClC,CAAC;6BAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;4BACpC,OAAO,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC;wBACxC,CAAC;oBACF,CAAC;oBAED,IAAI,kBAAkB,IAAI,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;wBAClE,MAAM,sBAAsB,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAClE,QAAQ,CAAC,aAAa,CACtB,CAAC;wBACF,QAAQ,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;wBACzD,IAAI,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;4BAChD,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC;wBAC1E,CAAC;oBACF,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;QAED,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,KAAK,KAAK,EAAE,CAAC;YAErB,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,KAAK,EAAE,CAAC;gBACzC,IACC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;oBACf,CAAC,CAAC,OAAO,EAAE,mBAAmB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EACtE,CAAC;oBACF,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACnC,CAAC;YACF,CAAC;QACF,CAAC;QAED,OAAO;YACN,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,UAAU;SAClB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,iBAAiB,CAAC,QAAmB;QAClD,MAAM,mBAAmB,GAA6C;YACrE,UAAU,EAAE;gBACX,iBAAiB,CAAC,OAAO;gBACzB,gBAAgB,CAAC,OAAO;gBACxB,gBAAgB,CAAC,aAAa;aAC9B;YACD,IAAI,EAAE,aAAa,CAAC,mBAAmB;YACvC,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;YAC3C,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC7B,CAAC;QACF,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACnF,MAAM,YAAY,CAAC,eAAe,CACjC,IAAI,CAAC,mBAAmB,EACxB,2BAA2B,CAAC,mBAAmB,CAC/C,CAAC;QACF,OAAO,aAAa,CAAC;IACtB,CAAC;IAED;;;;;;OAMG;IACK,gBAAgB,CAAC,UAAkB,EAAE,QAAgB;QAC5D,MAAM,cAAc,GAAG,SAAS,CAAC,gBAAgB,CAChD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAChD,CAAC;QACF,OAAO,YAAY,cAAc,IAAI,QAAQ,EAAE,CAAC;IACjD,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IAttestationComponent } from \"@twin.org/attestation-models\";\nimport {\n\tAuditableItemGraphContexts,\n\tAuditableItemGraphTypes,\n\ttype IAuditableItemGraphVertexList,\n\ttype IAuditableItemGraphComponent,\n\ttype IAuditableItemGraphEdge,\n\ttype IAuditableItemGraphPartialVertex,\n\ttype IAuditableItemGraphResource,\n\ttype IAuditableItemGraphVertex\n} from \"@twin.org/auditable-item-graph-models\";\nimport type { IBlobStorageComponent } from \"@twin.org/blob-storage-models\";\nimport { BlobStorageContexts } from \"@twin.org/blob-storage-models\";\nimport { ContextIdKeys, ContextIdStore } from \"@twin.org/context\";\nimport {\n\tBaseError,\n\tCoerce,\n\tComponentFactory,\n\tConverter,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tMutex,\n\tNotFoundError,\n\tObjectHelper,\n\tUrn\n} from \"@twin.org/core\";\nimport { IntegrityAlgorithm, IntegrityHelper, Sha256 } from \"@twin.org/crypto\";\nimport { JsonLdHelper, JsonLdProcessor, type IJsonLdNodeObject } from \"@twin.org/data-json-ld\";\nimport type { IDataProcessingComponent } from \"@twin.org/data-processing-models\";\nimport {\n\tDocumentContexts,\n\tDocumentManagementMetricIds,\n\tDocumentManagementMetrics,\n\tDocumentTypes,\n\ttype IDocumentManagementEdgeEntry,\n\ttype IDocument,\n\ttype IDocumentAttestation,\n\ttype IDocumentList,\n\ttype IDocumentManagementComponent\n} from \"@twin.org/document-management-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport {\n\tSchemaOrgContexts,\n\tSchemaOrgDataTypes,\n\tSchemaOrgTypes\n} from \"@twin.org/standards-schema-org\";\nimport { UneceDocumentCodeList } from \"@twin.org/standards-unece\";\nimport { MetricHelper, type ITelemetryComponent } from \"@twin.org/telemetry-models\";\nimport type { IDocumentManagementServiceConstructorOptions } from \"./models/IDocumentManagementStorageServiceConstructorOptions.js\";\n\n/**\n * Service for performing document management operations.\n */\nexport class DocumentManagementService implements IDocumentManagementComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<DocumentManagementService>();\n\n\t/**\n\t * The component for the auditable item graph.\n\t * @internal\n\t */\n\tprivate readonly _auditableItemGraphComponent: IAuditableItemGraphComponent;\n\n\t/**\n\t * The connector for the blob component.\n\t * @internal\n\t */\n\tprivate readonly _blobStorageComponent: IBlobStorageComponent;\n\n\t/**\n\t * The connector for the attestation.\n\t * @internal\n\t */\n\tprivate readonly _attestationComponent: IAttestationComponent;\n\n\t/**\n\t * The connector for the data processing.\n\t * @internal\n\t */\n\tprivate readonly _dataProcessingComponent: IDataProcessingComponent;\n\n\t/**\n\t * The optional telemetry component used for event metrics.\n\t * @internal\n\t */\n\tprivate readonly _telemetryComponent?: ITelemetryComponent;\n\n\t/**\n\t * Create a new instance of DocumentManagementService.\n\t * @param options The options for the service.\n\t */\n\tconstructor(options?: IDocumentManagementServiceConstructorOptions) {\n\t\tthis._auditableItemGraphComponent = ComponentFactory.get<IAuditableItemGraphComponent>(\n\t\t\toptions?.auditableItemGraphComponentType ?? \"auditable-item-graph\"\n\t\t);\n\t\tthis._blobStorageComponent = ComponentFactory.get<IBlobStorageComponent>(\n\t\t\toptions?.blobStorageComponentType ?? \"blob-storage\"\n\t\t);\n\t\tthis._attestationComponent = ComponentFactory.get<IAttestationComponent>(\n\t\t\toptions?.attestationComponentType ?? \"attestation\"\n\t\t);\n\t\tthis._dataProcessingComponent = ComponentFactory.get<IDataProcessingComponent>(\n\t\t\toptions?.dataProcessingComponentType ?? \"data-processing\"\n\t\t);\n\t\tthis._telemetryComponent = ComponentFactory.getIfExists<ITelemetryComponent>(\n\t\t\toptions?.telemetryComponentType\n\t\t);\n\n\t\tSchemaOrgDataTypes.registerRedirects();\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 DocumentManagementService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Register all document management metrics with the telemetry component.\n\t * @returns A promise that resolves when metrics have been registered.\n\t */\n\tpublic async start(): Promise<void> {\n\t\tif (Is.undefined(this._telemetryComponent)) {\n\t\t\treturn;\n\t\t}\n\t\tawait MetricHelper.createMetrics(this._telemetryComponent, DocumentManagementMetrics);\n\t}\n\n\t/**\n\t * Store a document as an auditable item graph vertex and add its content to blob storage.\n\t * If the document id already exists and the blob data is different a new revision will be created.\n\t * For any other changes the current revision will be updated.\n\t * @param documentId The document id to create.\n\t * @param documentIdFormat The format of the document identifier.\n\t * @param documentCode The code for the document type.\n\t * @param blob The data to create the document with.\n\t * @param annotationObject Additional information to associate with the document.\n\t * @param auditableItemGraphEdges The auditable item graph vertices to connect the document to.\n\t * @param options Additional options for the set operation.\n\t * @param options.createAttestation Flag to create an attestation for the document, defaults to false.\n\t * @param options.addAlias Flag to add the document id as an alias to the aig vertex, defaults to true.\n\t * @param options.aliasAnnotationObject Annotation object for the alias.\n\t * @returns The auditable item graph vertex created for the document including its revision.\n\t */\n\tpublic async create(\n\t\tdocumentId: string,\n\t\tdocumentIdFormat: string | undefined,\n\t\tdocumentCode: UneceDocumentCodeList,\n\t\tblob: Uint8Array,\n\t\tannotationObject?: IJsonLdNodeObject,\n\t\tauditableItemGraphEdges?: IDocumentManagementEdgeEntry[],\n\t\toptions?: {\n\t\t\tcreateAttestation?: boolean;\n\t\t\taddAlias?: boolean;\n\t\t\taliasAnnotationObject?: IJsonLdNodeObject;\n\t\t}\n\t): Promise<string> {\n\t\tGuards.stringValue(DocumentManagementService.CLASS_NAME, nameof(documentId), documentId);\n\t\tGuards.arrayOneOf(\n\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\tnameof(documentCode),\n\t\t\tdocumentCode,\n\t\t\tObject.values(UneceDocumentCodeList)\n\t\t);\n\t\tGuards.uint8Array(DocumentManagementService.CLASS_NAME, nameof(blob), blob);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\n\t\ttry {\n\t\t\tconst documentVertex: Omit<IAuditableItemGraphVertex, \"id\"> = {\n\t\t\t\t\"@context\": [AuditableItemGraphContexts.Context, AuditableItemGraphContexts.ContextCommon],\n\t\t\t\ttype: AuditableItemGraphTypes.Vertex\n\t\t\t};\n\n\t\t\tif (options?.addAlias ?? true) {\n\t\t\t\tdocumentVertex.aliases ??= [];\n\t\t\t\tdocumentVertex.aliases.push({\n\t\t\t\t\t\"@context\": AuditableItemGraphContexts.Context,\n\t\t\t\t\ttype: AuditableItemGraphTypes.Alias,\n\t\t\t\t\tid: documentId,\n\t\t\t\t\taliasFormat: documentIdFormat,\n\t\t\t\t\tannotationObject: options?.aliasAnnotationObject\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Add the blob to blob storage\n\t\t\tconst blobStorageId = await this._blobStorageComponent.create(Converter.bytesToBase64(blob));\n\n\t\t\tconst currentRevision: IDocument & IJsonLdNodeObject = {\n\t\t\t\t\"@context\": [\n\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\tDocumentContexts.Context,\n\t\t\t\t\tDocumentContexts.ContextCommon\n\t\t\t\t],\n\t\t\t\ttype: DocumentTypes.Document,\n\t\t\t\tid: this.createDocumentId(documentId, 0),\n\t\t\t\tdocumentId,\n\t\t\t\tdocumentIdFormat,\n\t\t\t\tdocumentCode,\n\t\t\t\tdocumentRevision: 0,\n\t\t\t\tannotationObject,\n\t\t\t\tintegrity: IntegrityHelper.generate(IntegrityAlgorithm.Sha256, blob),\n\t\t\t\tblobStorageId,\n\t\t\t\tdateCreated: new Date(Date.now()).toISOString(),\n\t\t\t\torganizationIdentity: contextIds?.[ContextIdKeys.Organization],\n\t\t\t\tuserIdentity: contextIds?.[ContextIdKeys.User]\n\t\t\t};\n\n\t\t\tif (options?.createAttestation ?? false) {\n\t\t\t\tcurrentRevision.attestationId = await this.createAttestation(currentRevision);\n\t\t\t}\n\n\t\t\t// Add the new revision in to the vertex\n\t\t\tdocumentVertex.resources ??= [];\n\t\t\tdocumentVertex.resources.push({\n\t\t\t\t\"@context\": AuditableItemGraphContexts.Context,\n\t\t\t\ttype: AuditableItemGraphTypes.Resource,\n\t\t\t\tresourceObject: currentRevision\n\t\t\t});\n\n\t\t\t// Add the outgoing edges from the document vertex to each connected item\n\t\t\tif (Is.arrayValue(auditableItemGraphEdges)) {\n\t\t\t\tdocumentVertex.edges ??= [];\n\t\t\t\tfor (const aigEdge of auditableItemGraphEdges) {\n\t\t\t\t\tdocumentVertex.edges.push({\n\t\t\t\t\t\t\"@context\": AuditableItemGraphContexts.Context,\n\t\t\t\t\t\ttype: AuditableItemGraphTypes.Edge,\n\t\t\t\t\t\ttargetId: aigEdge.targetId,\n\t\t\t\t\t\tedgeRelationships: [\"document\"]\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// And create the vertex\n\t\t\tconst vertexId = await this._auditableItemGraphComponent.create(\n\t\t\t\tObjectHelper.removeEmptyProperties(documentVertex)\n\t\t\t);\n\n\t\t\t// Now add the edges to the connected vertices.\n\t\t\t// isCreatePath = true enables fail-fast + rollback if a target vertex is missing.\n\t\t\tconst failingVertexId = await this.updateConnectedEdges(\n\t\t\t\tvertexId,\n\t\t\t\tauditableItemGraphEdges ?? [],\n\t\t\t\t[],\n\t\t\t\tdocumentId,\n\t\t\t\tdocumentIdFormat,\n\t\t\t\ttrue\n\t\t\t);\n\n\t\t\tif (Is.stringValue(failingVertexId)) {\n\t\t\t\t// At least one connected vertex was missing. Back-edges already written have been\n\t\t\t\t// rolled back by updateConnectedEdges. Best-effort cleanup: remove the orphaned\n\t\t\t\t// blob and soft-delete the document resource so the vertex is left empty.\n\t\t\t\ttry {\n\t\t\t\t\tawait this._blobStorageComponent.remove(blobStorageId);\n\t\t\t\t} catch {}\n\t\t\t\ttry {\n\t\t\t\t\tawait this._auditableItemGraphComponent.updatePartial({\n\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\tAuditableItemGraphContexts.Context,\n\t\t\t\t\t\t\tAuditableItemGraphContexts.ContextCommon\n\t\t\t\t\t\t],\n\t\t\t\t\t\tid: vertexId,\n\t\t\t\t\t\tresourcePatches: { remove: [currentRevision.id] }\n\t\t\t\t\t});\n\t\t\t\t} catch {}\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\t\t\t\"connectedVertexNotFound\",\n\t\t\t\t\tfailingVertexId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tDocumentManagementMetricIds.DocumentsCreated,\n\t\t\t\t{ hasAttestation: Is.stringValue(currentRevision.attestationId) }\n\t\t\t);\n\n\t\t\treturn vertexId;\n\t\t} catch (error) {\n\t\t\tif (BaseError.someErrorName(error, nameof<NotFoundError>())) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tDocumentManagementService.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 document as an auditable item graph vertex and add its content to blob storage.\n\t * If the blob data is different a new revision will be created.\n\t * For any other changes the current revision will be updated.\n\t * @param auditableItemGraphDocumentId The auditable item graph vertex id which contains the document.\n\t * @param blob The data to update the document with.\n\t * @param annotationObject Additional information to associate with the document.\n\t * @param auditableItemGraphEdges Explicit edge delta to apply. If undefined, existing connections\n\t * are retained unchanged. Use `add` to create new connections and `remove` to disconnect existing\n\t * ones by their target vertex id. To update alias metadata on an already-connected vertex, include\n\t * it in `add` with the updated `aliasAnnotationObject` — AIG's alias patch is an upsert, so the\n\t * alias is updated in place without creating a duplicate back-edge.\n\t * @param auditableItemGraphEdges.add Connections to add; each creates a back-edge on the connected vertex.\n\t * @param auditableItemGraphEdges.remove Target vertex IDs to disconnect; their back-edges are removed.\n\t * @returns A promise that resolves when the document has been updated.\n\t */\n\tpublic async updatePartial(\n\t\tauditableItemGraphDocumentId: string,\n\t\tblob?: Uint8Array,\n\t\tannotationObject?: IJsonLdNodeObject,\n\t\tauditableItemGraphEdges?: {\n\t\t\tadd?: IDocumentManagementEdgeEntry[];\n\t\t\tremove?: string[];\n\t\t}\n\t): Promise<void> {\n\t\tUrn.guard(\n\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\tnameof(auditableItemGraphDocumentId),\n\t\t\tauditableItemGraphDocumentId\n\t\t);\n\n\t\tawait Mutex.lock(auditableItemGraphDocumentId, { throwOnTimeout: true });\n\t\ttry {\n\t\t\tconst documentVertex = await this._auditableItemGraphComponent.get(\n\t\t\t\tauditableItemGraphDocumentId,\n\t\t\t\t{ includeDeleted: true }\n\t\t\t);\n\n\t\t\tif (Is.empty(documentVertex.resources)) {\n\t\t\t\tthrow new NotFoundError(DocumentManagementService.CLASS_NAME, \"documentRevisionNone\");\n\t\t\t}\n\n\t\t\tconst documents = await this.getDocumentsFromVertex(documentVertex);\n\t\t\tconst latestRevision: IDocument | undefined = documents.entries.itemListElement[0];\n\n\t\t\tdocumentVertex.resources = documentVertex.resources.filter(r => Is.empty(r.dateDeleted));\n\n\t\t\tif (Is.empty(latestRevision)) {\n\t\t\t\tthrow new NotFoundError(DocumentManagementService.CLASS_NAME, \"documentRevisionNone\");\n\t\t\t}\n\n\t\t\t// If auditableItemGraphEdges is undefined we are not updating the edges\n\t\t\t// an empty array can be passed to remove all edges\n\n\t\t\tconst resourcePatchesAdd: IAuditableItemGraphResource[] = [];\n\t\t\tlet blobRevisionCreated = false;\n\t\t\tlet newRevisionHasAttestation = false;\n\n\t\t\t// If the blob is set and its hash has changed then we create a new revision\n\t\t\tif (Is.uint8Array(blob)) {\n\t\t\t\tconst newIntegrity = IntegrityHelper.generate(IntegrityAlgorithm.Sha256, blob);\n\n\t\t\t\tif (latestRevision.integrity !== newIntegrity) {\n\t\t\t\t\t// Add the blob to blob storage\n\t\t\t\t\tconst blobStorageId = await this._blobStorageComponent.create(\n\t\t\t\t\t\tConverter.bytesToBase64(blob)\n\t\t\t\t\t);\n\n\t\t\t\t\tconst newRevision = ObjectHelper.clone(latestRevision);\n\n\t\t\t\t\tnewRevision.documentRevision++;\n\t\t\t\t\tnewRevision.id = this.createDocumentId(\n\t\t\t\t\t\tnewRevision.documentId,\n\t\t\t\t\t\tnewRevision.documentRevision\n\t\t\t\t\t);\n\t\t\t\t\tnewRevision.integrity = newIntegrity;\n\t\t\t\t\tnewRevision.blobStorageId = blobStorageId;\n\t\t\t\t\tif (!Is.empty(annotationObject)) {\n\t\t\t\t\t\tnewRevision.annotationObject = annotationObject;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Is.stringValue(latestRevision.attestationId)) {\n\t\t\t\t\t\tnewRevision.attestationId = await this.createAttestation(newRevision);\n\t\t\t\t\t}\n\n\t\t\t\t\tresourcePatchesAdd.push({\n\t\t\t\t\t\t\"@context\": AuditableItemGraphContexts.Context,\n\t\t\t\t\t\ttype: AuditableItemGraphTypes.Resource,\n\t\t\t\t\t\tresourceObject: JsonLdHelper.toNodeObject(newRevision)\n\t\t\t\t\t});\n\n\t\t\t\t\tnewRevisionHasAttestation = Is.stringValue(newRevision.attestationId);\n\t\t\t\t\tblobRevisionCreated = true;\n\t\t\t\t} else if (Is.stringValue(latestRevision.dateDeleted)) {\n\t\t\t\t\t// Same content as the most recent (soft-deleted) revision — restore it.\n\t\t\t\t\tconst restoredRevision = ObjectHelper.clone(latestRevision);\n\t\t\t\t\tdelete restoredRevision.dateDeleted;\n\t\t\t\t\tif (!Is.empty(annotationObject)) {\n\t\t\t\t\t\trestoredRevision.annotationObject = annotationObject;\n\t\t\t\t\t}\n\t\t\t\t\tresourcePatchesAdd.push({\n\t\t\t\t\t\t\"@context\": AuditableItemGraphContexts.Context,\n\t\t\t\t\t\ttype: AuditableItemGraphTypes.Resource,\n\t\t\t\t\t\tresourceObject: JsonLdHelper.toNodeObject(restoredRevision)\n\t\t\t\t\t});\n\t\t\t\t\tblobRevisionCreated = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If the blob wasn't updated but the annotation object was explicitly provided and has\n\t\t\t// changed, update the current revision instead of creating a new one.\n\t\t\t// Undefined means \"no change\" in patch semantics — it does not clear the annotation.\n\t\t\tif (\n\t\t\t\t!blobRevisionCreated &&\n\t\t\t\t!Is.empty(annotationObject) &&\n\t\t\t\t!ObjectHelper.equal(latestRevision.annotationObject, annotationObject)\n\t\t\t) {\n\t\t\t\tlatestRevision.annotationObject = annotationObject;\n\t\t\t\tlatestRevision.dateModified = new Date(Date.now()).toISOString();\n\t\t\t\tresourcePatchesAdd.push(\n\t\t\t\t\tObjectHelper.removeEmptyProperties({\n\t\t\t\t\t\t\"@context\": AuditableItemGraphContexts.Context,\n\t\t\t\t\t\ttype: AuditableItemGraphTypes.Resource,\n\t\t\t\t\t\tresourceObject: JsonLdHelper.toNodeObject(latestRevision)\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Build document-vertex edge patches directly from the explicit delta.\n\t\t\tconst edgesToAdd = auditableItemGraphEdges?.add ?? [];\n\t\t\tconst edgeTargetIdsToRemove = auditableItemGraphEdges?.remove ?? [];\n\t\t\tconst hasEdgeChanges =\n\t\t\t\t!Is.empty(auditableItemGraphEdges) &&\n\t\t\t\t(edgesToAdd.length > 0 || edgeTargetIdsToRemove.length > 0);\n\n\t\t\tconst documentEdgePatchesAdd: IAuditableItemGraphEdge[] = edgesToAdd.map(aigEdge => ({\n\t\t\t\t\"@context\": AuditableItemGraphContexts.Context,\n\t\t\t\ttype: AuditableItemGraphTypes.Edge,\n\t\t\t\ttargetId: aigEdge.targetId,\n\t\t\t\tedgeRelationships: [\"document\"]\n\t\t\t}));\n\n\t\t\t// Resolve remove targetIds to stored edge IDs for the document vertex patch.\n\t\t\tconst documentEdgePatchesRemove: string[] = edgeTargetIdsToRemove\n\t\t\t\t.map(\n\t\t\t\t\ttargetId =>\n\t\t\t\t\t\tdocumentVertex.edges?.find(e => e.targetId === targetId && Is.empty(e.dateDeleted))?.id\n\t\t\t\t)\n\t\t\t\t.filter((id): id is string => Is.stringValue(id));\n\n\t\t\tif (resourcePatchesAdd.length > 0 || hasEdgeChanges) {\n\t\t\t\tconst partial: IAuditableItemGraphPartialVertex = {\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],\n\t\t\t\t\tid: auditableItemGraphDocumentId\n\t\t\t\t};\n\t\t\t\tif (resourcePatchesAdd.length > 0) {\n\t\t\t\t\tpartial.resourcePatches = { add: resourcePatchesAdd };\n\t\t\t\t}\n\t\t\t\tif (hasEdgeChanges) {\n\t\t\t\t\tpartial.edgePatches = {\n\t\t\t\t\t\t...(documentEdgePatchesAdd.length > 0 ? { add: documentEdgePatchesAdd } : {}),\n\t\t\t\t\t\t...(documentEdgePatchesRemove.length > 0 ? { remove: documentEdgePatchesRemove } : {})\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tawait this._auditableItemGraphComponent.updatePartial(partial);\n\t\t\t}\n\n\t\t\tif (hasEdgeChanges) {\n\t\t\t\tawait this.updateConnectedEdges(\n\t\t\t\t\tauditableItemGraphDocumentId,\n\t\t\t\t\tedgesToAdd,\n\t\t\t\t\tedgeTargetIdsToRemove,\n\t\t\t\t\tlatestRevision.documentId,\n\t\t\t\t\tlatestRevision.documentIdFormat\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst updatedVertex = resourcePatchesAdd.length > 0 || hasEdgeChanges;\n\t\t\tif (blobRevisionCreated) {\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tDocumentManagementMetricIds.RevisionsCreated,\n\t\t\t\t\t{ hasAttestation: newRevisionHasAttestation }\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (updatedVertex) {\n\t\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\t\tthis._telemetryComponent,\n\t\t\t\t\tDocumentManagementMetricIds.DocumentsUpdated,\n\t\t\t\t\t{ hasNewRevision: blobRevisionCreated }\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (BaseError.someErrorName(error, nameof<NotFoundError>())) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\t\t\"updateFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t} finally {\n\t\t\tMutex.unlock(auditableItemGraphDocumentId);\n\t\t}\n\t}\n\n\t/**\n\t * Get a document using it's auditable item graph vertex id and optional revision.\n\t * @param auditableItemGraphDocumentId The auditable item graph vertex id which contains the document.\n\t * @param options Additional options for the get operation.\n\t * @param options.includeBlobStorageMetadata Flag to include the blob storage metadata for the document, defaults to false.\n\t * @param options.includeBlobStorageData Flag to include the blob storage data for the document, defaults to false.\n\t * @param options.includeAttestation Flag to include the attestation information for the document, defaults to false.\n\t * @param options.includeRemoved Flag to include deleted documents, defaults to false.\n\t * @param options.includeDeletedEdges Flag to include soft-deleted edges in the response, defaults to false.\n\t * @param options.extractRuleGroupId If provided will extract data from the document using the specified rule group id.\n\t * @param options.extractMimeType By default extraction will auto detect the mime type of the document, this can be used to override the detection.\n\t * @param cursor The cursor to get the next chunk of revisions.\n\t * @param limit Limit the number of items to return, defaults to 1 so only most recent is returned.\n\t * @returns The documents and revisions if requested, ordered by revision descending, cursor is set if there are more document revisions.\n\t */\n\tpublic async get(\n\t\tauditableItemGraphDocumentId: string,\n\t\toptions?: {\n\t\t\tincludeBlobStorageMetadata?: boolean;\n\t\t\tincludeBlobStorageData?: boolean;\n\t\t\tincludeAttestation?: boolean;\n\t\t\tincludeRemoved?: boolean;\n\t\t\tincludeDeletedEdges?: boolean;\n\t\t\textractRuleGroupId?: string;\n\t\t\textractMimeType?: string;\n\t\t},\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tentries: IDocumentList;\n\t\tcursor?: string;\n\t}> {\n\t\tUrn.guard(\n\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\tnameof(auditableItemGraphDocumentId),\n\t\t\tauditableItemGraphDocumentId\n\t\t);\n\n\t\ttry {\n\t\t\tconst documentVertex = await this._auditableItemGraphComponent.get(\n\t\t\t\tauditableItemGraphDocumentId,\n\t\t\t\t{\n\t\t\t\t\tincludeDeleted:\n\t\t\t\t\t\t(options?.includeRemoved ?? false) || (options?.includeDeletedEdges ?? false)\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// If we fetched deleted items to expose edges but the caller did not ask for deleted\n\t\t\t// documents, strip the deleted resources so they don't appear in the output.\n\t\t\tif ((options?.includeDeletedEdges ?? false) && !(options?.includeRemoved ?? false)) {\n\t\t\t\tdocumentVertex.resources = documentVertex.resources?.filter(r => Is.empty(r.dateDeleted));\n\t\t\t}\n\n\t\t\t// Populate the document and revisions with the options set\n\t\t\tconst documents = await this.getDocumentsFromVertex(documentVertex, options, cursor, limit);\n\n\t\t\tconst result = await JsonLdProcessor.compact(\n\t\t\t\tdocuments.entries,\n\t\t\t\tdocuments.entries[\"@context\"]\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tentries: result,\n\t\t\t\tcursor: documents.cursor\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (BaseError.someErrorName(error, nameof<NotFoundError>())) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new GeneralError(DocumentManagementService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get a document revision using it's auditable item graph vertex id.\n\t * @param auditableItemGraphDocumentId The auditable item graph vertex id which contains the document.\n\t * @param revision The revision id for the document.\n\t * @param options Additional options for the get operation.\n\t * @param options.includeBlobStorageMetadata Flag to include the blob storage metadata for the document, defaults to false.\n\t * @param options.includeBlobStorageData Flag to include the blob storage data for the document, defaults to false.\n\t * @param options.includeAttestation Flag to include the attestation information for the document, defaults to false.\n\t * @param options.extractRuleGroupId If provided will extract data from the document using the specified rule group id.\n\t * @param options.extractMimeType By default extraction will auto detect the mime type of the document, this can be used to override the detection.\n\t * @returns The document for the specified revision.\n\t */\n\tpublic async getRevision(\n\t\tauditableItemGraphDocumentId: string,\n\t\trevision: number,\n\t\toptions?: {\n\t\t\tincludeBlobStorageMetadata?: boolean;\n\t\t\tincludeBlobStorageData?: boolean;\n\t\t\tincludeAttestation?: boolean;\n\t\t\textractRuleGroupId?: string;\n\t\t\textractMimeType?: string;\n\t\t}\n\t): Promise<IDocument> {\n\t\tUrn.guard(\n\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\tnameof(auditableItemGraphDocumentId),\n\t\t\tauditableItemGraphDocumentId\n\t\t);\n\t\tGuards.integer(DocumentManagementService.CLASS_NAME, nameof(revision), revision);\n\n\t\ttry {\n\t\t\tconst documentVertex = await this._auditableItemGraphComponent.get(\n\t\t\t\tauditableItemGraphDocumentId,\n\t\t\t\t{ includeDeleted: true }\n\t\t\t);\n\n\t\t\tif (Is.empty(documentVertex.resources)) {\n\t\t\t\tthrow new NotFoundError(DocumentManagementService.CLASS_NAME, \"documentRevisionNone\");\n\t\t\t}\n\n\t\t\tdocumentVertex.resources = documentVertex.resources.filter(\n\t\t\t\td => d.resourceObject?.documentRevision === revision\n\t\t\t);\n\n\t\t\tif (documentVertex.resources.length === 0) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\t\t\t\"documentRevisionNotFound\",\n\t\t\t\t\trevision.toString()\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Populate the document and revisions with the options set\n\t\t\tconst docList = await this.getDocumentsFromVertex(documentVertex, options);\n\n\t\t\tconst result = await JsonLdProcessor.compact(\n\t\t\t\tdocList.entries.itemListElement[0],\n\t\t\t\tdocList.entries.itemListElement[0][\"@context\"]\n\t\t\t);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tif (BaseError.someErrorName(error, nameof<NotFoundError>())) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\t\t\"getRevisionFailed\",\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 an auditable item graph vertex using it's id.\n\t * The document dateDeleted will be set, but can still be queried with the includeRemoved flag.\n\t * @param auditableItemGraphDocumentId The auditable item graph vertex id which contains the document.\n\t * @param revision The revision of the document to remove.\n\t * @returns A promise that resolves when the revision has been removed.\n\t */\n\tpublic async removeRevision(\n\t\tauditableItemGraphDocumentId: string,\n\t\trevision: number\n\t): Promise<void> {\n\t\tUrn.guard(\n\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\tnameof(auditableItemGraphDocumentId),\n\t\t\tauditableItemGraphDocumentId\n\t\t);\n\t\tGuards.integer(DocumentManagementService.CLASS_NAME, nameof(revision), revision);\n\n\t\tawait Mutex.lock(auditableItemGraphDocumentId, { throwOnTimeout: true });\n\t\ttry {\n\t\t\tconst documentVertex = await this._auditableItemGraphComponent.get(\n\t\t\t\tauditableItemGraphDocumentId\n\t\t\t);\n\n\t\t\tif (Is.empty(documentVertex.resources)) {\n\t\t\t\tthrow new NotFoundError(DocumentManagementService.CLASS_NAME, \"documentRevisionNone\");\n\t\t\t}\n\n\t\t\tconst docRevisionIndex = documentVertex.resources.findIndex(\n\t\t\t\td => d.resourceObject?.documentRevision === revision\n\t\t\t);\n\n\t\t\tif (docRevisionIndex === -1) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\t\t\t\"documentRevisionNotFound\",\n\t\t\t\t\trevision.toString()\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst revisionResourceId =\n\t\t\t\t(documentVertex.resources[docRevisionIndex].resourceObject?.id as string | undefined) ??\n\t\t\t\t(documentVertex.resources[docRevisionIndex].resourceObject?.[\"@id\"] as string | undefined);\n\n\t\t\tif (!Is.stringValue(revisionResourceId)) {\n\t\t\t\t// The revision exists but its stored resource-id is unresolvable — integrity anomaly.\n\t\t\t\tthrow new GeneralError(DocumentManagementService.CLASS_NAME, \"documentRevisionMissingId\", {\n\t\t\t\t\trevision\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tawait this._auditableItemGraphComponent.updatePartial({\n\t\t\t\t\"@context\": [AuditableItemGraphContexts.Context, AuditableItemGraphContexts.ContextCommon],\n\t\t\t\tid: auditableItemGraphDocumentId,\n\t\t\t\tresourcePatches: { remove: [revisionResourceId] }\n\t\t\t});\n\t\t\tawait MetricHelper.metricIncrement(\n\t\t\t\tthis._telemetryComponent,\n\t\t\t\tDocumentManagementMetricIds.RevisionsRemoved\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (BaseError.someErrorName(error, nameof<NotFoundError>())) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tDocumentManagementService.CLASS_NAME,\n\t\t\t\t\"removeRevisionFailed\",\n\t\t\t\tundefined,\n\t\t\t\terror\n\t\t\t);\n\t\t} finally {\n\t\t\tMutex.unlock(auditableItemGraphDocumentId);\n\t\t}\n\t}\n\n\t/**\n\t * Find all the document with a specific id.\n\t * @param documentId The document id to find in the graph.\n\t * @param cursor The cursor to get the next chunk of documents.\n\t * @param limit The limit to get the next chunk of documents.\n\t * @returns The graph vertices that contain documents referencing the specified document id.\n\t */\n\tpublic async query(\n\t\tdocumentId: string,\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tentries: IAuditableItemGraphVertexList;\n\t\tcursor?: string;\n\t}> {\n\t\tGuards.stringValue(DocumentManagementService.CLASS_NAME, nameof(documentId), documentId);\n\n\t\ttry {\n\t\t\tconst result = await this._auditableItemGraphComponent.query(\n\t\t\t\t{\n\t\t\t\t\tid: documentId,\n\t\t\t\t\tidMode: \"both\",\n\t\t\t\t\tresourceTypes: [DocumentTypes.Document]\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\t[\"id\", \"dateCreated\", \"dateModified\", \"aliases\", \"annotationObject\", \"resources\", \"edges\"],\n\t\t\t\tcursor,\n\t\t\t\tlimit\n\t\t\t);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tif (BaseError.someErrorName(error, nameof<NotFoundError>())) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new GeneralError(DocumentManagementService.CLASS_NAME, \"queryFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Update the edges on connected vertices using non-destructive patch operations.\n\t * Uses updatePartial so AIG's per-vertex Mutex serialises concurrent callers.\n\t *\n\t * On the **create path** (`isCreatePath = true`) the method is fail-fast:\n\t * if any back-edge write fails (target vertex does not exist), all back-edges\n\t * already written in this call are removed (best-effort rollback) and the\n\t * failing target vertex ID is returned so the caller can surface a meaningful error.\n\t *\n\t * On the **update path** each missing vertex is caught individually; the remaining\n\t * updates continue and `undefined` is always returned.\n\t * @param auditableItemGraphDocumentId The document id to use.\n\t * @param edgesToAdd Connections to add — each connected vertex receives a new back-edge.\n\t * @param edgeTargetIdsToRemove Target vertex IDs to disconnect — their back-edges are removed.\n\t * @param documentId The document identifier.\n\t * @param documentIdFormat The format of the document identifier.\n\t * @param isCreatePath When true, enables fail-fast + rollback semantics.\n\t * @returns The failing target vertex ID when `isCreatePath` is true and a write fails;\n\t * `undefined` on success or when called from the update path.\n\t * @internal\n\t */\n\tprivate async updateConnectedEdges(\n\t\tauditableItemGraphDocumentId: string,\n\t\tedgesToAdd: IDocumentManagementEdgeEntry[],\n\t\tedgeTargetIdsToRemove: string[],\n\t\tdocumentId: string,\n\t\tdocumentIdFormat: string | undefined,\n\t\tisCreatePath: boolean = false\n\t): Promise<string | undefined> {\n\t\t// Track which target IDs received a successful back-edge write so we can roll back\n\t\t// if a later write fails (create path only).\n\t\tconst writtenTargetIds: string[] = [];\n\n\t\t// Add back-edges to each newly connected vertex.\n\t\tfor (const aigEdge of edgesToAdd) {\n\t\t\tconst partial: IAuditableItemGraphPartialVertex = {\n\t\t\t\t\"@context\": [AuditableItemGraphContexts.Context, AuditableItemGraphContexts.ContextCommon],\n\t\t\t\tid: aigEdge.targetId,\n\t\t\t\tedgePatches: {\n\t\t\t\t\tadd: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"@context\": AuditableItemGraphContexts.Context,\n\t\t\t\t\t\t\ttype: AuditableItemGraphTypes.Edge,\n\t\t\t\t\t\t\ttargetId: auditableItemGraphDocumentId,\n\t\t\t\t\t\t\tedgeRelationships: [\"document\"]\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\tif (aigEdge.addAlias) {\n\t\t\t\tpartial.aliasPatches = {\n\t\t\t\t\tadd: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"@context\": AuditableItemGraphContexts.Context,\n\t\t\t\t\t\t\ttype: AuditableItemGraphTypes.Alias,\n\t\t\t\t\t\t\tid: documentId,\n\t\t\t\t\t\t\taliasFormat: documentIdFormat,\n\t\t\t\t\t\t\tannotationObject: aigEdge.aliasAnnotationObject\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\tif (isCreatePath) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this._auditableItemGraphComponent.updatePartial(partial);\n\t\t\t\t\twrittenTargetIds.push(aigEdge.targetId);\n\t\t\t\t} catch {\n\t\t\t\t\t// Rollback all back-edges already written before this failure.\n\t\t\t\t\tawait this.rollbackConnectedEdges(\n\t\t\t\t\t\tauditableItemGraphDocumentId,\n\t\t\t\t\t\twrittenTargetIds,\n\t\t\t\t\t\tdocumentId\n\t\t\t\t\t);\n\t\t\t\t\treturn aigEdge.targetId;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tawait this._auditableItemGraphComponent.updatePartial(partial);\n\t\t\t\t} catch {\n\t\t\t\t\t// Best-effort on the update path — swallow to avoid interrupting remaining back-edge writes.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Remove back-edges from disconnected vertices.\n\t\tfor (const staleTargetId of edgeTargetIdsToRemove) {\n\t\t\t// Fetch to resolve the stored edge ID; the write is still Mutex-protected.\n\t\t\tconst connected = await this._auditableItemGraphComponent.get(staleTargetId);\n\n\t\t\tconst edgeId = connected.edges?.find(\n\t\t\t\te => Is.empty(e.dateDeleted) && e.targetId === auditableItemGraphDocumentId\n\t\t\t)?.id;\n\n\t\t\tconst hasAlias =\n\t\t\t\tIs.arrayValue(connected.aliases) &&\n\t\t\t\tconnected.aliases.some(a => Is.empty(a.dateDeleted) && a.id === documentId);\n\n\t\t\tconst partial: IAuditableItemGraphPartialVertex = {\n\t\t\t\t\"@context\": [AuditableItemGraphContexts.Context, AuditableItemGraphContexts.ContextCommon],\n\t\t\t\tid: staleTargetId\n\t\t\t};\n\n\t\t\tif (hasAlias) {\n\t\t\t\tpartial.aliasPatches = { remove: [documentId] };\n\t\t\t}\n\n\t\t\tif (Is.stringValue(edgeId)) {\n\t\t\t\tpartial.edgePatches = { remove: [edgeId] };\n\t\t\t}\n\n\t\t\tif (hasAlias || Is.stringValue(edgeId)) {\n\t\t\t\tawait this._auditableItemGraphComponent.updatePartial(partial);\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Best-effort removal of back-edges that were written during a failed create operation.\n\t * Errors are silently swallowed to avoid masking the original failure.\n\t * @param auditableItemGraphDocumentId The document vertex whose back-edges should be removed.\n\t * @param targetIds The connected vertex IDs that received a back-edge.\n\t * @param documentId The document identifier used for alias cleanup.\n\t * @internal\n\t */\n\tprivate async rollbackConnectedEdges(\n\t\tauditableItemGraphDocumentId: string,\n\t\ttargetIds: string[],\n\t\tdocumentId: string\n\t): Promise<void> {\n\t\tfor (const targetId of targetIds) {\n\t\t\ttry {\n\t\t\t\tconst connected = await this._auditableItemGraphComponent.get(targetId);\n\n\t\t\t\tconst edgeId = connected.edges?.find(\n\t\t\t\t\te => Is.empty(e.dateDeleted) && e.targetId === auditableItemGraphDocumentId\n\t\t\t\t)?.id;\n\n\t\t\t\tconst hasAlias =\n\t\t\t\t\tIs.arrayValue(connected.aliases) &&\n\t\t\t\t\tconnected.aliases.some(a => Is.empty(a.dateDeleted) && a.id === documentId);\n\n\t\t\t\tconst partial: IAuditableItemGraphPartialVertex = {\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],\n\t\t\t\t\tid: targetId\n\t\t\t\t};\n\n\t\t\t\tif (hasAlias) {\n\t\t\t\t\tpartial.aliasPatches = { remove: [documentId] };\n\t\t\t\t}\n\n\t\t\t\tif (Is.stringValue(edgeId)) {\n\t\t\t\t\tpartial.edgePatches = { remove: [edgeId] };\n\t\t\t\t}\n\n\t\t\t\tif (hasAlias || Is.stringValue(edgeId)) {\n\t\t\t\t\tawait this._auditableItemGraphComponent.updatePartial(partial);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Best-effort — do not let cleanup errors mask the original failure.\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get the documents from the auditable item graph vertex.\n\t * @param documentVertex The vertex containing the documents.\n\t * @param options Additional options for the get operation.\n\t * @param options.includeBlobStorageMetadata Flag to include the blob storage metadata for the document, defaults to false.\n\t * @param options.includeBlobStorageData Flag to include the blob storage data for the document, defaults to false.\n\t * @param options.includeAttestation Flag to include the attestation information for the document, defaults to false.\n\t * @param options.includeDeletedEdges Flag to include soft-deleted edges in the response, defaults to false.\n\t * @param options.extractRuleGroupId If provided will extract data from the document using the specified rule group id.\n\t * @param options.extractMimeType By default extraction will auto detect the mime type of the document, this can be used to override the detection.\n\t * @param cursor The cursor to get the next chunk of revisions.\n\t * @param limit Limit the number of items to return, defaults to 1 so only most recent is returned.\n\t * @returns The finalised list of documents.\n\t * @internal\n\t */\n\tprivate async getDocumentsFromVertex(\n\t\tdocumentVertex: IAuditableItemGraphVertex,\n\t\toptions?: {\n\t\t\tincludeBlobStorageMetadata?: boolean;\n\t\t\tincludeBlobStorageData?: boolean;\n\t\t\tincludeAttestation?: boolean;\n\t\t\tincludeDeletedEdges?: boolean;\n\t\t\textractRuleGroupId?: string;\n\t\t\textractMimeType?: string;\n\t\t},\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tentries: IDocumentList;\n\t\tcursor?: string;\n\t}> {\n\t\tconst docList: IDocumentList = {\n\t\t\t\"@context\": [\n\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\tDocumentContexts.Context,\n\t\t\t\tDocumentContexts.ContextCommon\n\t\t\t],\n\t\t\ttype: SchemaOrgTypes.ItemList,\n\t\t\t[SchemaOrgTypes.ItemListElement]: []\n\t\t};\n\n\t\tlet nextCursor: string | undefined;\n\n\t\tif (Is.arrayValue(documentVertex.resources)) {\n\t\t\t// Sort by newest revision first\n\t\t\tdocumentVertex.resources.sort(\n\t\t\t\t(a, b) =>\n\t\t\t\t\t(Coerce.number(b.resourceObject?.documentRevision) ?? 0) -\n\t\t\t\t\t(Coerce.number(a.resourceObject?.documentRevision) ?? 0)\n\t\t\t);\n\n\t\t\tconst startIndex = Coerce.integer(cursor) ?? 0;\n\t\t\tconst endIndex = Math.min(startIndex + (limit ?? 1), documentVertex.resources.length);\n\t\t\tconst slicedResources = documentVertex.resources.slice(startIndex, endIndex);\n\t\t\tnextCursor = documentVertex.resources.length > endIndex ? endIndex.toString() : undefined;\n\n\t\t\tconst includeBlobStorageMetadata = options?.includeBlobStorageMetadata ?? false;\n\t\t\tconst includeBlobStorageData = options?.includeBlobStorageData ?? false;\n\t\t\tconst includeAttestation = options?.includeAttestation ?? false;\n\t\t\tconst extractData = Is.stringValue(options?.extractRuleGroupId);\n\n\t\t\tfor (let i = 0; i < slicedResources.length; i++) {\n\t\t\t\tconst document = slicedResources[i].resourceObject as unknown as IDocument;\n\t\t\t\tif (Is.object(document)) {\n\t\t\t\t\tdocument.dateDeleted = slicedResources[i].dateDeleted;\n\n\t\t\t\t\tdocList[SchemaOrgTypes.ItemListElement].push(document);\n\n\t\t\t\t\tconst blobRequired = includeBlobStorageMetadata || includeBlobStorageData;\n\t\t\t\t\tif (blobRequired || extractData) {\n\t\t\t\t\t\tconst blobEntry = await this._blobStorageComponent.get(document.blobStorageId, {\n\t\t\t\t\t\t\tincludeContent: includeBlobStorageData || extractData\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (blobRequired) {\n\t\t\t\t\t\t\tdocument.blobStorageEntry = blobEntry;\n\t\t\t\t\t\t\tif (Is.object(document.blobStorageEntry)) {\n\t\t\t\t\t\t\t\tObjectHelper.propertyDelete(document.blobStorageEntry, \"@context\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!docList[\"@context\"].includes(BlobStorageContexts.Context)) {\n\t\t\t\t\t\t\t\tdocList[\"@context\"].push(BlobStorageContexts.Context);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (Is.stringValue(options?.extractRuleGroupId) && Is.stringValue(blobEntry.blob)) {\n\t\t\t\t\t\t\tconst binaryBlob = Converter.base64ToBytes(blobEntry.blob);\n\t\t\t\t\t\t\tdocument.extractedData = await this._dataProcessingComponent.extract(\n\t\t\t\t\t\t\t\toptions.extractRuleGroupId,\n\t\t\t\t\t\t\t\tbinaryBlob,\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\toptions?.extractMimeType\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If we have the blob data due to extraction but we weren't asked for it\n\t\t\t\t\t\t// then we remove it from the document\n\t\t\t\t\t\tif (!blobRequired) {\n\t\t\t\t\t\t\tdelete document.blobStorageEntry;\n\t\t\t\t\t\t} else if (!includeBlobStorageData) {\n\t\t\t\t\t\t\tdelete document.blobStorageEntry?.blob;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (includeAttestation && Is.stringValue(document.attestationId)) {\n\t\t\t\t\t\tconst attestationInformation = await this._attestationComponent.get(\n\t\t\t\t\t\t\tdocument.attestationId\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdocument.attestationInformation = attestationInformation;\n\t\t\t\t\t\tif (Is.object(document.attestationInformation)) {\n\t\t\t\t\t\t\tObjectHelper.propertyDelete(document.attestationInformation, \"@context\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (Is.arrayValue(documentVertex.edges)) {\n\t\t\tdocList.edges ??= [];\n\n\t\t\tfor (const edge of documentVertex.edges) {\n\t\t\t\tif (\n\t\t\t\t\tIs.object(edge) &&\n\t\t\t\t\t((options?.includeDeletedEdges ?? false) || Is.empty(edge.dateDeleted))\n\t\t\t\t) {\n\t\t\t\t\tdocList.edges.push(edge.targetId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tentries: docList,\n\t\t\tcursor: nextCursor\n\t\t};\n\t}\n\n\t/**\n\t * Create an attestation for the document.\n\t * @param document The document to create the attestation for.\n\t * @returns The attestation identifier.\n\t * @internal\n\t */\n\tprivate async createAttestation(document: IDocument): Promise<string> {\n\t\tconst documentAttestation: IDocumentAttestation & IJsonLdNodeObject = {\n\t\t\t\"@context\": [\n\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\tDocumentContexts.Context,\n\t\t\t\tDocumentContexts.ContextCommon\n\t\t\t],\n\t\t\ttype: DocumentTypes.DocumentAttestation,\n\t\t\tid: document.id,\n\t\t\tdocumentId: document.documentId,\n\t\t\tdocumentCode: document.documentCode,\n\t\t\tdocumentRevision: document.documentRevision,\n\t\t\tdateCreated: document.dateCreated,\n\t\t\tintegrity: document.integrity\n\t\t};\n\t\tconst attestationId = await this._attestationComponent.create(documentAttestation);\n\t\tawait MetricHelper.metricIncrement(\n\t\t\tthis._telemetryComponent,\n\t\t\tDocumentManagementMetricIds.AttestationsCreated\n\t\t);\n\t\treturn attestationId;\n\t}\n\n\t/**\n\t * Create a document id from the document id and revision.\n\t * @param documentId The document id to create.\n\t * @param revision The revision of the document.\n\t * @returns The document id.\n\t * @internal\n\t */\n\tprivate createDocumentId(documentId: string, revision: number): string {\n\t\tconst documentIdHash = Converter.bytesToBase64Url(\n\t\t\tSha256.sum256(Converter.utf8ToBytes(documentId))\n\t\t);\n\t\treturn `document:${documentIdHash}:${revision}`;\n\t}\n}\n"]}
@@ -1,4 +1,7 @@
1
1
  import { generateRestRoutesDocumentManagement, tagsDocumentManagement } from "./documentManagementRoutes.js";
2
+ /**
3
+ * REST entry points for the document management service.
4
+ */
2
5
  export const restEntryPoints = [
3
6
  {
4
7
  name: "document-management",
@@ -1 +1 @@
1
- {"version":3,"file":"restEntryPoints.js","sourceRoot":"","sources":["../../src/restEntryPoints.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,oCAAoC,EACpC,sBAAsB,EACtB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,CAAC,MAAM,eAAe,GAA2B;IACtD;QACC,IAAI,EAAE,qBAAqB;QAC3B,gBAAgB,EAAE,qBAAqB;QACvC,IAAI,EAAE,sBAAsB;QAC5B,cAAc,EAAE,oCAAoC;KACpD;CACD,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IRestRouteEntryPoint } from \"@twin.org/api-models\";\nimport {\n\tgenerateRestRoutesDocumentManagement,\n\ttagsDocumentManagement\n} from \"./documentManagementRoutes.js\";\n\nexport const restEntryPoints: IRestRouteEntryPoint[] = [\n\t{\n\t\tname: \"document-management\",\n\t\tdefaultBaseRoute: \"document-management\",\n\t\ttags: tagsDocumentManagement,\n\t\tgenerateRoutes: generateRestRoutesDocumentManagement\n\t}\n];\n"]}
1
+ {"version":3,"file":"restEntryPoints.js","sourceRoot":"","sources":["../../src/restEntryPoints.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,oCAAoC,EACpC,sBAAsB,EACtB,MAAM,+BAA+B,CAAC;AAEvC;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAA2B;IACtD;QACC,IAAI,EAAE,qBAAqB;QAC3B,gBAAgB,EAAE,qBAAqB;QACvC,IAAI,EAAE,sBAAsB;QAC5B,cAAc,EAAE,oCAAoC;KACpD;CACD,CAAC","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IRestRouteEntryPoint } from \"@twin.org/api-models\";\nimport {\n\tgenerateRestRoutesDocumentManagement,\n\ttagsDocumentManagement\n} from \"./documentManagementRoutes.js\";\n\n/**\n * REST entry points for the document management service.\n */\nexport const restEntryPoints: IRestRouteEntryPoint[] = [\n\t{\n\t\tname: \"document-management\",\n\t\tdefaultBaseRoute: \"document-management\",\n\t\ttags: tagsDocumentManagement,\n\t\tgenerateRoutes: generateRestRoutesDocumentManagement\n\t}\n];\n"]}
@@ -1,5 +1,5 @@
1
- import type { ICreatedResponse, IHttpRequestContext, INoContentResponse, IRestRoute, ITag } from "@twin.org/api-models";
2
- import { type IDocumentManagementGetRevisionRequest, type IDocumentManagementGetRevisionResponse, type IDocumentManagementCreateRequest, type IDocumentManagementGetRequest, type IDocumentManagementGetResponse, type IDocumentManagementQueryRequest, type IDocumentManagementQueryResponse, type IDocumentManagementRemoveRequest, type IDocumentManagementUpdateRequest } from "@twin.org/document-management-models";
1
+ import { type ICreatedResponse, type IHttpRequestContext, type INoContentResponse, type IRestRoute, type ITag } from "@twin.org/api-models";
2
+ import { type IDocumentManagementCreateRequest, type IDocumentManagementGetRequest, type IDocumentManagementGetResponse, type IDocumentManagementGetRevisionRequest, type IDocumentManagementGetRevisionResponse, type IDocumentManagementQueryRequest, type IDocumentManagementQueryResponse, type IDocumentManagementRemoveRequest, type IDocumentManagementUpdatePartialRequest } from "@twin.org/document-management-models";
3
3
  /**
4
4
  * The tag to associate with the routes.
5
5
  */
@@ -42,7 +42,7 @@ export declare function documentManagementGetRevision(httpRequestContext: IHttpR
42
42
  * @param request The request.
43
43
  * @returns The response object with additional http response properties.
44
44
  */
45
- export declare function documentManagementUpdate(httpRequestContext: IHttpRequestContext, componentName: string, request: IDocumentManagementUpdateRequest): Promise<INoContentResponse>;
45
+ export declare function documentManagementUpdatePartial(httpRequestContext: IHttpRequestContext, componentName: string, request: IDocumentManagementUpdatePartialRequest): Promise<INoContentResponse>;
46
46
  /**
47
47
  * Remove the document from the auditable item graph vertex.
48
48
  * @param httpRequestContext The request context for the API.
@@ -1,6 +1,6 @@
1
1
  import { type IAuditableItemGraphVertexList } from "@twin.org/auditable-item-graph-models";
2
2
  import { type IJsonLdNodeObject } from "@twin.org/data-json-ld";
3
- import { type IDocument, type IDocumentList, type IDocumentManagementComponent } from "@twin.org/document-management-models";
3
+ import { type IDocumentManagementEdgeEntry, type IDocument, type IDocumentList, type IDocumentManagementComponent } from "@twin.org/document-management-models";
4
4
  import { UneceDocumentCodeList } from "@twin.org/standards-unece";
5
5
  import type { IDocumentManagementServiceConstructorOptions } from "./models/IDocumentManagementStorageServiceConstructorOptions.js";
6
6
  /**
@@ -23,6 +23,7 @@ export declare class DocumentManagementService implements IDocumentManagementCom
23
23
  className(): string;
24
24
  /**
25
25
  * Register all document management metrics with the telemetry component.
26
+ * @returns A promise that resolves when metrics have been registered.
26
27
  */
27
28
  start(): Promise<void>;
28
29
  /**
@@ -41,11 +42,7 @@ export declare class DocumentManagementService implements IDocumentManagementCom
41
42
  * @param options.aliasAnnotationObject Annotation object for the alias.
42
43
  * @returns The auditable item graph vertex created for the document including its revision.
43
44
  */
44
- create(documentId: string, documentIdFormat: string | undefined, documentCode: UneceDocumentCodeList, blob: Uint8Array, annotationObject?: IJsonLdNodeObject, auditableItemGraphEdges?: {
45
- targetId: string;
46
- addAlias?: boolean;
47
- aliasAnnotationObject?: IJsonLdNodeObject;
48
- }[], options?: {
45
+ create(documentId: string, documentIdFormat: string | undefined, documentCode: UneceDocumentCodeList, blob: Uint8Array, annotationObject?: IJsonLdNodeObject, auditableItemGraphEdges?: IDocumentManagementEdgeEntry[], options?: {
49
46
  createAttestation?: boolean;
50
47
  addAlias?: boolean;
51
48
  aliasAnnotationObject?: IJsonLdNodeObject;
@@ -57,14 +54,19 @@ export declare class DocumentManagementService implements IDocumentManagementCom
57
54
  * @param auditableItemGraphDocumentId The auditable item graph vertex id which contains the document.
58
55
  * @param blob The data to update the document with.
59
56
  * @param annotationObject Additional information to associate with the document.
60
- * @param auditableItemGraphEdges The auditable item graph vertices to connect the document to, if undefined retains current connections.
61
- * @returns Nothing.
57
+ * @param auditableItemGraphEdges Explicit edge delta to apply. If undefined, existing connections
58
+ * are retained unchanged. Use `add` to create new connections and `remove` to disconnect existing
59
+ * ones by their target vertex id. To update alias metadata on an already-connected vertex, include
60
+ * it in `add` with the updated `aliasAnnotationObject` — AIG's alias patch is an upsert, so the
61
+ * alias is updated in place without creating a duplicate back-edge.
62
+ * @param auditableItemGraphEdges.add Connections to add; each creates a back-edge on the connected vertex.
63
+ * @param auditableItemGraphEdges.remove Target vertex IDs to disconnect; their back-edges are removed.
64
+ * @returns A promise that resolves when the document has been updated.
62
65
  */
63
- update(auditableItemGraphDocumentId: string, blob?: Uint8Array, annotationObject?: IJsonLdNodeObject, auditableItemGraphEdges?: {
64
- targetId: string;
65
- addAlias?: boolean;
66
- aliasAnnotationObject?: IJsonLdNodeObject;
67
- }[]): Promise<void>;
66
+ updatePartial(auditableItemGraphDocumentId: string, blob?: Uint8Array, annotationObject?: IJsonLdNodeObject, auditableItemGraphEdges?: {
67
+ add?: IDocumentManagementEdgeEntry[];
68
+ remove?: string[];
69
+ }): Promise<void>;
68
70
  /**
69
71
  * Get a document using it's auditable item graph vertex id and optional revision.
70
72
  * @param auditableItemGraphDocumentId The auditable item graph vertex id which contains the document.
@@ -73,6 +75,7 @@ export declare class DocumentManagementService implements IDocumentManagementCom
73
75
  * @param options.includeBlobStorageData Flag to include the blob storage data for the document, defaults to false.
74
76
  * @param options.includeAttestation Flag to include the attestation information for the document, defaults to false.
75
77
  * @param options.includeRemoved Flag to include deleted documents, defaults to false.
78
+ * @param options.includeDeletedEdges Flag to include soft-deleted edges in the response, defaults to false.
76
79
  * @param options.extractRuleGroupId If provided will extract data from the document using the specified rule group id.
77
80
  * @param options.extractMimeType By default extraction will auto detect the mime type of the document, this can be used to override the detection.
78
81
  * @param cursor The cursor to get the next chunk of revisions.
@@ -84,6 +87,7 @@ export declare class DocumentManagementService implements IDocumentManagementCom
84
87
  includeBlobStorageData?: boolean;
85
88
  includeAttestation?: boolean;
86
89
  includeRemoved?: boolean;
90
+ includeDeletedEdges?: boolean;
87
91
  extractRuleGroupId?: string;
88
92
  extractMimeType?: string;
89
93
  }, cursor?: string, limit?: number): Promise<{
@@ -100,7 +104,7 @@ export declare class DocumentManagementService implements IDocumentManagementCom
100
104
  * @param options.includeAttestation Flag to include the attestation information for the document, defaults to false.
101
105
  * @param options.extractRuleGroupId If provided will extract data from the document using the specified rule group id.
102
106
  * @param options.extractMimeType By default extraction will auto detect the mime type of the document, this can be used to override the detection.
103
- * @returns The documents and revisions if requested, ordered by revision descending, cursor is set if there are more document revisions.
107
+ * @returns The document for the specified revision.
104
108
  */
105
109
  getRevision(auditableItemGraphDocumentId: string, revision: number, options?: {
106
110
  includeBlobStorageMetadata?: boolean;
@@ -114,7 +118,7 @@ export declare class DocumentManagementService implements IDocumentManagementCom
114
118
  * The document dateDeleted will be set, but can still be queried with the includeRemoved flag.
115
119
  * @param auditableItemGraphDocumentId The auditable item graph vertex id which contains the document.
116
120
  * @param revision The revision of the document to remove.
117
- * @returns Nothing.
121
+ * @returns A promise that resolves when the revision has been removed.
118
122
  */
119
123
  removeRevision(auditableItemGraphDocumentId: string, revision: number): Promise<void>;
120
124
  /**
@@ -128,10 +132,4 @@ export declare class DocumentManagementService implements IDocumentManagementCom
128
132
  entries: IAuditableItemGraphVertexList;
129
133
  cursor?: string;
130
134
  }>;
131
- /**
132
- * Create an attestation for the document.
133
- * @param document The document to create the attestation for.
134
- * @returns The attestation identifier.
135
- */
136
- private createAttestation;
137
135
  }
@@ -1,2 +1,5 @@
1
1
  import type { IRestRouteEntryPoint } from "@twin.org/api-models";
2
+ /**
3
+ * REST entry points for the document management service.
4
+ */
2
5
  export declare const restEntryPoints: IRestRouteEntryPoint[];
package/docs/changelog.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.0.3-next.17](https://github.com/iotaledger/twin-document-management/compare/document-management-service-v0.0.3-next.16...document-management-service-v0.0.3-next.17) (2026-06-18)
4
+
5
+
6
+ ### Features
7
+
8
+ * remove hosting component ([#53](https://github.com/iotaledger/twin-document-management/issues/53)) ([2ec9d91](https://github.com/iotaledger/twin-document-management/commit/2ec9d91170ade5aaa732a05af685ae93f362bb16))
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * use async getStore in tests ([8e16a85](https://github.com/iotaledger/twin-document-management/commit/8e16a858a4916d57a19dfa8fa42c0a92632b9f39))
14
+ * use async getStore in tests ([e9a7ecd](https://github.com/iotaledger/twin-document-management/commit/e9a7ecdc1f1f5bb3e46fe3499667eaee4c67012f))
15
+
16
+
17
+ ### Dependencies
18
+
19
+ * The following workspace dependencies were updated
20
+ * dependencies
21
+ * @twin.org/document-management-models bumped from 0.0.3-next.16 to 0.0.3-next.17
22
+
23
+ ## [0.0.3-next.16](https://github.com/iotaledger/twin-document-management/compare/document-management-service-v0.0.3-next.15...document-management-service-v0.0.3-next.16) (2026-06-04)
24
+
25
+
26
+ ### Bug Fixes
27
+
28
+ * replace destructive update() with updatePartial() for edge linking ([#50](https://github.com/iotaledger/twin-document-management/issues/50)) ([c1d2c33](https://github.com/iotaledger/twin-document-management/commit/c1d2c337c371bdcc1f23cac482393468ef84f0d7))
29
+
30
+
31
+ ### Dependencies
32
+
33
+ * The following workspace dependencies were updated
34
+ * dependencies
35
+ * @twin.org/document-management-models bumped from 0.0.3-next.15 to 0.0.3-next.16
36
+
3
37
  ## [0.0.3-next.15](https://github.com/iotaledger/twin-document-management/compare/document-management-service-v0.0.3-next.14...document-management-service-v0.0.3-next.15) (2026-05-22)
4
38
 
5
39