@twin.org/federated-catalogue-service 0.0.3-next.3 → 0.0.3-next.4

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":"dataset.js","sourceRoot":"","sources":["../../../src/entities/dataset.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { entity, property } from \"@twin.org/entity\";\nimport type { IDataset } from \"@twin.org/standards-w3c-dcat\";\n\n/**\n * Class describing a DCAT dataset for entity storage.\n * This wrapper enables efficient database indexing and querying while preserving\n * the full IDataset JSON-LD structure.\n */\n@entity()\nexport class Dataset {\n\t/**\n\t * The unique identifier for the dataset (@id from JSON-LD).\n\t */\n\t@property({ type: \"string\", isPrimary: true })\n\tpublic \"@id\"!: string;\n\n\t/**\n\t * The JSON-LD context for the dataset.\n\t */\n\t@property({ type: \"object\" })\n\tpublic \"@context\"!: IDataset[\"@context\"];\n\n\t/**\n\t * The type of the resource (typically \"Dataset\").\n\t */\n\t@property({ type: \"string\" })\n\tpublic \"@type\"!: IDataset[\"@type\"];\n\n\t/**\n\t * A name given to the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:title\"?: IDataset[\"dcterms:title\"];\n\n\t/**\n\t * A free-text account of the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:description\"?: IDataset[\"dcterms:description\"];\n\n\t/**\n\t * A unique identifier of the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:identifier\"?: IDataset[\"dcterms:identifier\"];\n\n\t/**\n\t * Date of formal issuance (publication) of the resource.\n\t */\n\t@property({ type: \"string\", optional: true })\n\tpublic \"dcterms:issued\"?: IDataset[\"dcterms:issued\"];\n\n\t/**\n\t * Most recent date on which the resource was changed, updated or modified.\n\t */\n\t@property({ type: \"string\", optional: true })\n\tpublic \"dcterms:modified\"?: IDataset[\"dcterms:modified\"];\n\n\t/**\n\t * A language of the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:language\"?: IDataset[\"dcterms:language\"];\n\n\t/**\n\t * An entity responsible for making the resource available.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:publisher\"?: IDataset[\"dcterms:publisher\"];\n\n\t/**\n\t * An entity responsible for producing the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:creator\"?: IDataset[\"dcterms:creator\"];\n\n\t/**\n\t * Information about who can access the resource or an indication of its security status.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:accessRights\"?: IDataset[\"dcterms:accessRights\"];\n\n\t/**\n\t * A legal document under which the resource is made available.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:license\"?: IDataset[\"dcterms:license\"];\n\n\t/**\n\t * Information about rights held in and over the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:rights\"?: IDataset[\"dcterms:rights\"];\n\n\t/**\n\t * An established standard to which the resource conforms.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:conformsTo\"?: IDataset[\"dcterms:conformsTo\"];\n\n\t/**\n\t * The nature or genre of the resource.\n\t */\n\t@property({ type: \"string\", optional: true })\n\tpublic \"dcterms:type\"?: IDataset[\"dcterms:type\"];\n\n\t/**\n\t * Relevant contact information for the catalogued resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcat:contactPoint\"?: IDataset[\"dcat:contactPoint\"];\n\n\t/**\n\t * A keyword or tag describing the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcat:keyword\"?: IDataset[\"dcat:keyword\"];\n\n\t/**\n\t * A main category of the resource. A resource can have multiple themes.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcat:theme\"?: IDataset[\"dcat:theme\"];\n\n\t/**\n\t * A Web page that can be navigated to gain access to the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcat:landingPage\"?: IDataset[\"dcat:landingPage\"];\n\n\t/**\n\t * Link to a description of a relationship with another resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcat:qualifiedRelation\"?: IDataset[\"dcat:qualifiedRelation\"];\n\n\t/**\n\t * An ODRL conformant policy expressing the rights associated with the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"odrl:hasPolicy\"?: IDataset[\"odrl:hasPolicy\"];\n\n\t/**\n\t * An available distribution of the dataset.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcat:distribution\"?: IDataset[\"dcat:distribution\"];\n\n\t/**\n\t * The frequency at which the dataset is published.\n\t */\n\t@property({ type: \"string\", optional: true })\n\tpublic \"dcterms:accrualPeriodicity\"?: IDataset[\"dcterms:accrualPeriodicity\"];\n\n\t/**\n\t * A dataset series of which the dataset is part.\n\t */\n\t@property({ type: \"string\", optional: true })\n\tpublic \"dcat:inSeries\"?: IDataset[\"dcat:inSeries\"];\n\n\t/**\n\t * The geographical area covered by the dataset.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:spatial\"?: IDataset[\"dcterms:spatial\"];\n\n\t/**\n\t * Minimum spatial separation resolvable in a dataset, measured in meters.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcat:spatialResolutionInMeters\"?: IDataset[\"dcat:spatialResolutionInMeters\"];\n\n\t/**\n\t * The temporal period that the dataset covers.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:temporal\"?: IDataset[\"dcterms:temporal\"];\n\n\t/**\n\t * Minimum time period resolvable in the dataset.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcat:temporalResolution\"?: IDataset[\"dcat:temporalResolution\"];\n\n\t/**\n\t * An activity that generated, or provides the business context for, the creation of the dataset.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"prov:wasGeneratedBy\"?: IDataset[\"prov:wasGeneratedBy\"];\n}\n"]}
1
+ {"version":3,"file":"dataset.js","sourceRoot":"","sources":["../../../src/entities/dataset.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { entity, property } from \"@twin.org/entity\";\nimport type { IDcatDataset } from \"@twin.org/standards-w3c-dcat\";\n\n/**\n * Class describing a DCAT dataset for entity storage.\n * This wrapper enables efficient database indexing and querying while preserving\n * the full IDataset JSON-LD structure.\n */\n@entity()\nexport class Dataset {\n\t/**\n\t * The unique identifier for the dataset (@id from JSON-LD).\n\t */\n\t@property({ type: \"string\", isPrimary: true })\n\tpublic \"@id\"!: string;\n\n\t/**\n\t * The JSON-LD context for the dataset.\n\t */\n\t@property({ type: \"object\" })\n\tpublic \"@context\"!: IDcatDataset[\"@context\"];\n\n\t/**\n\t * The type of the resource (typically \"Dataset\").\n\t */\n\t@property({ type: \"string\" })\n\tpublic \"@type\"!: IDcatDataset[\"@type\"];\n\n\t/**\n\t * A name given to the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:title\"?: IDcatDataset[\"dcterms:title\"];\n\n\t/**\n\t * A free-text account of the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:description\"?: IDcatDataset[\"dcterms:description\"];\n\n\t/**\n\t * A unique identifier of the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:identifier\"?: IDcatDataset[\"dcterms:identifier\"];\n\n\t/**\n\t * Date of formal issuance (publication) of the resource.\n\t */\n\t@property({ type: \"string\", optional: true })\n\tpublic \"dcterms:issued\"?: IDcatDataset[\"dcterms:issued\"];\n\n\t/**\n\t * Most recent date on which the resource was changed, updated or modified.\n\t */\n\t@property({ type: \"string\", optional: true })\n\tpublic \"dcterms:modified\"?: IDcatDataset[\"dcterms:modified\"];\n\n\t/**\n\t * A language of the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:language\"?: IDcatDataset[\"dcterms:language\"];\n\n\t/**\n\t * An entity responsible for making the resource available.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:publisher\"?: IDcatDataset[\"dcterms:publisher\"];\n\n\t/**\n\t * An entity responsible for producing the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:creator\"?: IDcatDataset[\"dcterms:creator\"];\n\n\t/**\n\t * Information about who can access the resource or an indication of its security status.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:accessRights\"?: IDcatDataset[\"dcterms:accessRights\"];\n\n\t/**\n\t * A legal document under which the resource is made available.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:license\"?: IDcatDataset[\"dcterms:license\"];\n\n\t/**\n\t * Information about rights held in and over the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:rights\"?: IDcatDataset[\"dcterms:rights\"];\n\n\t/**\n\t * An established standard to which the resource conforms.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:conformsTo\"?: IDcatDataset[\"dcterms:conformsTo\"];\n\n\t/**\n\t * The nature or genre of the resource.\n\t */\n\t@property({ type: \"string\", optional: true })\n\tpublic \"dcterms:type\"?: IDcatDataset[\"dcterms:type\"];\n\n\t/**\n\t * Relevant contact information for the catalogued resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcat:contactPoint\"?: IDcatDataset[\"dcat:contactPoint\"];\n\n\t/**\n\t * A keyword or tag describing the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcat:keyword\"?: IDcatDataset[\"dcat:keyword\"];\n\n\t/**\n\t * A main category of the resource. A resource can have multiple themes.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcat:theme\"?: IDcatDataset[\"dcat:theme\"];\n\n\t/**\n\t * A Web page that can be navigated to gain access to the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcat:landingPage\"?: IDcatDataset[\"dcat:landingPage\"];\n\n\t/**\n\t * Link to a description of a relationship with another resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcat:qualifiedRelation\"?: IDcatDataset[\"dcat:qualifiedRelation\"];\n\n\t/**\n\t * An ODRL conformant policy expressing the rights associated with the resource.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"odrl:hasPolicy\"?: IDcatDataset[\"odrl:hasPolicy\"];\n\n\t/**\n\t * An available distribution of the dataset.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcat:distribution\"?: IDcatDataset[\"dcat:distribution\"];\n\n\t/**\n\t * The frequency at which the dataset is published.\n\t */\n\t@property({ type: \"string\", optional: true })\n\tpublic \"dcterms:accrualPeriodicity\"?: IDcatDataset[\"dcterms:accrualPeriodicity\"];\n\n\t/**\n\t * A dataset series of which the dataset is part.\n\t */\n\t@property({ type: \"string\", optional: true })\n\tpublic \"dcat:inSeries\"?: IDcatDataset[\"dcat:inSeries\"];\n\n\t/**\n\t * The geographical area covered by the dataset.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:spatial\"?: IDcatDataset[\"dcterms:spatial\"];\n\n\t/**\n\t * Minimum spatial separation resolvable in a dataset, measured in meters.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcat:spatialResolutionInMeters\"?: IDcatDataset[\"dcat:spatialResolutionInMeters\"];\n\n\t/**\n\t * The temporal period that the dataset covers.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcterms:temporal\"?: IDcatDataset[\"dcterms:temporal\"];\n\n\t/**\n\t * Minimum time period resolvable in the dataset.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"dcat:temporalResolution\"?: IDcatDataset[\"dcat:temporalResolution\"];\n\n\t/**\n\t * An activity that generated, or provides the business context for, the creation of the dataset.\n\t */\n\t@property({ type: \"object\", optional: true })\n\tpublic \"prov:wasGeneratedBy\"?: IDcatDataset[\"prov:wasGeneratedBy\"];\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { ComponentFactory, Guards } from "@twin.org/core";
2
2
  import { FederatedCatalogueContexts } from "@twin.org/federated-catalogue-models";
3
- import { CatalogTypes, DataspaceProtocolContexts } from "@twin.org/standards-dataspace-protocol";
3
+ import { DataspaceProtocolCatalogTypes, DataspaceProtocolContexts } from "@twin.org/standards-dataspace-protocol";
4
4
  import { DublinCoreContexts } from "@twin.org/standards-dublin-core";
5
5
  import { DcatClasses, DcatContexts } from "@twin.org/standards-w3c-dcat";
6
6
  /**
@@ -38,7 +38,7 @@ export function generateRestRoutesFederatedCatalogue(baseRouteName, componentNam
38
38
  request: {
39
39
  body: {
40
40
  "@context": [DataspaceProtocolContexts.ContextRoot],
41
- "@type": CatalogTypes.CatalogRequestMessage,
41
+ "@type": DataspaceProtocolCatalogTypes.CatalogRequestMessage,
42
42
  filter: [
43
43
  {
44
44
  "dcterms:title": "Energy Consumption Data"
@@ -52,7 +52,7 @@ export function generateRestRoutesFederatedCatalogue(baseRouteName, componentNam
52
52
  request: {
53
53
  body: {
54
54
  "@context": [DataspaceProtocolContexts.ContextRoot],
55
- "@type": CatalogTypes.CatalogRequestMessage
55
+ "@type": DataspaceProtocolCatalogTypes.CatalogRequestMessage
56
56
  }
57
57
  }
58
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"federatedCatalogueRoutes.js","sourceRoot":"","sources":["../../src/federatedCatalogueRoutes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IHttpRequestContext, IRestRoute, ITag } from \"@twin.org/api-models\";\nimport { ComponentFactory, Guards } from \"@twin.org/core\";\nimport type { IJsonLdContextDefinitionRoot } from \"@twin.org/data-json-ld\";\nimport type {\n\tICatalogRequestRequest,\n\tICatalogRequestResponse,\n\tIFederatedCatalogueComponent,\n\tIGetDatasetRequest,\n\tIGetDatasetResponse\n} from \"@twin.org/federated-catalogue-models\";\nimport { FederatedCatalogueContexts } from \"@twin.org/federated-catalogue-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { CatalogTypes, DataspaceProtocolContexts } from \"@twin.org/standards-dataspace-protocol\";\nimport { DublinCoreContexts } from \"@twin.org/standards-dublin-core\";\nimport { DcatClasses, DcatContexts, type DcatContextType } from \"@twin.org/standards-w3c-dcat\";\n\n/**\n * The source used when communicating about these routes.\n */\nconst ROUTES_SOURCE = \"federatedCatalogueRoutes\";\n\n/**\n * The tag to associate with the routes.\n */\nexport const tagsFederatedCatalogue: ITag[] = [\n\t{\n\t\tname: \"Federated Catalogue\",\n\t\tdescription:\n\t\t\t\"Service providing Dataspace Protocol-compliant catalogue endpoints for dataset discovery and query.\"\n\t}\n];\n\n/**\n * The REST routes for federated catalogue.\n * @param baseRouteName Prefix to prepend to the paths.\n * @param componentName The name of the component to use in the routes stored in the ComponentFactory.\n * @returns The generated routes.\n */\nexport function generateRestRoutesFederatedCatalogue(\n\tbaseRouteName: string,\n\tcomponentName: string\n): IRestRoute[] {\n\tconst catalogRequestRoute: IRestRoute<ICatalogRequestRequest, ICatalogRequestResponse> = {\n\t\toperationId: \"catalogRequest\",\n\t\tsummary: \"Query the federated catalogue for datasets\",\n\t\ttag: tagsFederatedCatalogue[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/request`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tcatalogRequest(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<ICatalogRequestRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"catalogRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\"@context\": [DataspaceProtocolContexts.ContextRoot],\n\t\t\t\t\t\t\t\"@type\": CatalogTypes.CatalogRequestMessage,\n\t\t\t\t\t\t\tfilter: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"dcterms:title\": \"Energy Consumption Data\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"catalogRequestNoFilterExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\"@context\": [DataspaceProtocolContexts.ContextRoot],\n\t\t\t\t\t\t\t\"@type\": CatalogTypes.CatalogRequestMessage\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\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<ICatalogRequestResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"catalogRequestResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\t\t\tDataspaceProtocolContexts.ContextRoot,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tdcat: DcatContexts.ContextRoot,\n\t\t\t\t\t\t\t\t\t\tdcterms: DublinCoreContexts.ContextTerms,\n\t\t\t\t\t\t\t\t\t\tcursor: `${FederatedCatalogueContexts.ContextRoot}cursor`\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t] as IJsonLdContextDefinitionRoot as DcatContextType,\n\t\t\t\t\t\t\t\t\"@id\":\n\t\t\t\t\t\t\t\t\t\"urn:x-catalog:a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6a7b8c9d0e1f2\",\n\t\t\t\t\t\t\t\t\"@type\": DcatClasses.Catalog,\n\t\t\t\t\t\t\t\tparticipantId: \"did:example:node-identity-123\",\n\t\t\t\t\t\t\t\t\"dcat:dataset\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"@id\": \"urn:uuid:dataset-123\",\n\t\t\t\t\t\t\t\t\t\t\"@type\": DcatClasses.Dataset,\n\t\t\t\t\t\t\t\t\t\t\"dcterms:title\": \"Energy Consumption Data\",\n\t\t\t\t\t\t\t\t\t\t\"dcterms:description\": \"Historical energy consumption data\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t}\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\t};\n\n\tconst getDatasetRoute: IRestRoute<IGetDatasetRequest, IGetDatasetResponse> = {\n\t\toperationId: \"getDataset\",\n\t\tsummary: \"Retrieve a specific dataset by ID\",\n\t\ttag: tagsFederatedCatalogue[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/datasets/:datasetId`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tgetDataset(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IGetDatasetRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"getDatasetRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tdatasetId: \"urn:uuid:dataset-123\"\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\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<IGetDatasetResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"getDatasetResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\t\t\tDataspaceProtocolContexts.ContextRoot,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tdcat: DcatContexts.ContextRoot,\n\t\t\t\t\t\t\t\t\t\tdcterms: DublinCoreContexts.ContextTerms\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t] as IJsonLdContextDefinitionRoot as DcatContextType,\n\t\t\t\t\t\t\t\t\"@id\": \"urn:uuid:dataset-123\",\n\t\t\t\t\t\t\t\t\"@type\": DcatClasses.Dataset,\n\t\t\t\t\t\t\t\t\"dcterms:title\": \"Energy Consumption Data\",\n\t\t\t\t\t\t\t\t\"dcterms:description\": \"Historical energy consumption data\"\n\t\t\t\t\t\t\t}\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\t};\n\n\treturn [catalogRequestRoute, getDatasetRoute];\n}\n\n/**\n * Handle the catalog request operation.\n * @param httpRequestContext The request context for the operation.\n * @param componentName The name of the component to use.\n * @param request The request.\n * @returns The response.\n */\nasync function catalogRequest(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ICatalogRequestRequest\n): Promise<ICatalogRequestResponse> {\n\tGuards.object<ICatalogRequestRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst component: IFederatedCatalogueComponent = ComponentFactory.get(componentName);\n\n\tconst filter = request.body.filter;\n\n\tconst catalog = await component.query(filter);\n\n\t// Add participantId from nodeIdentity (the node providing the catalog)\n\tconst nodeIdentity = (httpRequestContext as { nodeIdentity?: string }).nodeIdentity;\n\tif (nodeIdentity) {\n\t\t(catalog as { participantId?: string }).participantId = nodeIdentity;\n\t}\n\n\treturn {\n\t\tbody: catalog\n\t};\n}\n\n/**\n * Handle the get dataset operation.\n * @param httpRequestContext The request context for the operation.\n * @param componentName The name of the component to use.\n * @param request The request.\n * @returns The response.\n */\nasync function getDataset(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IGetDatasetRequest\n): Promise<IGetDatasetResponse> {\n\tGuards.object<IGetDatasetRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.pathParams), request.pathParams);\n\tGuards.stringValue(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams.datasetId),\n\t\trequest.pathParams.datasetId\n\t);\n\n\tconst component: IFederatedCatalogueComponent = ComponentFactory.get(componentName);\n\n\tconst dataset = await component.get(request.pathParams.datasetId);\n\n\treturn {\n\t\tbody: dataset\n\t};\n}\n"]}
1
+ {"version":3,"file":"federatedCatalogueRoutes.js","sourceRoot":"","sources":["../../src/federatedCatalogueRoutes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IHttpRequestContext, IRestRoute, ITag } from \"@twin.org/api-models\";\nimport { ComponentFactory, Guards } from \"@twin.org/core\";\nimport type { IJsonLdContextDefinitionRoot } from \"@twin.org/data-json-ld\";\nimport type {\n\tICatalogRequestRequest,\n\tICatalogRequestResponse,\n\tIFederatedCatalogueComponent,\n\tIGetDatasetRequest,\n\tIGetDatasetResponse\n} from \"@twin.org/federated-catalogue-models\";\nimport { FederatedCatalogueContexts } from \"@twin.org/federated-catalogue-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { DataspaceProtocolCatalogTypes, DataspaceProtocolContexts } from \"@twin.org/standards-dataspace-protocol\";\nimport { DublinCoreContexts } from \"@twin.org/standards-dublin-core\";\nimport { DcatClasses, DcatContexts, type DcatContextType } from \"@twin.org/standards-w3c-dcat\";\n\n/**\n * The source used when communicating about these routes.\n */\nconst ROUTES_SOURCE = \"federatedCatalogueRoutes\";\n\n/**\n * The tag to associate with the routes.\n */\nexport const tagsFederatedCatalogue: ITag[] = [\n\t{\n\t\tname: \"Federated Catalogue\",\n\t\tdescription:\n\t\t\t\"Service providing Dataspace Protocol-compliant catalogue endpoints for dataset discovery and query.\"\n\t}\n];\n\n/**\n * The REST routes for federated catalogue.\n * @param baseRouteName Prefix to prepend to the paths.\n * @param componentName The name of the component to use in the routes stored in the ComponentFactory.\n * @returns The generated routes.\n */\nexport function generateRestRoutesFederatedCatalogue(\n\tbaseRouteName: string,\n\tcomponentName: string\n): IRestRoute[] {\n\tconst catalogRequestRoute: IRestRoute<ICatalogRequestRequest, ICatalogRequestResponse> = {\n\t\toperationId: \"catalogRequest\",\n\t\tsummary: \"Query the federated catalogue for datasets\",\n\t\ttag: tagsFederatedCatalogue[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/request`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tcatalogRequest(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<ICatalogRequestRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"catalogRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\"@context\": [DataspaceProtocolContexts.ContextRoot],\n\t\t\t\t\t\t\t\"@type\": DataspaceProtocolCatalogTypes.CatalogRequestMessage,\n\t\t\t\t\t\t\tfilter: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"dcterms:title\": \"Energy Consumption Data\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"catalogRequestNoFilterExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\"@context\": [DataspaceProtocolContexts.ContextRoot],\n\t\t\t\t\t\t\t\"@type\": DataspaceProtocolCatalogTypes.CatalogRequestMessage\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\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<ICatalogRequestResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"catalogRequestResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\t\t\tDataspaceProtocolContexts.ContextRoot,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tdcat: DcatContexts.ContextRoot,\n\t\t\t\t\t\t\t\t\t\tdcterms: DublinCoreContexts.ContextTerms,\n\t\t\t\t\t\t\t\t\t\tcursor: `${FederatedCatalogueContexts.ContextRoot}cursor`\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t] as IJsonLdContextDefinitionRoot as DcatContextType,\n\t\t\t\t\t\t\t\t\"@id\":\n\t\t\t\t\t\t\t\t\t\"urn:x-catalog:a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6a7b8c9d0e1f2\",\n\t\t\t\t\t\t\t\t\"@type\": DcatClasses.Catalog,\n\t\t\t\t\t\t\t\tparticipantId: \"did:example:node-identity-123\",\n\t\t\t\t\t\t\t\t\"dcat:dataset\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"@id\": \"urn:uuid:dataset-123\",\n\t\t\t\t\t\t\t\t\t\t\"@type\": DcatClasses.Dataset,\n\t\t\t\t\t\t\t\t\t\t\"dcterms:title\": \"Energy Consumption Data\",\n\t\t\t\t\t\t\t\t\t\t\"dcterms:description\": \"Historical energy consumption data\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t}\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\t};\n\n\tconst getDatasetRoute: IRestRoute<IGetDatasetRequest, IGetDatasetResponse> = {\n\t\toperationId: \"getDataset\",\n\t\tsummary: \"Retrieve a specific dataset by ID\",\n\t\ttag: tagsFederatedCatalogue[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/datasets/:datasetId`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tgetDataset(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IGetDatasetRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"getDatasetRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tdatasetId: \"urn:uuid:dataset-123\"\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\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<IGetDatasetResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"getDatasetResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\t\t\tDataspaceProtocolContexts.ContextRoot,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tdcat: DcatContexts.ContextRoot,\n\t\t\t\t\t\t\t\t\t\tdcterms: DublinCoreContexts.ContextTerms\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t] as IJsonLdContextDefinitionRoot as DcatContextType,\n\t\t\t\t\t\t\t\t\"@id\": \"urn:uuid:dataset-123\",\n\t\t\t\t\t\t\t\t\"@type\": DcatClasses.Dataset,\n\t\t\t\t\t\t\t\t\"dcterms:title\": \"Energy Consumption Data\",\n\t\t\t\t\t\t\t\t\"dcterms:description\": \"Historical energy consumption data\"\n\t\t\t\t\t\t\t}\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\t};\n\n\treturn [catalogRequestRoute, getDatasetRoute];\n}\n\n/**\n * Handle the catalog request operation.\n * @param httpRequestContext The request context for the operation.\n * @param componentName The name of the component to use.\n * @param request The request.\n * @returns The response.\n */\nasync function catalogRequest(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ICatalogRequestRequest\n): Promise<ICatalogRequestResponse> {\n\tGuards.object<ICatalogRequestRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst component: IFederatedCatalogueComponent = ComponentFactory.get(componentName);\n\n\tconst filter = request.body.filter;\n\n\tconst catalog = await component.query(filter);\n\n\t// Add participantId from nodeIdentity (the node providing the catalog)\n\tconst nodeIdentity = (httpRequestContext as { nodeIdentity?: string }).nodeIdentity;\n\tif (nodeIdentity) {\n\t\t(catalog as { participantId?: string }).participantId = nodeIdentity;\n\t}\n\n\treturn {\n\t\tbody: catalog\n\t};\n}\n\n/**\n * Handle the get dataset operation.\n * @param httpRequestContext The request context for the operation.\n * @param componentName The name of the component to use.\n * @param request The request.\n * @returns The response.\n */\nasync function getDataset(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IGetDatasetRequest\n): Promise<IGetDatasetResponse> {\n\tGuards.object<IGetDatasetRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.pathParams), request.pathParams);\n\tGuards.stringValue(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams.datasetId),\n\t\trequest.pathParams.datasetId\n\t);\n\n\tconst component: IFederatedCatalogueComponent = ComponentFactory.get(componentName);\n\n\tconst dataset = await component.get(request.pathParams.datasetId);\n\n\treturn {\n\t\tbody: dataset\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"federatedCatalogueService.js","sourceRoot":"","sources":["../../../src/services/federatedCatalogueService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tBaseError,\n\tComponentFactory,\n\tConverter,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tNotFoundError,\n\tObjectHelper\n} from \"@twin.org/core\";\nimport { Blake2b } from \"@twin.org/crypto\";\nimport { type IJsonLdContextDefinitionRoot, JsonLdProcessor } from \"@twin.org/data-json-ld\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport type {\n\tIBaseFilter,\n\tIFederatedCatalogueComponent\n} from \"@twin.org/federated-catalogue-models\";\nimport {\n\tFederatedCatalogueContexts,\n\tFederatedCatalogueFilterFactory\n} from \"@twin.org/federated-catalogue-models\";\nimport type { ILoggingComponent } from \"@twin.org/logging-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport {\n\tDataspaceProtocolContexts,\n\tDataspaceProtocolDataTypes\n} from \"@twin.org/standards-dataspace-protocol\";\nimport { DublinCoreContexts, DublinCoreDataTypes } from \"@twin.org/standards-dublin-core\";\nimport { FoafDataTypes } from \"@twin.org/standards-foaf\";\nimport {\n\tDcatClasses,\n\tDcatContexts,\n\ttype DcatContextType,\n\tDcatDataTypes,\n\ttype ICatalog,\n\ttype IDataset\n} from \"@twin.org/standards-w3c-dcat\";\nimport type { Dataset } from \"../entities/dataset.js\";\nimport type { IFederatedCatalogueServiceConstructorOptions } from \"../models/IFederatedCatalogueServiceConstructorOptions.js\";\nimport { datasetEntityToModel, datasetModelToEntity } from \"../utils/datasetConverters.js\";\n\n/**\n * Service for managing federated catalogue operations.\n * Provides Dataspace Protocol-compliant catalog endpoints for dataset registry and query.\n */\nexport class FederatedCatalogueService implements IFederatedCatalogueComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<FederatedCatalogueService>();\n\n\t/**\n\t * The logging component for the federated catalogue service.\n\t * @internal\n\t */\n\tprivate readonly _logging?: ILoggingComponent;\n\n\t/**\n\t * The entity storage connector for datasets.\n\t * @internal\n\t */\n\tprivate readonly _datasetStorage: IEntityStorageConnector<Dataset>;\n\n\t/**\n\t * Create a new instance of FederatedCatalogueService.\n\t * @param options The options for the service.\n\t */\n\tconstructor(options?: IFederatedCatalogueServiceConstructorOptions) {\n\t\tthis._logging = ComponentFactory.getIfExists<ILoggingComponent>(\n\t\t\toptions?.loggingComponentType ?? \"logging\"\n\t\t);\n\n\t\tthis._datasetStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.datasetStorageConnectorType ?? \"dataset\"\n\t\t);\n\n\t\t// Register JSON-LD redirects for offline processing\n\t\tDcatDataTypes.registerRedirects();\n\t\tDublinCoreDataTypes.registerRedirects();\n\t\tFoafDataTypes.registerRedirects();\n\t\tDataspaceProtocolDataTypes.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 FederatedCatalogueService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Retrieve a dataset by its unique identifier.\n\t * @param dataSetId The unique identifier of the dataset.\n\t * @returns The dataset if found.\n\t * @throws NotFoundError if the dataset does not exist.\n\t */\n\tpublic async get(dataSetId: string): Promise<IDataset> {\n\t\tGuards.stringValue(FederatedCatalogueService.CLASS_NAME, nameof(dataSetId), dataSetId);\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: FederatedCatalogueService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"datasetRetrieve\",\n\t\t\tdata: { dataSetId }\n\t\t});\n\n\t\tconst datasetEntity = await this._datasetStorage.get(dataSetId);\n\n\t\tif (!datasetEntity) {\n\t\t\tthrow new NotFoundError(FederatedCatalogueService.CLASS_NAME, \"datasetNotFound\", dataSetId);\n\t\t}\n\n\t\treturn datasetEntityToModel(datasetEntity);\n\t}\n\n\t/**\n\t * Insert or update a dataset in the catalogue.\n\t * This method is internal and should not be exposed via REST endpoints.\n\t * @param dataSet The dataset to store.\n\t */\n\tpublic async set(dataSet: IDataset): Promise<void> {\n\t\tGuards.object(FederatedCatalogueService.CLASS_NAME, nameof(dataSet), dataSet);\n\n\t\tconst dataSetId = dataSet[\"@id\"] ?? dataSet[\"dcterms:identifier\"];\n\t\tGuards.stringValue(FederatedCatalogueService.CLASS_NAME, nameof(dataSetId), dataSetId);\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: FederatedCatalogueService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"datasetSet\",\n\t\t\tdata: { dataSetId }\n\t\t});\n\n\t\tconst datasetEntity = datasetModelToEntity(dataSet);\n\n\t\tconst allIndexes: { [key: string]: unknown } = {};\n\t\tconst filterNames = FederatedCatalogueFilterFactory.names();\n\t\tfor (const filterType of filterNames) {\n\t\t\ttry {\n\t\t\t\tconst filter = FederatedCatalogueFilterFactory.get(filterType);\n\t\t\t\tconst filterIndexes = await filter.createIndex(dataSet);\n\n\t\t\t\tallIndexes[filterType] = filterIndexes;\n\n\t\t\t\tawait this._logging?.log({\n\t\t\t\t\tlevel: \"info\",\n\t\t\t\t\tsource: FederatedCatalogueService.CLASS_NAME,\n\t\t\t\t\tts: Date.now(),\n\t\t\t\t\tmessage: \"filterIndexPersisted\",\n\t\t\t\t\tdata: { dataSetId, filterType, indexCount: Object.keys(filterIndexes).length }\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tawait this._logging?.log({\n\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\tsource: FederatedCatalogueService.CLASS_NAME,\n\t\t\t\t\tts: Date.now(),\n\t\t\t\t\tmessage: \"filterIndexCreationFailed\",\n\t\t\t\t\tdata: { dataSetId, filterType },\n\t\t\t\t\terror: BaseError.fromError(error)\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tawait this._datasetStorage.set(datasetEntity);\n\t}\n\n\t/**\n\t * Execute a query against the catalogue using registered filter plugins.\n\t * Returns a complete DCAT Catalog object with proper JSON-LD context, metadata, and datasets.\n\t * The filter payload is evaluated by the appropriate filter plugin based on its structure.\n\t * Pagination properties (cursor, limit) and filter type (@type) are extracted from the filter object.\n\t * @param filter The filter criteria containing @type, optional cursor and limit properties.\n\t * @returns Complete ICatalog object with @context, @id, @type, dcat:dataset, and optional cursor.\n\t * @throws NotFoundError if @type is missing or if the filter type is not registered.\n\t */\n\tpublic async query(filter?: IBaseFilter[]): Promise<ICatalog> {\n\t\tlet datasets: IDataset[];\n\t\tlet resultCursor: string | undefined;\n\n\t\tconst isArray = Is.array(filter);\n\t\tif (!filter || (isArray && filter.length === 0)) {\n\t\t\tconst result = await this._datasetStorage.query();\n\t\t\tdatasets = result.entities.map(entity => datasetEntityToModel(entity));\n\t\t} else if (isArray && filter.length > 1) {\n\t\t\tthrow new GeneralError(FederatedCatalogueService.CLASS_NAME, \"multipleFiltersNotSupported\");\n\t\t} else {\n\t\t\tconst singleFilter = filter[0];\n\n\t\t\tconst cursor = singleFilter?.cursor;\n\t\t\tconst limit = singleFilter?.limit;\n\t\t\tconst filterType = singleFilter?.[\"@type\"];\n\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: FederatedCatalogueService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"catalogQuery\",\n\t\t\t\tdata: { filterType: filterType ?? \"\", cursor: cursor ?? \"\", limit: limit ?? \"\" }\n\t\t\t});\n\n\t\t\tGuards.stringValue(FederatedCatalogueService.CLASS_NAME, nameof(filterType), filterType);\n\n\t\t\tconst selectedFilter = FederatedCatalogueFilterFactory.get(filterType);\n\n\t\t\tObjectHelper.propertyDelete(filter, \"cursor\");\n\t\t\tObjectHelper.propertyDelete(filter, \"limit\");\n\t\t\tObjectHelper.propertyDelete(filter, \"@type\");\n\t\t\tconst result = await selectedFilter.query(filter);\n\n\t\t\tdatasets = result.datasets;\n\t\t\tresultCursor = result.cursor;\n\t\t}\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: FederatedCatalogueService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"catalogQueryComplete\",\n\t\t\tdata: { resultCount: datasets.length, hasMore: Is.stringValue(resultCursor) }\n\t\t});\n\n\t\t// Generate deterministic catalog ID using canonical hash of dataset IDs\n\t\t// Sort dataset IDs to ensure consistent ordering\n\t\tconst datasetIds = datasets\n\t\t\t.map(d => d[\"@id\"])\n\t\t\t.filter(id => Is.stringValue(id))\n\t\t\t.sort();\n\n\t\t// Create deterministic representation for hashing\n\t\tconst canonicalContent = JSON.stringify({\n\t\t\t\"@type\": DcatClasses.Catalog,\n\t\t\tdatasets: datasetIds\n\t\t});\n\n\t\tconst canonicalBytes = Converter.utf8ToBytes(canonicalContent);\n\t\tconst catalogHash = Converter.bytesToHex(Blake2b.sum256(canonicalBytes));\n\t\tconst catalogId = `urn:x-catalog:${catalogHash}`;\n\n\t\t// Return complete catalog with deterministic ID\n\t\tconst catalog: ICatalog = {\n\t\t\t\"@context\": [\n\t\t\t\tDataspaceProtocolContexts.ContextRoot,\n\t\t\t\t{\n\t\t\t\t\tdcat: DcatContexts.ContextRoot,\n\t\t\t\t\tdcterms: DublinCoreContexts.ContextTerms,\n\t\t\t\t\tcursor: `${FederatedCatalogueContexts.ContextRoot}cursor`\n\t\t\t\t}\n\t\t\t] as IJsonLdContextDefinitionRoot as DcatContextType,\n\t\t\t\"@id\": catalogId,\n\t\t\t\"@type\": DcatClasses.Catalog,\n\t\t\t\"dcat:dataset\": datasets\n\t\t};\n\n\t\tif (resultCursor) {\n\t\t\tcatalog.cursor = resultCursor;\n\t\t}\n\n\t\t// Apply JSON-LD compaction to ensure proper context handling\n\t\tconst compactedCatalog = await JsonLdProcessor.compact(catalog, catalog[\"@context\"]);\n\n\t\treturn compactedCatalog;\n\t}\n\n\t/**\n\t * Remove a dataset from the catalogue by its unique identifier.\n\t * Indexes are automatically removed as they are stored with the dataset.\n\t * @param dataSetId The unique identifier of the dataset to remove.\n\t */\n\tpublic async remove(dataSetId: string): Promise<void> {\n\t\tGuards.stringValue(FederatedCatalogueService.CLASS_NAME, nameof(dataSetId), dataSetId);\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: FederatedCatalogueService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"datasetRemove\",\n\t\t\tdata: { dataSetId }\n\t\t});\n\n\t\tawait this._datasetStorage.remove(dataSetId);\n\t}\n}\n"]}
1
+ {"version":3,"file":"federatedCatalogueService.js","sourceRoot":"","sources":["../../../src/services/federatedCatalogueService.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EACN,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,MAAM,EACN,EAAE,EACF,aAAa,EACb,YAAY,EACZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAqC,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC5F,OAAO,EACN,6BAA6B,EAE7B,MAAM,iCAAiC,CAAC;AAKzC,OAAO,EACN,0BAA0B,EAC1B,+BAA+B,EAC/B,MAAM,sCAAsC,CAAC;AAG9C,OAAO,EACN,yBAAyB,EACzB,0BAA0B,EAC1B,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EACN,WAAW,EACX,YAAY,EAEZ,aAAa,EAGb,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAE3F;;;GAGG;AACH,MAAM,OAAO,yBAAyB;IACrC;;OAEG;IACI,MAAM,CAAU,UAAU,+BAA+C;IAEhF;;;OAGG;IACc,QAAQ,CAAqB;IAE9C;;;OAGG;IACc,eAAe,CAAmC;IAEnE;;;OAGG;IACH,YAAY,OAAsD;QACjE,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAC3C,OAAO,EAAE,oBAAoB,IAAI,SAAS,CAC1C,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,6BAA6B,CAAC,GAAG,CACvD,OAAO,EAAE,2BAA2B,IAAI,SAAS,CACjD,CAAC;QAEF,oDAAoD;QACpD,aAAa,CAAC,iBAAiB,EAAE,CAAC;QAClC,mBAAmB,CAAC,iBAAiB,EAAE,CAAC;QACxC,aAAa,CAAC,iBAAiB,EAAE,CAAC;QAClC,0BAA0B,CAAC,iBAAiB,EAAE,CAAC;IAChD,CAAC;IAED;;;OAGG;IACI,SAAS;QACf,OAAO,yBAAyB,CAAC,UAAU,CAAC;IAC7C,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,GAAG,CAAC,SAAiB;QACjC,MAAM,CAAC,WAAW,CAAC,yBAAyB,CAAC,UAAU,eAAqB,SAAS,CAAC,CAAC;QAEvF,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;YACxB,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,yBAAyB,CAAC,UAAU;YAC5C,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,OAAO,EAAE,iBAAiB;YAC1B,IAAI,EAAE,EAAE,SAAS,EAAE;SACnB,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEhE,IAAI,CAAC,aAAa,EAAE,CAAC;YACpB,MAAM,IAAI,aAAa,CAAC,yBAAyB,CAAC,UAAU,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;QAC7F,CAAC;QAED,OAAO,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,GAAG,CAAC,OAAqB;QACrC,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,UAAU,aAAmB,OAAO,CAAC,CAAC;QAE9E,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAClE,MAAM,CAAC,WAAW,CAAC,yBAAyB,CAAC,UAAU,eAAqB,SAAS,CAAC,CAAC;QAEvF,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;YACxB,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,yBAAyB,CAAC,UAAU;YAC5C,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,OAAO,EAAE,YAAY;YACrB,IAAI,EAAE,EAAE,SAAS,EAAE;SACnB,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAEpD,MAAM,UAAU,GAA+B,EAAE,CAAC;QAClD,MAAM,WAAW,GAAG,+BAA+B,CAAC,KAAK,EAAE,CAAC;QAC5D,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACtC,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,+BAA+B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC/D,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAExD,UAAU,CAAC,UAAU,CAAC,GAAG,aAAa,CAAC;gBAEvC,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;oBACxB,KAAK,EAAE,MAAM;oBACb,MAAM,EAAE,yBAAyB,CAAC,UAAU;oBAC5C,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;oBACd,OAAO,EAAE,sBAAsB;oBAC/B,IAAI,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE;iBAC9E,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;oBACxB,KAAK,EAAE,OAAO;oBACd,MAAM,EAAE,yBAAyB,CAAC,UAAU;oBAC5C,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;oBACd,OAAO,EAAE,2BAA2B;oBACpC,IAAI,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;oBAC/B,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;iBACjC,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QAED,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,KAAK,CAAC,MAAsB;QACxC,IAAI,QAAwB,CAAC;QAC7B,IAAI,YAAgC,CAAC;QAErC,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAClD,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;QACxE,CAAC;aAAM,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,YAAY,CAAC,yBAAyB,CAAC,UAAU,EAAE,6BAA6B,CAAC,CAAC;QAC7F,CAAC;aAAM,CAAC;YACP,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAE/B,MAAM,MAAM,GAAG,YAAY,EAAE,MAAM,CAAC;YACpC,MAAM,KAAK,GAAG,YAAY,EAAE,KAAK,CAAC;YAClC,MAAM,UAAU,GAAG,YAAY,EAAE,CAAC,OAAO,CAAC,CAAC;YAE3C,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;gBACxB,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,yBAAyB,CAAC,UAAU;gBAC5C,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;gBACd,OAAO,EAAE,cAAc;gBACvB,IAAI,EAAE,EAAE,UAAU,EAAE,UAAU,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE;aAChF,CAAC,CAAC;YAEH,MAAM,CAAC,WAAW,CAAC,yBAAyB,CAAC,UAAU,gBAAsB,UAAU,CAAC,CAAC;YAEzF,MAAM,cAAc,GAAG,+BAA+B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAEvE,YAAY,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC9C,YAAY,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC7C,YAAY,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAElD,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC3B,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,CAAC;QAED,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;YACxB,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,yBAAyB,CAAC,UAAU;YAC5C,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,OAAO,EAAE,sBAAsB;YAC/B,IAAI,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE;SAC7E,CAAC,CAAC;QAEH,wEAAwE;QACxE,iDAAiD;QACjD,MAAM,UAAU,GAAG,QAAQ;aACzB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;aAClB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;aAChC,IAAI,EAAE,CAAC;QAET,kDAAkD;QAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC;YACvC,OAAO,EAAE,WAAW,CAAC,OAAO;YAC5B,QAAQ,EAAE,UAAU;SACpB,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,SAAS,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,iBAAiB,WAAW,EAAE,CAAC;QAEjD,gDAAgD;QAChD,MAAM,OAAO,GAAiB;YAC7B,UAAU,EAAE;gBACX,yBAAyB,CAAC,WAAW;gBACrC;oBACC,IAAI,EAAE,YAAY,CAAC,WAAW;oBAC9B,OAAO,EAAE,kBAAkB,CAAC,YAAY;oBACxC,MAAM,EAAE,GAAG,0BAA0B,CAAC,WAAW,QAAQ;iBACzD;aACkD;YACpD,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,WAAW,CAAC,OAAO;YAC5B,cAAc,EAAE,QAAQ;SACxB,CAAC;QAEF,IAAI,YAAY,EAAE,CAAC;YAClB,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC;QAC/B,CAAC;QAED,6DAA6D;QAC7D,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAErF,OAAO,gBAAgB,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,MAAM,CAAC,SAAiB;QACpC,MAAM,CAAC,WAAW,CAAC,yBAAyB,CAAC,UAAU,eAAqB,SAAS,CAAC,CAAC;QAEvF,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;YACxB,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,yBAAyB,CAAC,UAAU;YAC5C,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,OAAO,EAAE,eAAe;YACxB,IAAI,EAAE,EAAE,SAAS,EAAE;SACnB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tBaseError,\n\tComponentFactory,\n\tConverter,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tNotFoundError,\n\tObjectHelper\n} from \"@twin.org/core\";\nimport { Blake2b } from \"@twin.org/crypto\";\nimport { type IJsonLdContextDefinitionRoot, JsonLdProcessor } from \"@twin.org/data-json-ld\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport type {\n\tIBaseFilter,\n\tIFederatedCatalogueComponent\n} from \"@twin.org/federated-catalogue-models\";\nimport {\n\tFederatedCatalogueContexts,\n\tFederatedCatalogueFilterFactory\n} from \"@twin.org/federated-catalogue-models\";\nimport type { ILoggingComponent } from \"@twin.org/logging-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport {\n\tDataspaceProtocolContexts,\n\tDataspaceProtocolDataTypes\n} from \"@twin.org/standards-dataspace-protocol\";\nimport { DublinCoreContexts, DublinCoreDataTypes } from \"@twin.org/standards-dublin-core\";\nimport { FoafDataTypes } from \"@twin.org/standards-foaf\";\nimport {\n\tDcatClasses,\n\tDcatContexts,\n\ttype DcatContextType,\n\tDcatDataTypes,\n\ttype IDcatCatalog,\n\ttype IDcatDataset\n} from \"@twin.org/standards-w3c-dcat\";\nimport type { Dataset } from \"../entities/dataset.js\";\nimport type { IFederatedCatalogueServiceConstructorOptions } from \"../models/IFederatedCatalogueServiceConstructorOptions.js\";\nimport { datasetEntityToModel, datasetModelToEntity } from \"../utils/datasetConverters.js\";\n\n/**\n * Service for managing federated catalogue operations.\n * Provides Dataspace Protocol-compliant catalog endpoints for dataset registry and query.\n */\nexport class FederatedCatalogueService implements IFederatedCatalogueComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<FederatedCatalogueService>();\n\n\t/**\n\t * The logging component for the federated catalogue service.\n\t * @internal\n\t */\n\tprivate readonly _logging?: ILoggingComponent;\n\n\t/**\n\t * The entity storage connector for datasets.\n\t * @internal\n\t */\n\tprivate readonly _datasetStorage: IEntityStorageConnector<Dataset>;\n\n\t/**\n\t * Create a new instance of FederatedCatalogueService.\n\t * @param options The options for the service.\n\t */\n\tconstructor(options?: IFederatedCatalogueServiceConstructorOptions) {\n\t\tthis._logging = ComponentFactory.getIfExists<ILoggingComponent>(\n\t\t\toptions?.loggingComponentType ?? \"logging\"\n\t\t);\n\n\t\tthis._datasetStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.datasetStorageConnectorType ?? \"dataset\"\n\t\t);\n\n\t\t// Register JSON-LD redirects for offline processing\n\t\tDcatDataTypes.registerRedirects();\n\t\tDublinCoreDataTypes.registerRedirects();\n\t\tFoafDataTypes.registerRedirects();\n\t\tDataspaceProtocolDataTypes.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 FederatedCatalogueService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Retrieve a dataset by its unique identifier.\n\t * @param dataSetId The unique identifier of the dataset.\n\t * @returns The dataset if found.\n\t * @throws NotFoundError if the dataset does not exist.\n\t */\n\tpublic async get(dataSetId: string): Promise<IDcatDataset> {\n\t\tGuards.stringValue(FederatedCatalogueService.CLASS_NAME, nameof(dataSetId), dataSetId);\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: FederatedCatalogueService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"datasetRetrieve\",\n\t\t\tdata: { dataSetId }\n\t\t});\n\n\t\tconst datasetEntity = await this._datasetStorage.get(dataSetId);\n\n\t\tif (!datasetEntity) {\n\t\t\tthrow new NotFoundError(FederatedCatalogueService.CLASS_NAME, \"datasetNotFound\", dataSetId);\n\t\t}\n\n\t\treturn datasetEntityToModel(datasetEntity);\n\t}\n\n\t/**\n\t * Insert or update a dataset in the catalogue.\n\t * This method is internal and should not be exposed via REST endpoints.\n\t * @param dataSet The dataset to store.\n\t */\n\tpublic async set(dataSet: IDcatDataset): Promise<void> {\n\t\tGuards.object(FederatedCatalogueService.CLASS_NAME, nameof(dataSet), dataSet);\n\n\t\tconst dataSetId = dataSet[\"@id\"] ?? dataSet[\"dcterms:identifier\"];\n\t\tGuards.stringValue(FederatedCatalogueService.CLASS_NAME, nameof(dataSetId), dataSetId);\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: FederatedCatalogueService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"datasetSet\",\n\t\t\tdata: { dataSetId }\n\t\t});\n\n\t\tconst datasetEntity = datasetModelToEntity(dataSet);\n\n\t\tconst allIndexes: { [key: string]: unknown } = {};\n\t\tconst filterNames = FederatedCatalogueFilterFactory.names();\n\t\tfor (const filterType of filterNames) {\n\t\t\ttry {\n\t\t\t\tconst filter = FederatedCatalogueFilterFactory.get(filterType);\n\t\t\t\tconst filterIndexes = await filter.createIndex(dataSet);\n\n\t\t\t\tallIndexes[filterType] = filterIndexes;\n\n\t\t\t\tawait this._logging?.log({\n\t\t\t\t\tlevel: \"info\",\n\t\t\t\t\tsource: FederatedCatalogueService.CLASS_NAME,\n\t\t\t\t\tts: Date.now(),\n\t\t\t\t\tmessage: \"filterIndexPersisted\",\n\t\t\t\t\tdata: { dataSetId, filterType, indexCount: Object.keys(filterIndexes).length }\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tawait this._logging?.log({\n\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\tsource: FederatedCatalogueService.CLASS_NAME,\n\t\t\t\t\tts: Date.now(),\n\t\t\t\t\tmessage: \"filterIndexCreationFailed\",\n\t\t\t\t\tdata: { dataSetId, filterType },\n\t\t\t\t\terror: BaseError.fromError(error)\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tawait this._datasetStorage.set(datasetEntity);\n\t}\n\n\t/**\n\t * Execute a query against the catalogue using registered filter plugins.\n\t * Returns a complete DCAT Catalog object with proper JSON-LD context, metadata, and datasets.\n\t * The filter payload is evaluated by the appropriate filter plugin based on its structure.\n\t * Pagination properties (cursor, limit) and filter type (@type) are extracted from the filter object.\n\t * @param filter The filter criteria containing @type, optional cursor and limit properties.\n\t * @returns Complete ICatalog object with @context, @id, @type, dcat:dataset, and optional cursor.\n\t * @throws NotFoundError if @type is missing or if the filter type is not registered.\n\t */\n\tpublic async query(filter?: IBaseFilter[]): Promise<IDcatCatalog> {\n\t\tlet datasets: IDcatDataset[];\n\t\tlet resultCursor: string | undefined;\n\n\t\tconst isArray = Is.array(filter);\n\t\tif (!filter || (isArray && filter.length === 0)) {\n\t\t\tconst result = await this._datasetStorage.query();\n\t\t\tdatasets = result.entities.map(entity => datasetEntityToModel(entity));\n\t\t} else if (isArray && filter.length > 1) {\n\t\t\tthrow new GeneralError(FederatedCatalogueService.CLASS_NAME, \"multipleFiltersNotSupported\");\n\t\t} else {\n\t\t\tconst singleFilter = filter[0];\n\n\t\t\tconst cursor = singleFilter?.cursor;\n\t\t\tconst limit = singleFilter?.limit;\n\t\t\tconst filterType = singleFilter?.[\"@type\"];\n\n\t\t\tawait this._logging?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: FederatedCatalogueService.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"catalogQuery\",\n\t\t\t\tdata: { filterType: filterType ?? \"\", cursor: cursor ?? \"\", limit: limit ?? \"\" }\n\t\t\t});\n\n\t\t\tGuards.stringValue(FederatedCatalogueService.CLASS_NAME, nameof(filterType), filterType);\n\n\t\t\tconst selectedFilter = FederatedCatalogueFilterFactory.get(filterType);\n\n\t\t\tObjectHelper.propertyDelete(filter, \"cursor\");\n\t\t\tObjectHelper.propertyDelete(filter, \"limit\");\n\t\t\tObjectHelper.propertyDelete(filter, \"@type\");\n\t\t\tconst result = await selectedFilter.query(filter);\n\n\t\t\tdatasets = result.datasets;\n\t\t\tresultCursor = result.cursor;\n\t\t}\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: FederatedCatalogueService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"catalogQueryComplete\",\n\t\t\tdata: { resultCount: datasets.length, hasMore: Is.stringValue(resultCursor) }\n\t\t});\n\n\t\t// Generate deterministic catalog ID using canonical hash of dataset IDs\n\t\t// Sort dataset IDs to ensure consistent ordering\n\t\tconst datasetIds = datasets\n\t\t\t.map(d => d[\"@id\"])\n\t\t\t.filter(id => Is.stringValue(id))\n\t\t\t.sort();\n\n\t\t// Create deterministic representation for hashing\n\t\tconst canonicalContent = JSON.stringify({\n\t\t\t\"@type\": DcatClasses.Catalog,\n\t\t\tdatasets: datasetIds\n\t\t});\n\n\t\tconst canonicalBytes = Converter.utf8ToBytes(canonicalContent);\n\t\tconst catalogHash = Converter.bytesToHex(Blake2b.sum256(canonicalBytes));\n\t\tconst catalogId = `urn:x-catalog:${catalogHash}`;\n\n\t\t// Return complete catalog with deterministic ID\n\t\tconst catalog: IDcatCatalog = {\n\t\t\t\"@context\": [\n\t\t\t\tDataspaceProtocolContexts.ContextRoot,\n\t\t\t\t{\n\t\t\t\t\tdcat: DcatContexts.ContextRoot,\n\t\t\t\t\tdcterms: DublinCoreContexts.ContextTerms,\n\t\t\t\t\tcursor: `${FederatedCatalogueContexts.ContextRoot}cursor`\n\t\t\t\t}\n\t\t\t] as IJsonLdContextDefinitionRoot as DcatContextType,\n\t\t\t\"@id\": catalogId,\n\t\t\t\"@type\": DcatClasses.Catalog,\n\t\t\t\"dcat:dataset\": datasets\n\t\t};\n\n\t\tif (resultCursor) {\n\t\t\tcatalog.cursor = resultCursor;\n\t\t}\n\n\t\t// Apply JSON-LD compaction to ensure proper context handling\n\t\tconst compactedCatalog = await JsonLdProcessor.compact(catalog, catalog[\"@context\"]);\n\n\t\treturn compactedCatalog;\n\t}\n\n\t/**\n\t * Remove a dataset from the catalogue by its unique identifier.\n\t * Indexes are automatically removed as they are stored with the dataset.\n\t * @param dataSetId The unique identifier of the dataset to remove.\n\t */\n\tpublic async remove(dataSetId: string): Promise<void> {\n\t\tGuards.stringValue(FederatedCatalogueService.CLASS_NAME, nameof(dataSetId), dataSetId);\n\n\t\tawait this._logging?.log({\n\t\t\tlevel: \"info\",\n\t\t\tsource: FederatedCatalogueService.CLASS_NAME,\n\t\t\tts: Date.now(),\n\t\t\tmessage: \"datasetRemove\",\n\t\t\tdata: { dataSetId }\n\t\t});\n\n\t\tawait this._datasetStorage.remove(dataSetId);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"datasetConverters.js","sourceRoot":"","sources":["../../../src/utils/datasetConverters.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAkC;IACtE,OAAO,EAAE,GAAG,MAAM,EAAc,CAAC;AAClC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAe;IACnD,OAAO,EAAE,GAAG,KAAK,EAAa,CAAC;AAChC,CAAC","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IDataset } from \"@twin.org/standards-w3c-dcat\";\nimport type { Dataset } from \"../entities/dataset.js\";\n\n/**\n * Convert a Dataset entity to an IDataset model.\n * Removes internal entity properties that should not be exposed in API responses.\n * @param entity The dataset entity from storage (may be partial from query results).\n * @returns The IDataset model for API responses.\n */\nexport function datasetEntityToModel(entity: Dataset | Partial<Dataset>): IDataset {\n\treturn { ...entity } as IDataset;\n}\n\n/**\n * Convert an IDataset model to a Dataset entity.\n * Prepares the model for storage by converting to entity type.\n * Creates a shallow copy to avoid mutating the input model.\n * @param model The IDataset model from API requests.\n * @returns The Dataset entity for storage.\n */\nexport function datasetModelToEntity(model: IDataset): Dataset {\n\treturn { ...model } as Dataset;\n}\n"]}
1
+ {"version":3,"file":"datasetConverters.js","sourceRoot":"","sources":["../../../src/utils/datasetConverters.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAkC;IACtE,OAAO,EAAE,GAAG,MAAM,EAAkB,CAAC;AACtC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAmB;IACvD,OAAO,EAAE,GAAG,KAAK,EAAa,CAAC;AAChC,CAAC","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IDcatDataset } from \"@twin.org/standards-w3c-dcat\";\nimport type { Dataset } from \"../entities/dataset.js\";\n\n/**\n * Convert a Dataset entity to an IDataset model.\n * Removes internal entity properties that should not be exposed in API responses.\n * @param entity The dataset entity from storage (may be partial from query results).\n * @returns The IDataset model for API responses.\n */\nexport function datasetEntityToModel(entity: Dataset | Partial<Dataset>): IDcatDataset {\n\treturn { ...entity } as IDcatDataset;\n}\n\n/**\n * Convert an IDataset model to a Dataset entity.\n * Prepares the model for storage by converting to entity type.\n * Creates a shallow copy to avoid mutating the input model.\n * @param model The IDataset model from API requests.\n * @returns The Dataset entity for storage.\n */\nexport function datasetModelToEntity(model: IDcatDataset): Dataset {\n\treturn { ...model } as Dataset;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { IDataset } from "@twin.org/standards-w3c-dcat";
1
+ import type { IDcatDataset } from "@twin.org/standards-w3c-dcat";
2
2
  /**
3
3
  * Class describing a DCAT dataset for entity storage.
4
4
  * This wrapper enables efficient database indexing and querying while preserving
@@ -12,117 +12,117 @@ export declare class Dataset {
12
12
  /**
13
13
  * The JSON-LD context for the dataset.
14
14
  */
15
- "@context": IDataset["@context"];
15
+ "@context": IDcatDataset["@context"];
16
16
  /**
17
17
  * The type of the resource (typically "Dataset").
18
18
  */
19
- "@type": IDataset["@type"];
19
+ "@type": IDcatDataset["@type"];
20
20
  /**
21
21
  * A name given to the resource.
22
22
  */
23
- "dcterms:title"?: IDataset["dcterms:title"];
23
+ "dcterms:title"?: IDcatDataset["dcterms:title"];
24
24
  /**
25
25
  * A free-text account of the resource.
26
26
  */
27
- "dcterms:description"?: IDataset["dcterms:description"];
27
+ "dcterms:description"?: IDcatDataset["dcterms:description"];
28
28
  /**
29
29
  * A unique identifier of the resource.
30
30
  */
31
- "dcterms:identifier"?: IDataset["dcterms:identifier"];
31
+ "dcterms:identifier"?: IDcatDataset["dcterms:identifier"];
32
32
  /**
33
33
  * Date of formal issuance (publication) of the resource.
34
34
  */
35
- "dcterms:issued"?: IDataset["dcterms:issued"];
35
+ "dcterms:issued"?: IDcatDataset["dcterms:issued"];
36
36
  /**
37
37
  * Most recent date on which the resource was changed, updated or modified.
38
38
  */
39
- "dcterms:modified"?: IDataset["dcterms:modified"];
39
+ "dcterms:modified"?: IDcatDataset["dcterms:modified"];
40
40
  /**
41
41
  * A language of the resource.
42
42
  */
43
- "dcterms:language"?: IDataset["dcterms:language"];
43
+ "dcterms:language"?: IDcatDataset["dcterms:language"];
44
44
  /**
45
45
  * An entity responsible for making the resource available.
46
46
  */
47
- "dcterms:publisher"?: IDataset["dcterms:publisher"];
47
+ "dcterms:publisher"?: IDcatDataset["dcterms:publisher"];
48
48
  /**
49
49
  * An entity responsible for producing the resource.
50
50
  */
51
- "dcterms:creator"?: IDataset["dcterms:creator"];
51
+ "dcterms:creator"?: IDcatDataset["dcterms:creator"];
52
52
  /**
53
53
  * Information about who can access the resource or an indication of its security status.
54
54
  */
55
- "dcterms:accessRights"?: IDataset["dcterms:accessRights"];
55
+ "dcterms:accessRights"?: IDcatDataset["dcterms:accessRights"];
56
56
  /**
57
57
  * A legal document under which the resource is made available.
58
58
  */
59
- "dcterms:license"?: IDataset["dcterms:license"];
59
+ "dcterms:license"?: IDcatDataset["dcterms:license"];
60
60
  /**
61
61
  * Information about rights held in and over the resource.
62
62
  */
63
- "dcterms:rights"?: IDataset["dcterms:rights"];
63
+ "dcterms:rights"?: IDcatDataset["dcterms:rights"];
64
64
  /**
65
65
  * An established standard to which the resource conforms.
66
66
  */
67
- "dcterms:conformsTo"?: IDataset["dcterms:conformsTo"];
67
+ "dcterms:conformsTo"?: IDcatDataset["dcterms:conformsTo"];
68
68
  /**
69
69
  * The nature or genre of the resource.
70
70
  */
71
- "dcterms:type"?: IDataset["dcterms:type"];
71
+ "dcterms:type"?: IDcatDataset["dcterms:type"];
72
72
  /**
73
73
  * Relevant contact information for the catalogued resource.
74
74
  */
75
- "dcat:contactPoint"?: IDataset["dcat:contactPoint"];
75
+ "dcat:contactPoint"?: IDcatDataset["dcat:contactPoint"];
76
76
  /**
77
77
  * A keyword or tag describing the resource.
78
78
  */
79
- "dcat:keyword"?: IDataset["dcat:keyword"];
79
+ "dcat:keyword"?: IDcatDataset["dcat:keyword"];
80
80
  /**
81
81
  * A main category of the resource. A resource can have multiple themes.
82
82
  */
83
- "dcat:theme"?: IDataset["dcat:theme"];
83
+ "dcat:theme"?: IDcatDataset["dcat:theme"];
84
84
  /**
85
85
  * A Web page that can be navigated to gain access to the resource.
86
86
  */
87
- "dcat:landingPage"?: IDataset["dcat:landingPage"];
87
+ "dcat:landingPage"?: IDcatDataset["dcat:landingPage"];
88
88
  /**
89
89
  * Link to a description of a relationship with another resource.
90
90
  */
91
- "dcat:qualifiedRelation"?: IDataset["dcat:qualifiedRelation"];
91
+ "dcat:qualifiedRelation"?: IDcatDataset["dcat:qualifiedRelation"];
92
92
  /**
93
93
  * An ODRL conformant policy expressing the rights associated with the resource.
94
94
  */
95
- "odrl:hasPolicy"?: IDataset["odrl:hasPolicy"];
95
+ "odrl:hasPolicy"?: IDcatDataset["odrl:hasPolicy"];
96
96
  /**
97
97
  * An available distribution of the dataset.
98
98
  */
99
- "dcat:distribution"?: IDataset["dcat:distribution"];
99
+ "dcat:distribution"?: IDcatDataset["dcat:distribution"];
100
100
  /**
101
101
  * The frequency at which the dataset is published.
102
102
  */
103
- "dcterms:accrualPeriodicity"?: IDataset["dcterms:accrualPeriodicity"];
103
+ "dcterms:accrualPeriodicity"?: IDcatDataset["dcterms:accrualPeriodicity"];
104
104
  /**
105
105
  * A dataset series of which the dataset is part.
106
106
  */
107
- "dcat:inSeries"?: IDataset["dcat:inSeries"];
107
+ "dcat:inSeries"?: IDcatDataset["dcat:inSeries"];
108
108
  /**
109
109
  * The geographical area covered by the dataset.
110
110
  */
111
- "dcterms:spatial"?: IDataset["dcterms:spatial"];
111
+ "dcterms:spatial"?: IDcatDataset["dcterms:spatial"];
112
112
  /**
113
113
  * Minimum spatial separation resolvable in a dataset, measured in meters.
114
114
  */
115
- "dcat:spatialResolutionInMeters"?: IDataset["dcat:spatialResolutionInMeters"];
115
+ "dcat:spatialResolutionInMeters"?: IDcatDataset["dcat:spatialResolutionInMeters"];
116
116
  /**
117
117
  * The temporal period that the dataset covers.
118
118
  */
119
- "dcterms:temporal"?: IDataset["dcterms:temporal"];
119
+ "dcterms:temporal"?: IDcatDataset["dcterms:temporal"];
120
120
  /**
121
121
  * Minimum time period resolvable in the dataset.
122
122
  */
123
- "dcat:temporalResolution"?: IDataset["dcat:temporalResolution"];
123
+ "dcat:temporalResolution"?: IDcatDataset["dcat:temporalResolution"];
124
124
  /**
125
125
  * An activity that generated, or provides the business context for, the creation of the dataset.
126
126
  */
127
- "prov:wasGeneratedBy"?: IDataset["prov:wasGeneratedBy"];
127
+ "prov:wasGeneratedBy"?: IDcatDataset["prov:wasGeneratedBy"];
128
128
  }
@@ -1,5 +1,5 @@
1
1
  import type { IBaseFilter, IFederatedCatalogueComponent } from "@twin.org/federated-catalogue-models";
2
- import { type ICatalog, type IDataset } from "@twin.org/standards-w3c-dcat";
2
+ import { type IDcatCatalog, type IDcatDataset } from "@twin.org/standards-w3c-dcat";
3
3
  import type { IFederatedCatalogueServiceConstructorOptions } from "../models/IFederatedCatalogueServiceConstructorOptions.js";
4
4
  /**
5
5
  * Service for managing federated catalogue operations.
@@ -26,13 +26,13 @@ export declare class FederatedCatalogueService implements IFederatedCatalogueCom
26
26
  * @returns The dataset if found.
27
27
  * @throws NotFoundError if the dataset does not exist.
28
28
  */
29
- get(dataSetId: string): Promise<IDataset>;
29
+ get(dataSetId: string): Promise<IDcatDataset>;
30
30
  /**
31
31
  * Insert or update a dataset in the catalogue.
32
32
  * This method is internal and should not be exposed via REST endpoints.
33
33
  * @param dataSet The dataset to store.
34
34
  */
35
- set(dataSet: IDataset): Promise<void>;
35
+ set(dataSet: IDcatDataset): Promise<void>;
36
36
  /**
37
37
  * Execute a query against the catalogue using registered filter plugins.
38
38
  * Returns a complete DCAT Catalog object with proper JSON-LD context, metadata, and datasets.
@@ -42,7 +42,7 @@ export declare class FederatedCatalogueService implements IFederatedCatalogueCom
42
42
  * @returns Complete ICatalog object with @context, @id, @type, dcat:dataset, and optional cursor.
43
43
  * @throws NotFoundError if @type is missing or if the filter type is not registered.
44
44
  */
45
- query(filter?: IBaseFilter[]): Promise<ICatalog>;
45
+ query(filter?: IBaseFilter[]): Promise<IDcatCatalog>;
46
46
  /**
47
47
  * Remove a dataset from the catalogue by its unique identifier.
48
48
  * Indexes are automatically removed as they are stored with the dataset.
@@ -1,4 +1,4 @@
1
- import type { IDataset } from "@twin.org/standards-w3c-dcat";
1
+ import type { IDcatDataset } from "@twin.org/standards-w3c-dcat";
2
2
  import type { Dataset } from "../entities/dataset.js";
3
3
  /**
4
4
  * Convert a Dataset entity to an IDataset model.
@@ -6,7 +6,7 @@ import type { Dataset } from "../entities/dataset.js";
6
6
  * @param entity The dataset entity from storage (may be partial from query results).
7
7
  * @returns The IDataset model for API responses.
8
8
  */
9
- export declare function datasetEntityToModel(entity: Dataset | Partial<Dataset>): IDataset;
9
+ export declare function datasetEntityToModel(entity: Dataset | Partial<Dataset>): IDcatDataset;
10
10
  /**
11
11
  * Convert an IDataset model to a Dataset entity.
12
12
  * Prepares the model for storage by converting to entity type.
@@ -14,4 +14,4 @@ export declare function datasetEntityToModel(entity: Dataset | Partial<Dataset>)
14
14
  * @param model The IDataset model from API requests.
15
15
  * @returns The Dataset entity for storage.
16
16
  */
17
- export declare function datasetModelToEntity(model: IDataset): Dataset;
17
+ export declare function datasetModelToEntity(model: IDcatDataset): Dataset;
package/docs/changelog.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @twin.org/federated-catalogue-service - Changelog
2
2
 
3
+ ## [0.0.3-next.4](https://github.com/twinfoundation/federated-catalogue/compare/federated-catalogue-service-v0.0.3-next.3...federated-catalogue-service-v0.0.3-next.4) (2026-01-06)
4
+
5
+
6
+ ### Features
7
+
8
+ * updates standards dependencies ([62f5d9c](https://github.com/twinfoundation/federated-catalogue/commit/62f5d9c6180bc27497ac43624ffd714e7ce65ce6))
9
+
10
+
11
+ ### Dependencies
12
+
13
+ * The following workspace dependencies were updated
14
+ * dependencies
15
+ * @twin.org/federated-catalogue-models bumped from 0.0.3-next.3 to 0.0.3-next.4
16
+
3
17
  ## [0.0.3-next.3](https://github.com/twinfoundation/federated-catalogue/compare/federated-catalogue-service-v0.0.3-next.2...federated-catalogue-service-v0.0.3-next.3) (2025-11-28)
4
18
 
5
19