@twin.org/dataspace-control-plane-service 0.0.3-next.26 → 0.0.3-next.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
- import { ComponentFactory, Guards } from "@twin.org/core";
1
+ import { Coerce, ComponentFactory, Guards } from "@twin.org/core";
2
2
  import { DataspaceProtocolContexts, DataspaceProtocolTransferProcessStateType, DataspaceProtocolTransferProcessTypes } from "@twin.org/standards-dataspace-protocol";
3
- import { HeaderHelper, HeaderTypes, MimeTypes } from "@twin.org/web";
3
+ import { HeaderHelper, HeaderTypes, HttpStatusCode, MimeTypes } from "@twin.org/web";
4
4
  import { transformErrorToStatusCode } from "./utils/transferErrorUtils.js";
5
5
  /**
6
6
  * The source used when communicating about these routes.
@@ -13,6 +13,10 @@ export const tagsDataspaceControlPlane = [
13
13
  {
14
14
  name: "Transfer Process",
15
15
  description: "DSP Transfer Process Protocol endpoints for initiating and managing data transfers."
16
+ },
17
+ {
18
+ name: "Datasets",
19
+ description: "Tenant-scoped CRUD over the datasets the Control Plane reads at start time to populate the federated catalogue."
16
20
  }
17
21
  ];
18
22
  // Example objects for API documentation
@@ -69,7 +73,6 @@ export function generateRestRoutesDataspaceControlPlane(baseRouteName, component
69
73
  method: "POST",
70
74
  path: `${baseRouteName}/transfers/request`,
71
75
  skipAuth: true,
72
- skipTenant: true,
73
76
  handler: async (httpRequestContext, request) => requestTransferHandler(httpRequestContext, componentName, request),
74
77
  requestType: {
75
78
  mimeType: MimeTypes.JsonLd,
@@ -108,7 +111,6 @@ export function generateRestRoutesDataspaceControlPlane(baseRouteName, component
108
111
  method: "GET",
109
112
  path: `${baseRouteName}/transfers/:pid`,
110
113
  skipAuth: true,
111
- skipTenant: true,
112
114
  handler: async (httpRequestContext, request) => getTransferProcessHandler(httpRequestContext, componentName, request),
113
115
  requestType: {
114
116
  type: "IGetTransferProcessRequest",
@@ -148,7 +150,6 @@ export function generateRestRoutesDataspaceControlPlane(baseRouteName, component
148
150
  method: "POST",
149
151
  path: `${baseRouteName}/transfers/:pid/start`,
150
152
  skipAuth: true,
151
- skipTenant: true,
152
153
  handler: async (httpRequestContext, request) => startTransferHandler(httpRequestContext, componentName, request),
153
154
  requestType: {
154
155
  mimeType: MimeTypes.JsonLd,
@@ -200,7 +201,6 @@ export function generateRestRoutesDataspaceControlPlane(baseRouteName, component
200
201
  method: "POST",
201
202
  path: `${baseRouteName}/transfers/:pid/complete`,
202
203
  skipAuth: true,
203
- skipTenant: true,
204
204
  handler: async (httpRequestContext, request) => completeTransferHandler(httpRequestContext, componentName, request),
205
205
  requestType: {
206
206
  mimeType: MimeTypes.JsonLd,
@@ -250,7 +250,6 @@ export function generateRestRoutesDataspaceControlPlane(baseRouteName, component
250
250
  method: "POST",
251
251
  path: `${baseRouteName}/transfers/:pid/suspend`,
252
252
  skipAuth: true,
253
- skipTenant: true,
254
253
  handler: async (httpRequestContext, request) => suspendTransferHandler(httpRequestContext, componentName, request),
255
254
  requestType: {
256
255
  mimeType: MimeTypes.JsonLd,
@@ -300,7 +299,6 @@ export function generateRestRoutesDataspaceControlPlane(baseRouteName, component
300
299
  method: "POST",
301
300
  path: `${baseRouteName}/transfers/:pid/terminate`,
302
301
  skipAuth: true,
303
- skipTenant: true,
304
302
  handler: async (httpRequestContext, request) => terminateTransferHandler(httpRequestContext, componentName, request),
305
303
  requestType: {
306
304
  mimeType: MimeTypes.JsonLd,
@@ -342,13 +340,192 @@ export function generateRestRoutesDataspaceControlPlane(baseRouteName, component
342
340
  }
343
341
  ]
344
342
  };
343
+ // ============================================================================
344
+ // DATASPACE APP DATASET MANAGEMENT
345
+ // ============================================================================
346
+ const createDataspaceAppDatasetRoute = {
347
+ operationId: "datasetCreate",
348
+ summary: "Register an app dataset for the calling tenant.",
349
+ tag: tagsDataspaceControlPlane[1].name,
350
+ method: "POST",
351
+ path: `${baseRouteName}/app-datasets`,
352
+ handler: async (httpRequestContext, request) => createAppDatasetHandler(httpRequestContext, componentName, request),
353
+ requestType: {
354
+ type: "IAppDatasetCreateRequest",
355
+ examples: [
356
+ {
357
+ id: "datasetCreateRequestExample",
358
+ request: {
359
+ body: {
360
+ appId: "https://twin.example.org/app1",
361
+ dataset: {
362
+ "@context": DataspaceProtocolContexts.Context,
363
+ "@type": "Dataset",
364
+ "@id": "https://twin.example.org/data-service-1",
365
+ hasPolicy: [],
366
+ distribution: []
367
+ }
368
+ }
369
+ }
370
+ }
371
+ ]
372
+ },
373
+ responseType: [
374
+ {
375
+ type: "IAppDatasetCreateResponse",
376
+ examples: [
377
+ {
378
+ id: "datasetCreateResponseExample",
379
+ response: {
380
+ statusCode: 201,
381
+ headers: {
382
+ [HeaderTypes.Location]: "https://twin.example.org/data-service-1"
383
+ }
384
+ }
385
+ }
386
+ ]
387
+ }
388
+ ]
389
+ };
390
+ const getDataspaceAppDatasetRoute = {
391
+ operationId: "datasetGet",
392
+ summary: "Retrieve an app dataset owned by the calling tenant.",
393
+ tag: tagsDataspaceControlPlane[1].name,
394
+ method: "GET",
395
+ path: `${baseRouteName}/app-datasets/:id`,
396
+ handler: async (httpRequestContext, request) => getAppDatasetHandler(httpRequestContext, componentName, request),
397
+ requestType: {
398
+ type: "IAppDatasetGetRequest",
399
+ examples: [
400
+ {
401
+ id: "datasetGetRequestExample",
402
+ request: {
403
+ pathParams: { id: "dataspace-app-dataset-1" }
404
+ }
405
+ }
406
+ ]
407
+ },
408
+ responseType: [
409
+ {
410
+ type: "IAppDatasetGetResponse"
411
+ }
412
+ ]
413
+ };
414
+ const listDataspaceAppDatasetsRoute = {
415
+ operationId: "datasetList",
416
+ summary: "List the app datasets owned by the calling tenant.",
417
+ tag: tagsDataspaceControlPlane[1].name,
418
+ method: "GET",
419
+ path: `${baseRouteName}/app-datasets`,
420
+ handler: async (httpRequestContext, request) => listAppDatasetsHandler(httpRequestContext, componentName, request),
421
+ requestType: {
422
+ type: "IAppDatasetListRequest",
423
+ examples: [
424
+ {
425
+ id: "datasetListRequestExample",
426
+ request: {}
427
+ }
428
+ ]
429
+ },
430
+ responseType: [
431
+ {
432
+ type: "IAppDatasetListResponse"
433
+ }
434
+ ]
435
+ };
436
+ const updateDataspaceAppDatasetRoute = {
437
+ operationId: "datasetUpdate",
438
+ summary: "Update an app dataset owned by the calling tenant.",
439
+ tag: tagsDataspaceControlPlane[1].name,
440
+ method: "PUT",
441
+ path: `${baseRouteName}/app-datasets/:id`,
442
+ handler: async (httpRequestContext, request) => updateAppDatasetHandler(httpRequestContext, componentName, request),
443
+ requestType: {
444
+ type: "IAppDatasetUpdateRequest",
445
+ examples: [
446
+ {
447
+ id: "datasetUpdateRequestExample",
448
+ // `dataset["@id"]` is intentionally omitted — the path id is
449
+ // authoritative and any body `@id` is stripped before storage.
450
+ request: {
451
+ pathParams: { id: "dataspace-app-dataset-1" },
452
+ body: {
453
+ appId: "https://twin.example.org/app1",
454
+ dataset: {
455
+ "@context": DataspaceProtocolContexts.Context,
456
+ "@type": "Dataset",
457
+ hasPolicy: [],
458
+ distribution: []
459
+ }
460
+ }
461
+ }
462
+ }
463
+ ]
464
+ },
465
+ responseType: [
466
+ {
467
+ type: "INoContentResponse",
468
+ examples: [
469
+ {
470
+ id: "datasetUpdateResponseExample",
471
+ response: {
472
+ statusCode: HttpStatusCode.noContent
473
+ }
474
+ }
475
+ ]
476
+ },
477
+ {
478
+ type: "INotFoundResponse"
479
+ }
480
+ ]
481
+ };
482
+ const deleteDataspaceAppDatasetRoute = {
483
+ operationId: "datasetDelete",
484
+ summary: "Delete an app dataset owned by the calling tenant.",
485
+ tag: tagsDataspaceControlPlane[1].name,
486
+ method: "DELETE",
487
+ path: `${baseRouteName}/app-datasets/:id`,
488
+ handler: async (httpRequestContext, request) => deleteAppDatasetHandler(httpRequestContext, componentName, request),
489
+ requestType: {
490
+ type: "IAppDatasetDeleteRequest",
491
+ examples: [
492
+ {
493
+ id: "datasetDeleteRequestExample",
494
+ request: {
495
+ pathParams: { id: "dataspace-app-dataset-1" }
496
+ }
497
+ }
498
+ ]
499
+ },
500
+ responseType: [
501
+ {
502
+ type: "INoContentResponse",
503
+ examples: [
504
+ {
505
+ id: "datasetDeleteResponseExample",
506
+ response: {
507
+ statusCode: HttpStatusCode.noContent
508
+ }
509
+ }
510
+ ]
511
+ },
512
+ {
513
+ type: "INotFoundResponse"
514
+ }
515
+ ]
516
+ };
345
517
  return [
346
518
  requestTransferRoute,
347
519
  getTransferProcessRoute,
348
520
  startTransferRoute,
349
521
  completeTransferRoute,
350
522
  suspendTransferRoute,
351
- terminateTransferRoute
523
+ terminateTransferRoute,
524
+ createDataspaceAppDatasetRoute,
525
+ listDataspaceAppDatasetsRoute,
526
+ getDataspaceAppDatasetRoute,
527
+ updateDataspaceAppDatasetRoute,
528
+ deleteDataspaceAppDatasetRoute
352
529
  ];
353
530
  }
354
531
  // ============================================================================
@@ -464,4 +641,93 @@ async function terminateTransferHandler(httpRequestContext, componentName, reque
464
641
  statusCode: transformErrorToStatusCode(result)
465
642
  };
466
643
  }
644
+ // ============================================================================
645
+ // App DATASET HANDLERS
646
+ // ============================================================================
647
+ /**
648
+ * Create app dataset handler.
649
+ * @param httpRequestContext The request context.
650
+ * @param componentName The name of the component to use.
651
+ * @param request The API request containing the dataset payload.
652
+ * @returns The response with a Location header pointing at the new resource.
653
+ */
654
+ async function createAppDatasetHandler(httpRequestContext, componentName, request) {
655
+ Guards.object(ROUTES_SOURCE, "request", request);
656
+ Guards.object(ROUTES_SOURCE, "request.body", request.body);
657
+ Guards.stringValue(ROUTES_SOURCE, "request.body.appId", request.body.appId);
658
+ Guards.object(ROUTES_SOURCE, "request.body.dataset", request.body.dataset);
659
+ const component = ComponentFactory.get(componentName);
660
+ const resolvedId = await component.createAppDataset(request.body.id, request.body.appId, request.body.dataset);
661
+ return {
662
+ statusCode: 201,
663
+ headers: {
664
+ [HeaderTypes.Location]: resolvedId
665
+ }
666
+ };
667
+ }
668
+ /**
669
+ * Get app dataset record handler.
670
+ * @param httpRequestContext The request context.
671
+ * @param componentName The name of the component to use.
672
+ * @param request The API request containing the stored app dataset id.
673
+ * @returns The response containing the stored app dataset record.
674
+ */
675
+ async function getAppDatasetHandler(httpRequestContext, componentName, request) {
676
+ Guards.object(ROUTES_SOURCE, "request", request);
677
+ Guards.object(ROUTES_SOURCE, "request.pathParams", request.pathParams);
678
+ Guards.stringValue(ROUTES_SOURCE, "request.pathParams.id", request.pathParams.id);
679
+ const component = ComponentFactory.get(componentName);
680
+ const result = await component.getAppDataset(request.pathParams.id);
681
+ return { body: result };
682
+ }
683
+ /**
684
+ * List app datasets handler.
685
+ * @param httpRequestContext The request context.
686
+ * @param componentName The name of the component to use.
687
+ * @param request The API request containing optional paging parameters.
688
+ * @returns The response containing the app datasets owned by the calling tenant.
689
+ */
690
+ async function listAppDatasetsHandler(httpRequestContext, componentName, request) {
691
+ Guards.object(ROUTES_SOURCE, "request", request);
692
+ const component = ComponentFactory.get(componentName);
693
+ const result = await component.listAppDatasets(request.query?.cursor, Coerce.integer(request.query?.limit));
694
+ return { body: result };
695
+ }
696
+ /**
697
+ * Update app dataset record handler.
698
+ * @param httpRequestContext The request context.
699
+ * @param componentName The name of the component to use.
700
+ * @param request The API request containing the updated app dataset payload.
701
+ * @returns Empty response on success.
702
+ */
703
+ async function updateAppDatasetHandler(httpRequestContext, componentName, request) {
704
+ Guards.object(ROUTES_SOURCE, "request", request);
705
+ Guards.object(ROUTES_SOURCE, "request.pathParams", request.pathParams);
706
+ Guards.stringValue(ROUTES_SOURCE, "request.pathParams.id", request.pathParams.id);
707
+ Guards.object(ROUTES_SOURCE, "request.body", request.body);
708
+ Guards.stringValue(ROUTES_SOURCE, "request.body.appId", request.body.appId);
709
+ Guards.object(ROUTES_SOURCE, "request.body.dataset", request.body.dataset);
710
+ const component = ComponentFactory.get(componentName);
711
+ await component.updateAppDataset(request.pathParams.id, request.body.appId, request.body.dataset);
712
+ return {
713
+ statusCode: HttpStatusCode.noContent
714
+ };
715
+ }
716
+ /**
717
+ * Delete app dataset record handler.
718
+ * @param httpRequestContext The request context.
719
+ * @param componentName The name of the component to use.
720
+ * @param request The API request containing the stored app dataset id.
721
+ * @returns Empty response on success.
722
+ */
723
+ async function deleteAppDatasetHandler(httpRequestContext, componentName, request) {
724
+ Guards.object(ROUTES_SOURCE, "request", request);
725
+ Guards.object(ROUTES_SOURCE, "request.pathParams", request.pathParams);
726
+ Guards.stringValue(ROUTES_SOURCE, "request.pathParams.id", request.pathParams.id);
727
+ const component = ComponentFactory.get(componentName);
728
+ await component.deleteAppDataset(request.pathParams.id);
729
+ return {
730
+ statusCode: HttpStatusCode.noContent
731
+ };
732
+ }
467
733
  //# sourceMappingURL=dataspaceControlPlaneRoutes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dataspaceControlPlaneRoutes.js","sourceRoot":"","sources":["../../src/dataspaceControlPlaneRoutes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type {\n\tIHostingComponent,\n\tIHttpRequestContext,\n\tIRestRoute,\n\tITag\n} from \"@twin.org/api-models\";\nimport { ComponentFactory, Guards } from \"@twin.org/core\";\nimport type {\n\tICompleteTransferRequest,\n\tICompleteTransferResponse,\n\tIDataspaceControlPlaneComponent,\n\tIGetTransferProcessRequest,\n\tIGetTransferProcessResponse,\n\tIRequestTransferRequest,\n\tIRequestTransferResponse,\n\tIStartTransferRequest,\n\tIStartTransferResponse,\n\tISuspendTransferRequest,\n\tISuspendTransferResponse,\n\tITerminateTransferRequest,\n\tITerminateTransferResponse\n} from \"@twin.org/dataspace-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport {\n\tDataspaceProtocolContexts,\n\tDataspaceProtocolTransferProcessStateType,\n\tDataspaceProtocolTransferProcessTypes\n} from \"@twin.org/standards-dataspace-protocol\";\nimport { HeaderHelper, HeaderTypes, MimeTypes } from \"@twin.org/web\";\nimport { transformErrorToStatusCode } from \"./utils/transferErrorUtils.js\";\n\n/**\n * The source used when communicating about these routes.\n */\nconst ROUTES_SOURCE = \"dataspaceControlPlaneRoutes\";\n\n/**\n * The tags to associate with the DSP protocol routes.\n */\nexport const tagsDataspaceControlPlane: ITag[] = [\n\t{\n\t\tname: \"Transfer Process\",\n\t\tdescription:\n\t\t\t\"DSP Transfer Process Protocol endpoints for initiating and managing data transfers.\"\n\t}\n];\n\n// Example objects for API documentation\nconst requestTransferExample = {\n\t\"@context\": DataspaceProtocolContexts.Context,\n\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferRequestMessage,\n\tprocessId: \"urn:uuid:consumer-process-12345\",\n\tconsumerPid: \"urn:uuid:consumer-process-12345\",\n\tproviderPid: \"urn:uuid:provider-process-12345\",\n\tagreementId: \"urn:uuid:agreement-12345\",\n\tdataAddress: {\n\t\t\"@type\": DataspaceProtocolTransferProcessTypes.DataAddress,\n\t\t\"@id\": \"https://provider.example.com/data\",\n\t\tendpointType: \"https://w3id.org/dspace/v1/HttpDataAddress\",\n\t\tbaseUrl: \"https://provider.example.com/data\"\n\t},\n\tcallbackAddress: \"https://consumer.example.com/transfer/webhook\",\n\tformat: \"urn:example:format\"\n};\n\nconst transferProcessExample = {\n\t\"@context\": DataspaceProtocolContexts.Context,\n\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferProcess,\n\tprocessId: \"urn:uuid:provider-process-12345\",\n\tconsumerPid: \"urn:uuid:consumer-process-12345\",\n\tproviderPid: \"urn:uuid:provider-process-12345\",\n\tstate: DataspaceProtocolTransferProcessStateType.STARTED,\n\tdataAddress: {\n\t\t\"@type\": DataspaceProtocolTransferProcessTypes.DataAddress,\n\t\t\"@id\": \"https://provider.example.com/data/transfer-12345\",\n\t\tendpointType: \"https://w3id.org/dspace/v1/HttpDataAddress\",\n\t\tbaseUrl: \"https://provider.example.com/data/transfer-12345\"\n\t}\n};\n\n/**\n * The REST routes for dataspace control plane (DSP Protocol only).\n * These routes implement the Eclipse Dataspace Protocol Transfer Process Protocol.\n *\n * Contract Negotiation is handled internally via PNP callbacks — no REST endpoints needed.\n * PNP registers its own inbound callback routes for negotiation messages from providers.\n *\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 DSP protocol routes.\n */\nexport function generateRestRoutesDataspaceControlPlane(\n\tbaseRouteName: string,\n\tcomponentName: string\n): IRestRoute[] {\n\t// ============================================================================\n\t// TRANSFER PROCESS PROTOCOL (DSP)\n\t// ============================================================================\n\n\t// POST /transfers/request - Request Transfer Process (DSP)\n\tconst requestTransferRoute: IRestRoute<IRequestTransferRequest, IRequestTransferResponse> = {\n\t\toperationId: \"requestTransfer\",\n\t\tsummary: \"Request Transfer Process (DSP)\",\n\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/transfers/request`,\n\t\tskipAuth: true,\n\t\tskipTenant: true,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\trequestTransferHandler(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\tmimeType: MimeTypes.JsonLd,\n\t\t\ttype: nameof<IRequestTransferRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"requestTransferRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t[HeaderTypes.Authorization]: \"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: requestTransferExample\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<IRequestTransferResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"requestTransferResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: transferProcessExample\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\t// GET /transfers/:pid - Get Transfer Process state (DSP)\n\tconst getTransferProcessRoute: IRestRoute<\n\t\tIGetTransferProcessRequest,\n\t\tIGetTransferProcessResponse\n\t> = {\n\t\toperationId: \"getTransferProcess\",\n\t\tsummary: \"Get Transfer Process state (DSP)\",\n\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/transfers/:pid`,\n\t\tskipAuth: true,\n\t\tskipTenant: true,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tgetTransferProcessHandler(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IGetTransferProcessRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"getTransferProcessRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t[HeaderTypes.Authorization]: \"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tpid: \"urn:uuid:provider-process-12345\"\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<IGetTransferProcessResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"getTransferProcessResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: transferProcessExample\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\t// POST /transfers/:pid/start - Start Transfer Process (DSP)\n\tconst startTransferRoute: IRestRoute<IStartTransferRequest, IStartTransferResponse> = {\n\t\toperationId: \"startTransfer\",\n\t\tsummary: \"Start Transfer Process (DSP)\",\n\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/transfers/:pid/start`,\n\t\tskipAuth: true,\n\t\tskipTenant: true,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tstartTransferHandler(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\tmimeType: MimeTypes.JsonLd,\n\t\t\ttype: nameof<IStartTransferRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"startTransferRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t[HeaderTypes.Authorization]: \"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tpid: \"urn:uuid:consumer-process-12345\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\"@context\": DataspaceProtocolContexts.Context,\n\t\t\t\t\t\t\t\"@type\": \"TransferStartMessage\",\n\t\t\t\t\t\t\tconsumerPid: \"urn:uuid:consumer-process-12345\",\n\t\t\t\t\t\t\tproviderPid: \"urn:uuid:provider-process-12345\"\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<IStartTransferResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"startTransferResponseExample\",\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\": DataspaceProtocolContexts.Context,\n\t\t\t\t\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferStartMessage,\n\t\t\t\t\t\t\t\tconsumerPid: \"urn:uuid:consumer-process-12345\",\n\t\t\t\t\t\t\t\tproviderPid: \"urn:uuid:provider-process-12345\"\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\t// POST /transfers/:pid/complete - Complete Transfer Process (DSP)\n\tconst completeTransferRoute: IRestRoute<ICompleteTransferRequest, ICompleteTransferResponse> = {\n\t\toperationId: \"completeTransfer\",\n\t\tsummary: \"Complete Transfer Process (DSP)\",\n\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/transfers/:pid/complete`,\n\t\tskipAuth: true,\n\t\tskipTenant: true,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tcompleteTransferHandler(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\tmimeType: MimeTypes.JsonLd,\n\t\t\ttype: nameof<ICompleteTransferRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"completeTransferRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t[HeaderTypes.Authorization]: \"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tpid: \"urn:uuid:consumer-process-12345\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\"@context\": DataspaceProtocolContexts.Context,\n\t\t\t\t\t\t\t\"@type\": \"TransferCompletionMessage\",\n\t\t\t\t\t\t\tconsumerPid: \"urn:uuid:consumer-process-12345\",\n\t\t\t\t\t\t\tproviderPid: \"urn:uuid:provider-process-12345\"\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<ICompleteTransferResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"completeTransferResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t...transferProcessExample,\n\t\t\t\t\t\t\t\tstate: DataspaceProtocolTransferProcessStateType.COMPLETED\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\t// POST /transfers/:pid/suspend - Suspend Transfer Process (DSP)\n\tconst suspendTransferRoute: IRestRoute<ISuspendTransferRequest, ISuspendTransferResponse> = {\n\t\toperationId: \"suspendTransfer\",\n\t\tsummary: \"Suspend Transfer Process (DSP)\",\n\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/transfers/:pid/suspend`,\n\t\tskipAuth: true,\n\t\tskipTenant: true,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tsuspendTransferHandler(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\tmimeType: MimeTypes.JsonLd,\n\t\t\ttype: nameof<ISuspendTransferRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"suspendTransferRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t[HeaderTypes.Authorization]: \"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tpid: \"urn:uuid:consumer-process-12345\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\"@context\": DataspaceProtocolContexts.Context,\n\t\t\t\t\t\t\t\"@type\": \"TransferSuspensionMessage\",\n\t\t\t\t\t\t\tconsumerPid: \"urn:uuid:consumer-process-12345\",\n\t\t\t\t\t\t\tproviderPid: \"urn:uuid:provider-process-12345\"\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<ISuspendTransferResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"suspendTransferResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t...transferProcessExample,\n\t\t\t\t\t\t\t\tstate: DataspaceProtocolTransferProcessStateType.SUSPENDED\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\t// POST /transfers/:pid/terminate - Terminate Transfer Process (DSP)\n\tconst terminateTransferRoute: IRestRoute<ITerminateTransferRequest, ITerminateTransferResponse> =\n\t\t{\n\t\t\toperationId: \"terminateTransfer\",\n\t\t\tsummary: \"Terminate Transfer Process (DSP)\",\n\t\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\t\tmethod: \"POST\",\n\t\t\tpath: `${baseRouteName}/transfers/:pid/terminate`,\n\t\t\tskipAuth: true,\n\t\t\tskipTenant: true,\n\t\t\thandler: async (httpRequestContext, request) =>\n\t\t\t\tterminateTransferHandler(httpRequestContext, componentName, request),\n\t\t\trequestType: {\n\t\t\t\tmimeType: MimeTypes.JsonLd,\n\t\t\t\ttype: nameof<ITerminateTransferRequest>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"terminateTransferRequestExample\",\n\t\t\t\t\t\trequest: {\n\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t[HeaderTypes.Authorization]: \"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\t\tpid: \"urn:uuid:consumer-process-12345\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\"@context\": DataspaceProtocolContexts.Context,\n\t\t\t\t\t\t\t\t\"@type\": \"TransferTerminationMessage\",\n\t\t\t\t\t\t\t\tconsumerPid: \"urn:uuid:consumer-process-12345\",\n\t\t\t\t\t\t\t\tproviderPid: \"urn:uuid:provider-process-12345\"\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\tresponseType: [\n\t\t\t\t{\n\t\t\t\t\ttype: nameof<ITerminateTransferResponse>(),\n\t\t\t\t\texamples: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"terminateTransferResponseExample\",\n\t\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\t...transferProcessExample,\n\t\t\t\t\t\t\t\t\tstate: DataspaceProtocolTransferProcessStateType.TERMINATED\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\n\treturn [\n\t\trequestTransferRoute,\n\t\tgetTransferProcessRoute,\n\t\tstartTransferRoute,\n\t\tcompleteTransferRoute,\n\t\tsuspendTransferRoute,\n\t\tterminateTransferRoute\n\t];\n}\n\n// ============================================================================\n// TRANSFER PROCESS PROTOCOL HANDLERS\n// ============================================================================\n\n/**\n * Request Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers and body.\n * @returns The response.\n */\nasync function requestTransferHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IRequestTransferRequest\n): Promise<IRequestTransferResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.requestTransfer(request.body, trustPayload);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n\n/**\n * Get Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers and path parameters.\n * @returns The response.\n */\nasync function getTransferProcessHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IGetTransferProcessRequest\n): Promise<IGetTransferProcessResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.pathParams), request.pathParams);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.pid), request.pathParams.pid);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.getTransferProcess(request.pathParams.pid, trustPayload);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n\n/**\n * Start Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers, path parameters, and body.\n * @returns The response.\n */\nasync function startTransferHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IStartTransferRequest\n): Promise<IStartTransferResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst hostingComponent = ComponentFactory.get<IHostingComponent>(\n\t\thttpRequestContext.hostingComponentType ?? \"hosting\"\n\t);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.startTransfer(\n\t\trequest.body,\n\t\tawait hostingComponent.getPublicOrigin(httpRequestContext.serverRequest.url),\n\t\ttrustPayload\n\t);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n\n/**\n * Complete Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers, path parameters, and body.\n * @returns The response.\n */\nasync function completeTransferHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ICompleteTransferRequest\n): Promise<ICompleteTransferResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.completeTransfer(request.body, trustPayload);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n\n/**\n * Suspend Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers, path parameters, and body.\n * @returns The response.\n */\nasync function suspendTransferHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ISuspendTransferRequest\n): Promise<ISuspendTransferResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.suspendTransfer(request.body, trustPayload);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n\n/**\n * Terminate Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers, path parameters, and body.\n * @returns The response.\n */\nasync function terminateTransferHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITerminateTransferRequest\n): Promise<ITerminateTransferResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.terminateTransfer(request.body, trustPayload);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n"]}
1
+ {"version":3,"file":"dataspaceControlPlaneRoutes.js","sourceRoot":"","sources":["../../src/dataspaceControlPlaneRoutes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type {\n\tIHostingComponent,\n\tIHttpRequestContext,\n\tINoContentResponse,\n\tINotFoundResponse,\n\tIRestRoute,\n\tITag\n} from \"@twin.org/api-models\";\nimport { Coerce, ComponentFactory, Guards } from \"@twin.org/core\";\nimport type {\n\tICompleteTransferRequest,\n\tICompleteTransferResponse,\n\tIDataspaceControlPlaneComponent,\n\tIGetTransferProcessRequest,\n\tIGetTransferProcessResponse,\n\tIAppDatasetCreateRequest,\n\tIAppDatasetCreateResponse,\n\tIAppDatasetDeleteRequest,\n\tIAppDatasetGetRequest,\n\tIAppDatasetGetResponse,\n\tIAppDatasetListRequest,\n\tIAppDatasetListResponse,\n\tIAppDatasetUpdateRequest,\n\tIRequestTransferRequest,\n\tIRequestTransferResponse,\n\tIStartTransferRequest,\n\tIStartTransferResponse,\n\tISuspendTransferRequest,\n\tISuspendTransferResponse,\n\tITerminateTransferRequest,\n\tITerminateTransferResponse\n} from \"@twin.org/dataspace-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport {\n\tDataspaceProtocolContexts,\n\tDataspaceProtocolTransferProcessStateType,\n\tDataspaceProtocolTransferProcessTypes\n} from \"@twin.org/standards-dataspace-protocol\";\nimport { HeaderHelper, HeaderTypes, HttpStatusCode, MimeTypes } from \"@twin.org/web\";\nimport { transformErrorToStatusCode } from \"./utils/transferErrorUtils.js\";\n\n/**\n * The source used when communicating about these routes.\n */\nconst ROUTES_SOURCE = \"dataspaceControlPlaneRoutes\";\n\n/**\n * The tags to associate with the DSP protocol routes.\n */\nexport const tagsDataspaceControlPlane: ITag[] = [\n\t{\n\t\tname: \"Transfer Process\",\n\t\tdescription:\n\t\t\t\"DSP Transfer Process Protocol endpoints for initiating and managing data transfers.\"\n\t},\n\t{\n\t\tname: \"Datasets\",\n\t\tdescription:\n\t\t\t\"Tenant-scoped CRUD over the datasets the Control Plane reads at start time to populate the federated catalogue.\"\n\t}\n];\n\n// Example objects for API documentation\nconst requestTransferExample = {\n\t\"@context\": DataspaceProtocolContexts.Context,\n\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferRequestMessage,\n\tprocessId: \"urn:uuid:consumer-process-12345\",\n\tconsumerPid: \"urn:uuid:consumer-process-12345\",\n\tproviderPid: \"urn:uuid:provider-process-12345\",\n\tagreementId: \"urn:uuid:agreement-12345\",\n\tdataAddress: {\n\t\t\"@type\": DataspaceProtocolTransferProcessTypes.DataAddress,\n\t\t\"@id\": \"https://provider.example.com/data\",\n\t\tendpointType: \"https://w3id.org/dspace/v1/HttpDataAddress\",\n\t\tbaseUrl: \"https://provider.example.com/data\"\n\t},\n\tcallbackAddress: \"https://consumer.example.com/transfer/webhook\",\n\tformat: \"urn:example:format\"\n};\n\nconst transferProcessExample = {\n\t\"@context\": DataspaceProtocolContexts.Context,\n\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferProcess,\n\tprocessId: \"urn:uuid:provider-process-12345\",\n\tconsumerPid: \"urn:uuid:consumer-process-12345\",\n\tproviderPid: \"urn:uuid:provider-process-12345\",\n\tstate: DataspaceProtocolTransferProcessStateType.STARTED,\n\tdataAddress: {\n\t\t\"@type\": DataspaceProtocolTransferProcessTypes.DataAddress,\n\t\t\"@id\": \"https://provider.example.com/data/transfer-12345\",\n\t\tendpointType: \"https://w3id.org/dspace/v1/HttpDataAddress\",\n\t\tbaseUrl: \"https://provider.example.com/data/transfer-12345\"\n\t}\n};\n\n/**\n * The REST routes for dataspace control plane (DSP Protocol only).\n * These routes implement the Eclipse Dataspace Protocol Transfer Process Protocol.\n *\n * Contract Negotiation is handled internally via PNP callbacks — no REST endpoints needed.\n * PNP registers its own inbound callback routes for negotiation messages from providers.\n *\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 DSP protocol routes.\n */\nexport function generateRestRoutesDataspaceControlPlane(\n\tbaseRouteName: string,\n\tcomponentName: string\n): IRestRoute[] {\n\t// ============================================================================\n\t// TRANSFER PROCESS PROTOCOL (DSP)\n\t// ============================================================================\n\n\t// POST /transfers/request - Request Transfer Process (DSP)\n\tconst requestTransferRoute: IRestRoute<IRequestTransferRequest, IRequestTransferResponse> = {\n\t\toperationId: \"requestTransfer\",\n\t\tsummary: \"Request Transfer Process (DSP)\",\n\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/transfers/request`,\n\t\tskipAuth: true,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\trequestTransferHandler(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\tmimeType: MimeTypes.JsonLd,\n\t\t\ttype: nameof<IRequestTransferRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"requestTransferRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t[HeaderTypes.Authorization]: \"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: requestTransferExample\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<IRequestTransferResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"requestTransferResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: transferProcessExample\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\t// GET /transfers/:pid - Get Transfer Process state (DSP)\n\tconst getTransferProcessRoute: IRestRoute<\n\t\tIGetTransferProcessRequest,\n\t\tIGetTransferProcessResponse\n\t> = {\n\t\toperationId: \"getTransferProcess\",\n\t\tsummary: \"Get Transfer Process state (DSP)\",\n\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/transfers/:pid`,\n\t\tskipAuth: true,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tgetTransferProcessHandler(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IGetTransferProcessRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"getTransferProcessRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t[HeaderTypes.Authorization]: \"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tpid: \"urn:uuid:provider-process-12345\"\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<IGetTransferProcessResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"getTransferProcessResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: transferProcessExample\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\t// POST /transfers/:pid/start - Start Transfer Process (DSP)\n\tconst startTransferRoute: IRestRoute<IStartTransferRequest, IStartTransferResponse> = {\n\t\toperationId: \"startTransfer\",\n\t\tsummary: \"Start Transfer Process (DSP)\",\n\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/transfers/:pid/start`,\n\t\tskipAuth: true,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tstartTransferHandler(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\tmimeType: MimeTypes.JsonLd,\n\t\t\ttype: nameof<IStartTransferRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"startTransferRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t[HeaderTypes.Authorization]: \"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tpid: \"urn:uuid:consumer-process-12345\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\"@context\": DataspaceProtocolContexts.Context,\n\t\t\t\t\t\t\t\"@type\": \"TransferStartMessage\",\n\t\t\t\t\t\t\tconsumerPid: \"urn:uuid:consumer-process-12345\",\n\t\t\t\t\t\t\tproviderPid: \"urn:uuid:provider-process-12345\"\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<IStartTransferResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"startTransferResponseExample\",\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\": DataspaceProtocolContexts.Context,\n\t\t\t\t\t\t\t\t\"@type\": DataspaceProtocolTransferProcessTypes.TransferStartMessage,\n\t\t\t\t\t\t\t\tconsumerPid: \"urn:uuid:consumer-process-12345\",\n\t\t\t\t\t\t\t\tproviderPid: \"urn:uuid:provider-process-12345\"\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\t// POST /transfers/:pid/complete - Complete Transfer Process (DSP)\n\tconst completeTransferRoute: IRestRoute<ICompleteTransferRequest, ICompleteTransferResponse> = {\n\t\toperationId: \"completeTransfer\",\n\t\tsummary: \"Complete Transfer Process (DSP)\",\n\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/transfers/:pid/complete`,\n\t\tskipAuth: true,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tcompleteTransferHandler(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\tmimeType: MimeTypes.JsonLd,\n\t\t\ttype: nameof<ICompleteTransferRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"completeTransferRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t[HeaderTypes.Authorization]: \"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tpid: \"urn:uuid:consumer-process-12345\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\"@context\": DataspaceProtocolContexts.Context,\n\t\t\t\t\t\t\t\"@type\": \"TransferCompletionMessage\",\n\t\t\t\t\t\t\tconsumerPid: \"urn:uuid:consumer-process-12345\",\n\t\t\t\t\t\t\tproviderPid: \"urn:uuid:provider-process-12345\"\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<ICompleteTransferResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"completeTransferResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t...transferProcessExample,\n\t\t\t\t\t\t\t\tstate: DataspaceProtocolTransferProcessStateType.COMPLETED\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\t// POST /transfers/:pid/suspend - Suspend Transfer Process (DSP)\n\tconst suspendTransferRoute: IRestRoute<ISuspendTransferRequest, ISuspendTransferResponse> = {\n\t\toperationId: \"suspendTransfer\",\n\t\tsummary: \"Suspend Transfer Process (DSP)\",\n\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/transfers/:pid/suspend`,\n\t\tskipAuth: true,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tsuspendTransferHandler(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\tmimeType: MimeTypes.JsonLd,\n\t\t\ttype: nameof<ISuspendTransferRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"suspendTransferRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t[HeaderTypes.Authorization]: \"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tpid: \"urn:uuid:consumer-process-12345\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\"@context\": DataspaceProtocolContexts.Context,\n\t\t\t\t\t\t\t\"@type\": \"TransferSuspensionMessage\",\n\t\t\t\t\t\t\tconsumerPid: \"urn:uuid:consumer-process-12345\",\n\t\t\t\t\t\t\tproviderPid: \"urn:uuid:provider-process-12345\"\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<ISuspendTransferResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"suspendTransferResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t...transferProcessExample,\n\t\t\t\t\t\t\t\tstate: DataspaceProtocolTransferProcessStateType.SUSPENDED\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\t// POST /transfers/:pid/terminate - Terminate Transfer Process (DSP)\n\tconst terminateTransferRoute: IRestRoute<ITerminateTransferRequest, ITerminateTransferResponse> =\n\t\t{\n\t\t\toperationId: \"terminateTransfer\",\n\t\t\tsummary: \"Terminate Transfer Process (DSP)\",\n\t\t\ttag: tagsDataspaceControlPlane[0].name,\n\t\t\tmethod: \"POST\",\n\t\t\tpath: `${baseRouteName}/transfers/:pid/terminate`,\n\t\t\tskipAuth: true,\n\t\t\thandler: async (httpRequestContext, request) =>\n\t\t\t\tterminateTransferHandler(httpRequestContext, componentName, request),\n\t\t\trequestType: {\n\t\t\t\tmimeType: MimeTypes.JsonLd,\n\t\t\t\ttype: nameof<ITerminateTransferRequest>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"terminateTransferRequestExample\",\n\t\t\t\t\t\trequest: {\n\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t[HeaderTypes.Authorization]: \"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\t\tpid: \"urn:uuid:consumer-process-12345\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\"@context\": DataspaceProtocolContexts.Context,\n\t\t\t\t\t\t\t\t\"@type\": \"TransferTerminationMessage\",\n\t\t\t\t\t\t\t\tconsumerPid: \"urn:uuid:consumer-process-12345\",\n\t\t\t\t\t\t\t\tproviderPid: \"urn:uuid:provider-process-12345\"\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\tresponseType: [\n\t\t\t\t{\n\t\t\t\t\ttype: nameof<ITerminateTransferResponse>(),\n\t\t\t\t\texamples: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"terminateTransferResponseExample\",\n\t\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\t...transferProcessExample,\n\t\t\t\t\t\t\t\t\tstate: DataspaceProtocolTransferProcessStateType.TERMINATED\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\n\t// ============================================================================\n\t// DATASPACE APP DATASET MANAGEMENT\n\t// ============================================================================\n\n\tconst createDataspaceAppDatasetRoute: IRestRoute<\n\t\tIAppDatasetCreateRequest,\n\t\tIAppDatasetCreateResponse\n\t> = {\n\t\toperationId: \"datasetCreate\",\n\t\tsummary: \"Register an app dataset for the calling tenant.\",\n\t\ttag: tagsDataspaceControlPlane[1].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/app-datasets`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tcreateAppDatasetHandler(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IAppDatasetCreateRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"datasetCreateRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tappId: \"https://twin.example.org/app1\",\n\t\t\t\t\t\t\tdataset: {\n\t\t\t\t\t\t\t\t\"@context\": DataspaceProtocolContexts.Context,\n\t\t\t\t\t\t\t\t\"@type\": \"Dataset\",\n\t\t\t\t\t\t\t\t\"@id\": \"https://twin.example.org/data-service-1\",\n\t\t\t\t\t\t\t\thasPolicy: [],\n\t\t\t\t\t\t\t\tdistribution: []\n\t\t\t\t\t\t\t} as never\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<IAppDatasetCreateResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"datasetCreateResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tstatusCode: 201,\n\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t[HeaderTypes.Location]: \"https://twin.example.org/data-service-1\"\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 getDataspaceAppDatasetRoute: IRestRoute<IAppDatasetGetRequest, IAppDatasetGetResponse> = {\n\t\toperationId: \"datasetGet\",\n\t\tsummary: \"Retrieve an app dataset owned by the calling tenant.\",\n\t\ttag: tagsDataspaceControlPlane[1].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/app-datasets/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tgetAppDatasetHandler(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IAppDatasetGetRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"datasetGetRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: { id: \"dataspace-app-dataset-1\" }\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<IAppDatasetGetResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\tconst listDataspaceAppDatasetsRoute: IRestRoute<IAppDatasetListRequest, IAppDatasetListResponse> =\n\t\t{\n\t\t\toperationId: \"datasetList\",\n\t\t\tsummary: \"List the app datasets owned by the calling tenant.\",\n\t\t\ttag: tagsDataspaceControlPlane[1].name,\n\t\t\tmethod: \"GET\",\n\t\t\tpath: `${baseRouteName}/app-datasets`,\n\t\t\thandler: async (httpRequestContext, request) =>\n\t\t\t\tlistAppDatasetsHandler(httpRequestContext, componentName, request),\n\t\t\trequestType: {\n\t\t\t\ttype: nameof<IAppDatasetListRequest>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"datasetListRequestExample\",\n\t\t\t\t\t\trequest: {}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\tresponseType: [\n\t\t\t\t{\n\t\t\t\t\ttype: nameof<IAppDatasetListResponse>()\n\t\t\t\t}\n\t\t\t]\n\t\t};\n\n\tconst updateDataspaceAppDatasetRoute: IRestRoute<IAppDatasetUpdateRequest, INoContentResponse> = {\n\t\toperationId: \"datasetUpdate\",\n\t\tsummary: \"Update an app dataset owned by the calling tenant.\",\n\t\ttag: tagsDataspaceControlPlane[1].name,\n\t\tmethod: \"PUT\",\n\t\tpath: `${baseRouteName}/app-datasets/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tupdateAppDatasetHandler(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IAppDatasetUpdateRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"datasetUpdateRequestExample\",\n\t\t\t\t\t// `dataset[\"@id\"]` is intentionally omitted — the path id is\n\t\t\t\t\t// authoritative and any body `@id` is stripped before storage.\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: { id: \"dataspace-app-dataset-1\" },\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tappId: \"https://twin.example.org/app1\",\n\t\t\t\t\t\t\tdataset: {\n\t\t\t\t\t\t\t\t\"@context\": DataspaceProtocolContexts.Context,\n\t\t\t\t\t\t\t\t\"@type\": \"Dataset\",\n\t\t\t\t\t\t\t\thasPolicy: [],\n\t\t\t\t\t\t\t\tdistribution: []\n\t\t\t\t\t\t\t} as never\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<INoContentResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"datasetUpdateResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tstatusCode: HttpStatusCode.noContent\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\t{\n\t\t\t\ttype: nameof<INotFoundResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\tconst deleteDataspaceAppDatasetRoute: IRestRoute<IAppDatasetDeleteRequest, INoContentResponse> = {\n\t\toperationId: \"datasetDelete\",\n\t\tsummary: \"Delete an app dataset owned by the calling tenant.\",\n\t\ttag: tagsDataspaceControlPlane[1].name,\n\t\tmethod: \"DELETE\",\n\t\tpath: `${baseRouteName}/app-datasets/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tdeleteAppDatasetHandler(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IAppDatasetDeleteRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"datasetDeleteRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: { id: \"dataspace-app-dataset-1\" }\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<INoContentResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"datasetDeleteResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tstatusCode: HttpStatusCode.noContent\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\t{\n\t\t\t\ttype: nameof<INotFoundResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\treturn [\n\t\trequestTransferRoute,\n\t\tgetTransferProcessRoute,\n\t\tstartTransferRoute,\n\t\tcompleteTransferRoute,\n\t\tsuspendTransferRoute,\n\t\tterminateTransferRoute,\n\t\tcreateDataspaceAppDatasetRoute,\n\t\tlistDataspaceAppDatasetsRoute,\n\t\tgetDataspaceAppDatasetRoute,\n\t\tupdateDataspaceAppDatasetRoute,\n\t\tdeleteDataspaceAppDatasetRoute\n\t];\n}\n\n// ============================================================================\n// TRANSFER PROCESS PROTOCOL HANDLERS\n// ============================================================================\n\n/**\n * Request Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers and body.\n * @returns The response.\n */\nasync function requestTransferHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IRequestTransferRequest\n): Promise<IRequestTransferResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.requestTransfer(request.body, trustPayload);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n\n/**\n * Get Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers and path parameters.\n * @returns The response.\n */\nasync function getTransferProcessHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IGetTransferProcessRequest\n): Promise<IGetTransferProcessResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.pathParams), request.pathParams);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.pid), request.pathParams.pid);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.getTransferProcess(request.pathParams.pid, trustPayload);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n\n/**\n * Start Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers, path parameters, and body.\n * @returns The response.\n */\nasync function startTransferHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IStartTransferRequest\n): Promise<IStartTransferResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst hostingComponent = ComponentFactory.get<IHostingComponent>(\n\t\thttpRequestContext.hostingComponentType ?? \"hosting\"\n\t);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.startTransfer(\n\t\trequest.body,\n\t\tawait hostingComponent.getPublicOrigin(httpRequestContext.serverRequest.url),\n\t\ttrustPayload\n\t);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n\n/**\n * Complete Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers, path parameters, and body.\n * @returns The response.\n */\nasync function completeTransferHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ICompleteTransferRequest\n): Promise<ICompleteTransferResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.completeTransfer(request.body, trustPayload);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n\n/**\n * Suspend Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers, path parameters, and body.\n * @returns The response.\n */\nasync function suspendTransferHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ISuspendTransferRequest\n): Promise<ISuspendTransferResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.suspendTransfer(request.body, trustPayload);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n\n/**\n * Terminate Transfer Process handler.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use.\n * @param request The API request containing headers, path parameters, and body.\n * @returns The response.\n */\nasync function terminateTransferHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITerminateTransferRequest\n): Promise<ITerminateTransferResponse> {\n\tGuards.object(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\n\tconst trustPayload = HeaderHelper.extractBearer(request.headers[HeaderTypes.Authorization]);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.terminateTransfer(request.body, trustPayload);\n\n\treturn {\n\t\tbody: result,\n\t\tstatusCode: transformErrorToStatusCode(result)\n\t};\n}\n\n// ============================================================================\n// App DATASET HANDLERS\n// ============================================================================\n\n/**\n * Create app dataset handler.\n * @param httpRequestContext The request context.\n * @param componentName The name of the component to use.\n * @param request The API request containing the dataset payload.\n * @returns The response with a Location header pointing at the new resource.\n */\nasync function createAppDatasetHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IAppDatasetCreateRequest\n): Promise<IAppDatasetCreateResponse> {\n\tGuards.object<IAppDatasetCreateRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.body.appId), request.body.appId);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body.dataset), request.body.dataset);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst resolvedId = await component.createAppDataset(\n\t\trequest.body.id,\n\t\trequest.body.appId,\n\t\trequest.body.dataset\n\t);\n\n\treturn {\n\t\tstatusCode: 201,\n\t\theaders: {\n\t\t\t[HeaderTypes.Location]: resolvedId\n\t\t}\n\t};\n}\n\n/**\n * Get app dataset record handler.\n * @param httpRequestContext The request context.\n * @param componentName The name of the component to use.\n * @param request The API request containing the stored app dataset id.\n * @returns The response containing the stored app dataset record.\n */\nasync function getAppDatasetHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IAppDatasetGetRequest\n): Promise<IAppDatasetGetResponse> {\n\tGuards.object<IAppDatasetGetRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.pathParams), request.pathParams);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.getAppDataset(request.pathParams.id);\n\n\treturn { body: result };\n}\n\n/**\n * List app datasets handler.\n * @param httpRequestContext The request context.\n * @param componentName The name of the component to use.\n * @param request The API request containing optional paging parameters.\n * @returns The response containing the app datasets owned by the calling tenant.\n */\nasync function listAppDatasetsHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IAppDatasetListRequest\n): Promise<IAppDatasetListResponse> {\n\tGuards.object<IAppDatasetListRequest>(ROUTES_SOURCE, nameof(request), request);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.listAppDatasets(\n\t\trequest.query?.cursor,\n\t\tCoerce.integer(request.query?.limit)\n\t);\n\n\treturn { body: result };\n}\n\n/**\n * Update app dataset record handler.\n * @param httpRequestContext The request context.\n * @param componentName The name of the component to use.\n * @param request The API request containing the updated app dataset payload.\n * @returns Empty response on success.\n */\nasync function updateAppDatasetHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IAppDatasetUpdateRequest\n): Promise<INoContentResponse> {\n\tGuards.object<IAppDatasetUpdateRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.pathParams), request.pathParams);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body), request.body);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.body.appId), request.body.appId);\n\tGuards.object(ROUTES_SOURCE, nameof(request.body.dataset), request.body.dataset);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tawait component.updateAppDataset(request.pathParams.id, request.body.appId, request.body.dataset);\n\n\treturn {\n\t\tstatusCode: HttpStatusCode.noContent\n\t};\n}\n\n/**\n * Delete app dataset record handler.\n * @param httpRequestContext The request context.\n * @param componentName The name of the component to use.\n * @param request The API request containing the stored app dataset id.\n * @returns Empty response on success.\n */\nasync function deleteAppDatasetHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IAppDatasetDeleteRequest\n): Promise<INoContentResponse> {\n\tGuards.object<IAppDatasetDeleteRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object(ROUTES_SOURCE, nameof(request.pathParams), request.pathParams);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tawait component.deleteAppDataset(request.pathParams.id);\n\n\treturn {\n\t\tstatusCode: HttpStatusCode.noContent\n\t};\n}\n"]}