@twin.org/dataspace-control-plane-service 0.9.0 → 0.9.1-next.10

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.
Files changed (46) hide show
  1. package/README.md +1 -1
  2. package/dist/es/dataspaceControlPlaneRoutes.js +79 -7
  3. package/dist/es/dataspaceControlPlaneRoutes.js.map +1 -1
  4. package/dist/es/dataspaceControlPlaneService.js +121 -356
  5. package/dist/es/dataspaceControlPlaneService.js.map +1 -1
  6. package/dist/es/factories/transferHandlerFactory.js +11 -0
  7. package/dist/es/factories/transferHandlerFactory.js.map +1 -0
  8. package/dist/es/handlers/httpDataPostTransferHandler.js +111 -0
  9. package/dist/es/handlers/httpDataPostTransferHandler.js.map +1 -0
  10. package/dist/es/handlers/httpDataPullTransferHandler.js +108 -0
  11. package/dist/es/handlers/httpDataPullTransferHandler.js.map +1 -0
  12. package/dist/es/handlers/httpDataPushTransferHandler.js +114 -0
  13. package/dist/es/handlers/httpDataPushTransferHandler.js.map +1 -0
  14. package/dist/es/index.js +7 -0
  15. package/dist/es/index.js.map +1 -1
  16. package/dist/es/models/IDataspaceControlPlaneServiceConfig.js.map +1 -1
  17. package/dist/es/models/ITransferHandler.js +2 -0
  18. package/dist/es/models/ITransferHandler.js.map +1 -0
  19. package/dist/es/models/ITransferHandlerPrepareContext.js +4 -0
  20. package/dist/es/models/ITransferHandlerPrepareContext.js.map +1 -0
  21. package/dist/es/models/ITransferHandlerStartContext.js +2 -0
  22. package/dist/es/models/ITransferHandlerStartContext.js.map +1 -0
  23. package/dist/types/dataspaceControlPlaneRoutes.d.ts +1 -1
  24. package/dist/types/dataspaceControlPlaneService.d.ts +6 -1
  25. package/dist/types/factories/transferHandlerFactory.d.ts +8 -0
  26. package/dist/types/handlers/httpDataPostTransferHandler.d.ts +63 -0
  27. package/dist/types/handlers/httpDataPullTransferHandler.d.ts +63 -0
  28. package/dist/types/handlers/httpDataPushTransferHandler.d.ts +68 -0
  29. package/dist/types/index.d.ts +7 -0
  30. package/dist/types/models/IDataspaceControlPlaneServiceConfig.d.ts +10 -5
  31. package/dist/types/models/ITransferHandler.d.ts +62 -0
  32. package/dist/types/models/ITransferHandlerPrepareContext.d.ts +21 -0
  33. package/dist/types/models/ITransferHandlerStartContext.d.ts +31 -0
  34. package/docs/changelog.md +190 -0
  35. package/docs/reference/classes/DataspaceControlPlaneService.md +18 -0
  36. package/docs/reference/classes/HttpDataPostTransferHandler.md +235 -0
  37. package/docs/reference/classes/HttpDataPullTransferHandler.md +235 -0
  38. package/docs/reference/classes/HttpDataPushTransferHandler.md +242 -0
  39. package/docs/reference/index.md +7 -0
  40. package/docs/reference/interfaces/IDataspaceControlPlaneServiceConfig.md +10 -5
  41. package/docs/reference/interfaces/ITransferHandler.md +180 -0
  42. package/docs/reference/interfaces/ITransferHandlerPrepareContext.md +35 -0
  43. package/docs/reference/interfaces/ITransferHandlerStartContext.md +51 -0
  44. package/docs/reference/variables/TransferHandlerFactory.md +7 -0
  45. package/locales/en.json +14 -11
  46. package/package.json +18 -18
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  This package implements agreement negotiation and transfer process lifecycle management for control plane operations. It coordinates protocol-compliant state transitions and persists transfer state that can be consumed by downstream data plane components.
4
4
 
5
- Its behaviour follows the [Eclipse Dataspace Protocol](https://eclipse-dataspace-protocol-base.github.io/DataspaceProtocol/) and is designed for policy-aware transfer orchestration.
5
+ Its behaviour follows the [Eclipse Dataspace Protocol](https://eclipse-dataspace-protocol-base.github.io/DataspaceProtocol/) and is designed for policy-aware transfer orchestration. For the architectural context see the [dataspace architecture documentation](https://github.com/iotaledger/twin-dataspace/blob/next/docs/architecture/dataspace.mdx).
6
6
 
7
7
  ## Installation
8
8
 
@@ -1,3 +1,7 @@
1
+ // Copyright 2025 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
3
+ import { HttpContextIdKeys, HttpHeaderHelper, HttpUrlHelper } from "@twin.org/api-models";
4
+ import { ContextIdStore } from "@twin.org/context";
1
5
  import { Coerce, ComponentFactory, Guards } from "@twin.org/core";
2
6
  import { DataspaceProtocolContexts, DataspaceProtocolTransferProcessStateType, DataspaceProtocolTransferProcessTypes } from "@twin.org/standards-dataspace-protocol";
3
7
  import { HeaderHelper, HeaderTypes, HttpStatusCode, MimeTypes } from "@twin.org/web";
@@ -17,6 +21,10 @@ export const tagsDataspaceControlPlane = [
17
21
  {
18
22
  name: "Datasets",
19
23
  description: "Tenant-scoped CRUD over the datasets the Control Plane reads at start time to populate the federated catalogue."
24
+ },
25
+ {
26
+ name: "Version Discovery",
27
+ description: "RFC 8615 well-known endpoint for advertising the Dataspace Protocol versions supported by this connector."
20
28
  }
21
29
  ];
22
30
  // Example objects for API documentation
@@ -341,6 +349,51 @@ export function generateRestRoutesDataspaceControlPlane(baseRouteName, component
341
349
  ]
342
350
  };
343
351
  // ============================================================================
352
+ // DSP VERSION DISCOVERY
353
+ // ============================================================================
354
+ // GET /.well-known/dspace-version - DSP version discovery (unauthenticated, RFC 8615)
355
+ const getProtocolVersionsRoute = {
356
+ operationId: "getProtocolVersions",
357
+ summary: "Get supported Dataspace Protocol versions (DSP 2025-1)",
358
+ tag: tagsDataspaceControlPlane[2].name,
359
+ method: "GET",
360
+ path: "/.well-known/dspace-version",
361
+ skipAuth: true,
362
+ skipTenant: true,
363
+ handler: async (httpRequestContext, request) => getProtocolVersionsHandler(httpRequestContext, componentName, request),
364
+ requestType: {
365
+ type: "INoContentRequest",
366
+ examples: [
367
+ {
368
+ id: "getProtocolVersionsRequestExample",
369
+ request: {}
370
+ }
371
+ ]
372
+ },
373
+ responseType: [
374
+ {
375
+ type: "IGetProtocolVersionsResponse",
376
+ examples: [
377
+ {
378
+ id: "getProtocolVersionsResponseExample",
379
+ response: {
380
+ body: {
381
+ protocolVersions: [
382
+ {
383
+ version: "2025-1",
384
+ path: "/dataspace-control-plane/2025-1",
385
+ binding: "HTTPS",
386
+ serviceId: "twin-connector"
387
+ }
388
+ ]
389
+ }
390
+ }
391
+ }
392
+ ]
393
+ }
394
+ ]
395
+ };
396
+ // ============================================================================
344
397
  // DATASPACE APP DATASET MANAGEMENT
345
398
  // ============================================================================
346
399
  const createDataspaceAppDatasetRoute = {
@@ -349,7 +402,7 @@ export function generateRestRoutesDataspaceControlPlane(baseRouteName, component
349
402
  tag: tagsDataspaceControlPlane[1].name,
350
403
  method: "POST",
351
404
  path: `${baseRouteName}/app-datasets`,
352
- handler: async (httpRequestContext, request) => createAppDatasetHandler(httpRequestContext, componentName, request),
405
+ handler: async (httpRequestContext, request) => createAppDatasetHandler(httpRequestContext, componentName, request, baseRouteName),
353
406
  requestType: {
354
407
  type: "IAppDatasetCreateRequest",
355
408
  examples: [
@@ -515,6 +568,7 @@ export function generateRestRoutesDataspaceControlPlane(baseRouteName, component
515
568
  ]
516
569
  };
517
570
  return [
571
+ getProtocolVersionsRoute,
518
572
  requestTransferRoute,
519
573
  getTransferProcessRoute,
520
574
  startTransferRoute,
@@ -529,6 +583,21 @@ export function generateRestRoutesDataspaceControlPlane(baseRouteName, component
529
583
  ];
530
584
  }
531
585
  // ============================================================================
586
+ // DSP VERSION DISCOVERY HANDLER
587
+ // ============================================================================
588
+ /**
589
+ * Get Protocol Versions handler.
590
+ * @param httpRequestContext The request context for the API.
591
+ * @param componentName The name of the component to use.
592
+ * @param request The API request (no parameters required).
593
+ * @returns The response with the list of supported DSP versions.
594
+ */
595
+ async function getProtocolVersionsHandler(httpRequestContext, componentName, request) {
596
+ const component = ComponentFactory.get(componentName);
597
+ const result = await component.getProtocolVersions();
598
+ return { body: result };
599
+ }
600
+ // ============================================================================
532
601
  // TRANSFER PROCESS PROTOCOL HANDLERS
533
602
  // ============================================================================
534
603
  /**
@@ -648,20 +717,23 @@ async function terminateTransferHandler(httpRequestContext, componentName, reque
648
717
  * @param httpRequestContext The request context.
649
718
  * @param componentName The name of the component to use.
650
719
  * @param request The API request containing the dataset payload.
720
+ * @param baseRouteName The base route name for constructing the Location header.
651
721
  * @returns The response with a Location header pointing at the new resource.
652
722
  */
653
- async function createAppDatasetHandler(httpRequestContext, componentName, request) {
723
+ async function createAppDatasetHandler(httpRequestContext, componentName, request, baseRouteName) {
654
724
  Guards.object(ROUTES_SOURCE, "request", request);
655
725
  Guards.object(ROUTES_SOURCE, "request.body", request.body);
656
726
  Guards.stringValue(ROUTES_SOURCE, "request.body.appId", request.body.appId);
657
727
  Guards.object(ROUTES_SOURCE, "request.body.dataset", request.body.dataset);
658
728
  const component = ComponentFactory.get(componentName);
659
- const resolvedId = await component.createAppDataset(request.body.id, request.body.appId, request.body.dataset);
729
+ const id = await component.createAppDataset(request.body.id, request.body.appId, request.body.dataset);
730
+ const contextIds = await ContextIdStore.getContextIds();
731
+ const publicOrigin = contextIds?.[HttpContextIdKeys.PublicOrigin];
732
+ const headers = {};
733
+ HttpHeaderHelper.buildId(headers, id, HttpUrlHelper.combineOriginPath(publicOrigin, `${baseRouteName}/app-datasets/:id`));
660
734
  return {
661
- statusCode: 201,
662
- headers: {
663
- [HeaderTypes.Location]: resolvedId
664
- }
735
+ statusCode: HttpStatusCode.created,
736
+ headers
665
737
  };
666
738
  }
667
739
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"dataspaceControlPlaneRoutes.js","sourceRoot":"","sources":["../../src/dataspaceControlPlaneRoutes.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAyBlE,OAAO,EACN,yBAAyB,EACzB,yCAAyC,EACzC,qCAAqC,EACrC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAE3E;;GAEG;AACH,MAAM,aAAa,GAAG,6BAA6B,CAAC;AAEpD;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAW;IAChD;QACC,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACV,qFAAqF;KACtF;IACD;QACC,IAAI,EAAE,UAAU;QAChB,WAAW,EACV,iHAAiH;KAClH;CACD,CAAC;AAEF,wCAAwC;AACxC,MAAM,sBAAsB,GAAG;IAC9B,UAAU,EAAE,yBAAyB,CAAC,OAAO;IAC7C,OAAO,EAAE,qCAAqC,CAAC,sBAAsB;IACrE,SAAS,EAAE,iCAAiC;IAC5C,WAAW,EAAE,iCAAiC;IAC9C,WAAW,EAAE,iCAAiC;IAC9C,WAAW,EAAE,0BAA0B;IACvC,WAAW,EAAE;QACZ,OAAO,EAAE,qCAAqC,CAAC,WAAW;QAC1D,KAAK,EAAE,mCAAmC;QAC1C,YAAY,EAAE,4CAA4C;QAC1D,OAAO,EAAE,mCAAmC;KAC5C;IACD,eAAe,EAAE,+CAA+C;IAChE,MAAM,EAAE,oBAAoB;CAC5B,CAAC;AAEF,MAAM,sBAAsB,GAAG;IAC9B,UAAU,EAAE,yBAAyB,CAAC,OAAO;IAC7C,OAAO,EAAE,qCAAqC,CAAC,eAAe;IAC9D,SAAS,EAAE,iCAAiC;IAC5C,WAAW,EAAE,iCAAiC;IAC9C,WAAW,EAAE,iCAAiC;IAC9C,KAAK,EAAE,yCAAyC,CAAC,OAAO;IACxD,WAAW,EAAE;QACZ,OAAO,EAAE,qCAAqC,CAAC,WAAW;QAC1D,KAAK,EAAE,kDAAkD;QACzD,YAAY,EAAE,4CAA4C;QAC1D,OAAO,EAAE,kDAAkD;KAC3D;CACD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uCAAuC,CACtD,aAAqB,EACrB,aAAqB;IAErB,+EAA+E;IAC/E,kCAAkC;IAClC,+EAA+E;IAE/E,2DAA2D;IAC3D,MAAM,oBAAoB,GAAkE;QAC3F,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE,gCAAgC;QACzC,GAAG,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI;QACtC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,GAAG,aAAa,oBAAoB;QAC1C,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAC9C,sBAAsB,CAAC,kBAAkB,EAAE,aAAa,EAAE,OAAO,CAAC;QACnE,WAAW,EAAE;YACZ,QAAQ,EAAE,SAAS,CAAC,MAAM;YAC1B,IAAI,2BAAmC;YACvC,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,+BAA+B;oBACnC,OAAO,EAAE;wBACR,OAAO,EAAE;4BACR,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,gDAAgD;yBAC7E;wBACD,IAAI,EAAE,sBAAsB;qBAC5B;iBACD;aACD;SACD;QACD,YAAY,EAAE;YACb;gBACC,IAAI,4BAAoC;gBACxC,QAAQ,EAAE;oBACT;wBACC,EAAE,EAAE,gCAAgC;wBACpC,QAAQ,EAAE;4BACT,IAAI,EAAE,sBAAsB;yBAC5B;qBACD;iBACD;aACD;SACD;KACD,CAAC;IAEF,yDAAyD;IACzD,MAAM,uBAAuB,GAGzB;QACH,WAAW,EAAE,oBAAoB;QACjC,OAAO,EAAE,kCAAkC;QAC3C,GAAG,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI;QACtC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,GAAG,aAAa,iBAAiB;QACvC,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAC9C,yBAAyB,CAAC,kBAAkB,EAAE,aAAa,EAAE,OAAO,CAAC;QACtE,WAAW,EAAE;YACZ,IAAI,8BAAsC;YAC1C,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,kCAAkC;oBACtC,OAAO,EAAE;wBACR,OAAO,EAAE;4BACR,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,gDAAgD;yBAC7E;wBACD,UAAU,EAAE;4BACX,GAAG,EAAE,iCAAiC;yBACtC;qBACD;iBACD;aACD;SACD;QACD,YAAY,EAAE;YACb;gBACC,IAAI,+BAAuC;gBAC3C,QAAQ,EAAE;oBACT;wBACC,EAAE,EAAE,mCAAmC;wBACvC,QAAQ,EAAE;4BACT,IAAI,EAAE,sBAAsB;yBAC5B;qBACD;iBACD;aACD;SACD;KACD,CAAC;IAEF,4DAA4D;IAC5D,MAAM,kBAAkB,GAA8D;QACrF,WAAW,EAAE,eAAe;QAC5B,OAAO,EAAE,8BAA8B;QACvC,GAAG,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI;QACtC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,GAAG,aAAa,uBAAuB;QAC7C,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAC9C,oBAAoB,CAAC,kBAAkB,EAAE,aAAa,EAAE,OAAO,CAAC;QACjE,WAAW,EAAE;YACZ,QAAQ,EAAE,SAAS,CAAC,MAAM;YAC1B,IAAI,yBAAiC;YACrC,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,6BAA6B;oBACjC,OAAO,EAAE;wBACR,OAAO,EAAE;4BACR,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,gDAAgD;yBAC7E;wBACD,UAAU,EAAE;4BACX,GAAG,EAAE,iCAAiC;yBACtC;wBACD,IAAI,EAAE;4BACL,UAAU,EAAE,yBAAyB,CAAC,OAAO;4BAC7C,OAAO,EAAE,sBAAsB;4BAC/B,WAAW,EAAE,iCAAiC;4BAC9C,WAAW,EAAE,iCAAiC;yBAC9C;qBACD;iBACD;aACD;SACD;QACD,YAAY,EAAE;YACb;gBACC,IAAI,0BAAkC;gBACtC,QAAQ,EAAE;oBACT;wBACC,EAAE,EAAE,8BAA8B;wBAClC,QAAQ,EAAE;4BACT,IAAI,EAAE;gCACL,UAAU,EAAE,yBAAyB,CAAC,OAAO;gCAC7C,OAAO,EAAE,qCAAqC,CAAC,oBAAoB;gCACnE,WAAW,EAAE,iCAAiC;gCAC9C,WAAW,EAAE,iCAAiC;6BAC9C;yBACD;qBACD;iBACD;aACD;SACD;KACD,CAAC;IAEF,kEAAkE;IAClE,MAAM,qBAAqB,GAAoE;QAC9F,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EAAE,iCAAiC;QAC1C,GAAG,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI;QACtC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,GAAG,aAAa,0BAA0B;QAChD,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAC9C,uBAAuB,CAAC,kBAAkB,EAAE,aAAa,EAAE,OAAO,CAAC;QACpE,WAAW,EAAE;YACZ,QAAQ,EAAE,SAAS,CAAC,MAAM;YAC1B,IAAI,4BAAoC;YACxC,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,gCAAgC;oBACpC,OAAO,EAAE;wBACR,OAAO,EAAE;4BACR,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,gDAAgD;yBAC7E;wBACD,UAAU,EAAE;4BACX,GAAG,EAAE,iCAAiC;yBACtC;wBACD,IAAI,EAAE;4BACL,UAAU,EAAE,yBAAyB,CAAC,OAAO;4BAC7C,OAAO,EAAE,2BAA2B;4BACpC,WAAW,EAAE,iCAAiC;4BAC9C,WAAW,EAAE,iCAAiC;yBAC9C;qBACD;iBACD;aACD;SACD;QACD,YAAY,EAAE;YACb;gBACC,IAAI,6BAAqC;gBACzC,QAAQ,EAAE;oBACT;wBACC,EAAE,EAAE,iCAAiC;wBACrC,QAAQ,EAAE;4BACT,IAAI,EAAE;gCACL,GAAG,sBAAsB;gCACzB,KAAK,EAAE,yCAAyC,CAAC,SAAS;6BAC1D;yBACD;qBACD;iBACD;aACD;SACD;KACD,CAAC;IAEF,gEAAgE;IAChE,MAAM,oBAAoB,GAAkE;QAC3F,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE,gCAAgC;QACzC,GAAG,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI;QACtC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,GAAG,aAAa,yBAAyB;QAC/C,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAC9C,sBAAsB,CAAC,kBAAkB,EAAE,aAAa,EAAE,OAAO,CAAC;QACnE,WAAW,EAAE;YACZ,QAAQ,EAAE,SAAS,CAAC,MAAM;YAC1B,IAAI,2BAAmC;YACvC,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,+BAA+B;oBACnC,OAAO,EAAE;wBACR,OAAO,EAAE;4BACR,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,gDAAgD;yBAC7E;wBACD,UAAU,EAAE;4BACX,GAAG,EAAE,iCAAiC;yBACtC;wBACD,IAAI,EAAE;4BACL,UAAU,EAAE,yBAAyB,CAAC,OAAO;4BAC7C,OAAO,EAAE,2BAA2B;4BACpC,WAAW,EAAE,iCAAiC;4BAC9C,WAAW,EAAE,iCAAiC;yBAC9C;qBACD;iBACD;aACD;SACD;QACD,YAAY,EAAE;YACb;gBACC,IAAI,4BAAoC;gBACxC,QAAQ,EAAE;oBACT;wBACC,EAAE,EAAE,gCAAgC;wBACpC,QAAQ,EAAE;4BACT,IAAI,EAAE;gCACL,GAAG,sBAAsB;gCACzB,KAAK,EAAE,yCAAyC,CAAC,SAAS;6BAC1D;yBACD;qBACD;iBACD;aACD;SACD;KACD,CAAC;IAEF,oEAAoE;IACpE,MAAM,sBAAsB,GAC3B;QACC,WAAW,EAAE,mBAAmB;QAChC,OAAO,EAAE,kCAAkC;QAC3C,GAAG,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI;QACtC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,GAAG,aAAa,2BAA2B;QACjD,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAC9C,wBAAwB,CAAC,kBAAkB,EAAE,aAAa,EAAE,OAAO,CAAC;QACrE,WAAW,EAAE;YACZ,QAAQ,EAAE,SAAS,CAAC,MAAM;YAC1B,IAAI,6BAAqC;YACzC,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,iCAAiC;oBACrC,OAAO,EAAE;wBACR,OAAO,EAAE;4BACR,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,gDAAgD;yBAC7E;wBACD,UAAU,EAAE;4BACX,GAAG,EAAE,iCAAiC;yBACtC;wBACD,IAAI,EAAE;4BACL,UAAU,EAAE,yBAAyB,CAAC,OAAO;4BAC7C,OAAO,EAAE,4BAA4B;4BACrC,WAAW,EAAE,iCAAiC;4BAC9C,WAAW,EAAE,iCAAiC;yBAC9C;qBACD;iBACD;aACD;SACD;QACD,YAAY,EAAE;YACb;gBACC,IAAI,8BAAsC;gBAC1C,QAAQ,EAAE;oBACT;wBACC,EAAE,EAAE,kCAAkC;wBACtC,QAAQ,EAAE;4BACT,IAAI,EAAE;gCACL,GAAG,sBAAsB;gCACzB,KAAK,EAAE,yCAAyC,CAAC,UAAU;6BAC3D;yBACD;qBACD;iBACD;aACD;SACD;KACD,CAAC;IAEH,+EAA+E;IAC/E,mCAAmC;IACnC,+EAA+E;IAE/E,MAAM,8BAA8B,GAGhC;QACH,WAAW,EAAE,eAAe;QAC5B,OAAO,EAAE,iDAAiD;QAC1D,GAAG,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI;QACtC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,GAAG,aAAa,eAAe;QACrC,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAC9C,uBAAuB,CAAC,kBAAkB,EAAE,aAAa,EAAE,OAAO,CAAC;QACpE,WAAW,EAAE;YACZ,IAAI,4BAAoC;YACxC,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,6BAA6B;oBACjC,OAAO,EAAE;wBACR,IAAI,EAAE;4BACL,KAAK,EAAE,+BAA+B;4BACtC,OAAO,EAAE;gCACR,UAAU,EAAE,yBAAyB,CAAC,OAAO;gCAC7C,OAAO,EAAE,SAAS;gCAClB,KAAK,EAAE,yCAAyC;gCAChD,SAAS,EAAE,EAAE;gCACb,YAAY,EAAE,EAAE;6BACP;yBACV;qBACD;iBACD;aACD;SACD;QACD,YAAY,EAAE;YACb;gBACC,IAAI,6BAAqC;gBACzC,QAAQ,EAAE;oBACT;wBACC,EAAE,EAAE,8BAA8B;wBAClC,QAAQ,EAAE;4BACT,UAAU,EAAE,GAAG;4BACf,OAAO,EAAE;gCACR,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,yCAAyC;6BACjE;yBACD;qBACD;iBACD;aACD;SACD;KACD,CAAC;IAEF,MAAM,2BAA2B,GAA8D;QAC9F,WAAW,EAAE,YAAY;QACzB,OAAO,EAAE,sDAAsD;QAC/D,GAAG,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI;QACtC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,GAAG,aAAa,mBAAmB;QACzC,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAC9C,oBAAoB,CAAC,kBAAkB,EAAE,aAAa,EAAE,OAAO,CAAC;QACjE,WAAW,EAAE;YACZ,IAAI,yBAAiC;YACrC,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,0BAA0B;oBAC9B,OAAO,EAAE;wBACR,UAAU,EAAE,EAAE,EAAE,EAAE,yBAAyB,EAAE;qBAC7C;iBACD;aACD;SACD;QACD,YAAY,EAAE;YACb;gBACC,IAAI,0BAAkC;aACtC;SACD;KACD,CAAC;IAEF,MAAM,6BAA6B,GAClC;QACC,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,oDAAoD;QAC7D,GAAG,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI;QACtC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,GAAG,aAAa,eAAe;QACrC,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAC9C,sBAAsB,CAAC,kBAAkB,EAAE,aAAa,EAAE,OAAO,CAAC;QACnE,WAAW,EAAE;YACZ,IAAI,0BAAkC;YACtC,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,2BAA2B;oBAC/B,OAAO,EAAE,EAAE;iBACX;aACD;SACD;QACD,YAAY,EAAE;YACb;gBACC,IAAI,2BAAmC;aACvC;SACD;KACD,CAAC;IAEH,MAAM,8BAA8B,GAA6D;QAChG,WAAW,EAAE,eAAe;QAC5B,OAAO,EAAE,oDAAoD;QAC7D,GAAG,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI;QACtC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,GAAG,aAAa,mBAAmB;QACzC,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAC9C,uBAAuB,CAAC,kBAAkB,EAAE,aAAa,EAAE,OAAO,CAAC;QACpE,WAAW,EAAE;YACZ,IAAI,4BAAoC;YACxC,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,6BAA6B;oBACjC,6DAA6D;oBAC7D,+DAA+D;oBAC/D,OAAO,EAAE;wBACR,UAAU,EAAE,EAAE,EAAE,EAAE,yBAAyB,EAAE;wBAC7C,IAAI,EAAE;4BACL,KAAK,EAAE,+BAA+B;4BACtC,OAAO,EAAE;gCACR,UAAU,EAAE,yBAAyB,CAAC,OAAO;gCAC7C,OAAO,EAAE,SAAS;gCAClB,SAAS,EAAE,EAAE;gCACb,YAAY,EAAE,EAAE;6BACP;yBACV;qBACD;iBACD;aACD;SACD;QACD,YAAY,EAAE;YACb;gBACC,IAAI,sBAA8B;gBAClC,QAAQ,EAAE;oBACT;wBACC,EAAE,EAAE,8BAA8B;wBAClC,QAAQ,EAAE;4BACT,UAAU,EAAE,cAAc,CAAC,SAAS;yBACpC;qBACD;iBACD;aACD;YACD;gBACC,IAAI,qBAA6B;aACjC;SACD;KACD,CAAC;IAEF,MAAM,8BAA8B,GAA6D;QAChG,WAAW,EAAE,eAAe;QAC5B,OAAO,EAAE,oDAAoD;QAC7D,GAAG,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI;QACtC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,GAAG,aAAa,mBAAmB;QACzC,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAC9C,uBAAuB,CAAC,kBAAkB,EAAE,aAAa,EAAE,OAAO,CAAC;QACpE,WAAW,EAAE;YACZ,IAAI,4BAAoC;YACxC,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,6BAA6B;oBACjC,OAAO,EAAE;wBACR,UAAU,EAAE,EAAE,EAAE,EAAE,yBAAyB,EAAE;qBAC7C;iBACD;aACD;SACD;QACD,YAAY,EAAE;YACb;gBACC,IAAI,sBAA8B;gBAClC,QAAQ,EAAE;oBACT;wBACC,EAAE,EAAE,8BAA8B;wBAClC,QAAQ,EAAE;4BACT,UAAU,EAAE,cAAc,CAAC,SAAS;yBACpC;qBACD;iBACD;aACD;YACD;gBACC,IAAI,qBAA6B;aACjC;SACD;KACD,CAAC;IAEF,OAAO;QACN,oBAAoB;QACpB,uBAAuB;QACvB,kBAAkB;QAClB,qBAAqB;QACrB,oBAAoB;QACpB,sBAAsB;QACtB,8BAA8B;QAC9B,6BAA6B;QAC7B,2BAA2B;QAC3B,8BAA8B;QAC9B,8BAA8B;KAC9B,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,qCAAqC;AACrC,+EAA+E;AAE/E;;;;;;GAMG;AACH,KAAK,UAAU,sBAAsB,CACpC,kBAAuC,EACvC,aAAqB,EACrB,OAAgC;IAEhC,MAAM,CAAC,MAAM,CAAC,aAAa,aAAmB,OAAO,CAAC,CAAC;IACvD,MAAM,CAAC,MAAM,CAAC,aAAa,kBAAwB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IAE5F,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAkC,aAAa,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAE3E,OAAO;QACN,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,0BAA0B,CAAC,MAAM,CAAC;KAC9C,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,yBAAyB,CACvC,kBAAuC,EACvC,aAAqB,EACrB,OAAmC;IAEnC,MAAM,CAAC,MAAM,CAAC,aAAa,aAAmB,OAAO,CAAC,CAAC;IACvD,MAAM,CAAC,MAAM,CAAC,aAAa,wBAA8B,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7E,MAAM,CAAC,WAAW,CAAC,aAAa,4BAAkC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAE1F,MAAM,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IAE5F,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAkC,aAAa,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAExF,OAAO;QACN,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,0BAA0B,CAAC,MAAM,CAAC;KAC9C,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,oBAAoB,CAClC,kBAAuC,EACvC,aAAqB,EACrB,OAA8B;IAE9B,MAAM,CAAC,MAAM,CAAC,aAAa,aAAmB,OAAO,CAAC,CAAC;IACvD,MAAM,CAAC,MAAM,CAAC,aAAa,kBAAwB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IAE5F,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAkC,aAAa,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAEzE,OAAO;QACN,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,0BAA0B,CAAC,MAAM,CAAC;KAC9C,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,uBAAuB,CACrC,kBAAuC,EACvC,aAAqB,EACrB,OAAiC;IAEjC,MAAM,CAAC,MAAM,CAAC,aAAa,aAAmB,OAAO,CAAC,CAAC;IACvD,MAAM,CAAC,MAAM,CAAC,aAAa,kBAAwB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IAE5F,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAkC,aAAa,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAE5E,OAAO;QACN,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,0BAA0B,CAAC,MAAM,CAAC;KAC9C,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,sBAAsB,CACpC,kBAAuC,EACvC,aAAqB,EACrB,OAAgC;IAEhC,MAAM,CAAC,MAAM,CAAC,aAAa,aAAmB,OAAO,CAAC,CAAC;IACvD,MAAM,CAAC,MAAM,CAAC,aAAa,kBAAwB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IAE5F,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAkC,aAAa,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAE3E,OAAO;QACN,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,0BAA0B,CAAC,MAAM,CAAC;KAC9C,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,wBAAwB,CACtC,kBAAuC,EACvC,aAAqB,EACrB,OAAkC;IAElC,MAAM,CAAC,MAAM,CAAC,aAAa,aAAmB,OAAO,CAAC,CAAC;IACvD,MAAM,CAAC,MAAM,CAAC,aAAa,kBAAwB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IAE5F,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAkC,aAAa,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAE7E,OAAO;QACN,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,0BAA0B,CAAC,MAAM,CAAC;KAC9C,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;;;;;GAMG;AACH,KAAK,UAAU,uBAAuB,CACrC,kBAAuC,EACvC,aAAqB,EACrB,OAAiC;IAEjC,MAAM,CAAC,MAAM,CAA2B,aAAa,aAAmB,OAAO,CAAC,CAAC;IACjF,MAAM,CAAC,MAAM,CAAC,aAAa,kBAAwB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,CAAC,WAAW,CAAC,aAAa,wBAA8B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClF,MAAM,CAAC,MAAM,CAAC,aAAa,0BAAgC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEjF,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAkC,aAAa,CAAC,CAAC;IACvF,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAClD,OAAO,CAAC,IAAI,CAAC,EAAE,EACf,OAAO,CAAC,IAAI,CAAC,KAAK,EAClB,OAAO,CAAC,IAAI,CAAC,OAAO,CACpB,CAAC;IAEF,OAAO;QACN,UAAU,EAAE,GAAG;QACf,OAAO,EAAE;YACR,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,UAAU;SAClC;KACD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,oBAAoB,CAClC,kBAAuC,EACvC,aAAqB,EACrB,OAA8B;IAE9B,MAAM,CAAC,MAAM,CAAwB,aAAa,aAAmB,OAAO,CAAC,CAAC;IAC9E,MAAM,CAAC,MAAM,CAAC,aAAa,wBAA8B,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7E,MAAM,CAAC,WAAW,CAAC,aAAa,2BAAiC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAExF,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAkC,aAAa,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAEpE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACzB,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,sBAAsB,CACpC,kBAAuC,EACvC,aAAqB,EACrB,OAA+B;IAE/B,MAAM,CAAC,MAAM,CAAyB,aAAa,aAAmB,OAAO,CAAC,CAAC;IAE/E,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAkC,aAAa,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,eAAe,CAC7C,OAAO,CAAC,KAAK,EAAE,MAAM,EACrB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CACpC,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACzB,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,uBAAuB,CACrC,kBAAuC,EACvC,aAAqB,EACrB,OAAiC;IAEjC,MAAM,CAAC,MAAM,CAA2B,aAAa,aAAmB,OAAO,CAAC,CAAC;IACjF,MAAM,CAAC,MAAM,CAAC,aAAa,wBAA8B,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7E,MAAM,CAAC,WAAW,CAAC,aAAa,2BAAiC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACxF,MAAM,CAAC,MAAM,CAAC,aAAa,kBAAwB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,CAAC,WAAW,CAAC,aAAa,wBAA8B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClF,MAAM,CAAC,MAAM,CAAC,aAAa,0BAAgC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEjF,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAkC,aAAa,CAAC,CAAC;IACvF,MAAM,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAElG,OAAO;QACN,UAAU,EAAE,cAAc,CAAC,SAAS;KACpC,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,uBAAuB,CACrC,kBAAuC,EACvC,aAAqB,EACrB,OAAiC;IAEjC,MAAM,CAAC,MAAM,CAA2B,aAAa,aAAmB,OAAO,CAAC,CAAC;IACjF,MAAM,CAAC,MAAM,CAAC,aAAa,wBAA8B,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7E,MAAM,CAAC,WAAW,CAAC,aAAa,2BAAiC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAExF,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAkC,aAAa,CAAC,CAAC;IACvF,MAAM,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAExD,OAAO;QACN,UAAU,EAAE,cAAc,CAAC,SAAS;KACpC,CAAC;AACH,CAAC","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type {\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 component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.startTransfer(request.body, trustPayload);\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"]}
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 {\n\tHttpContextIdKeys,\n\tHttpHeaderHelper,\n\tHttpUrlHelper,\n\ttype IHttpRequestContext,\n\ttype INoContentRequest,\n\ttype INoContentResponse,\n\ttype INotFoundResponse,\n\ttype IRestRoute,\n\ttype ITag\n} from \"@twin.org/api-models\";\nimport { ContextIdStore } from \"@twin.org/context\";\nimport { Coerce, ComponentFactory, Guards } from \"@twin.org/core\";\nimport type {\n\tIAppDatasetCreateRequest,\n\tIAppDatasetCreateResponse,\n\tIAppDatasetDeleteRequest,\n\tIAppDatasetGetRequest,\n\tIAppDatasetGetResponse,\n\tIAppDatasetListRequest,\n\tIAppDatasetListResponse,\n\tIAppDatasetUpdateRequest,\n\tICompleteTransferRequest,\n\tICompleteTransferResponse,\n\tIDataspaceControlPlaneComponent,\n\tIGetProtocolVersionsResponse,\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 {\n\tHeaderHelper,\n\tHeaderTypes,\n\tHttpStatusCode,\n\ttype IHttpHeaders,\n\tMimeTypes\n} 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\t{\n\t\tname: \"Version Discovery\",\n\t\tdescription:\n\t\t\t\"RFC 8615 well-known endpoint for advertising the Dataspace Protocol versions supported by this connector.\"\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// DSP VERSION DISCOVERY\n\t// ============================================================================\n\n\t// GET /.well-known/dspace-version - DSP version discovery (unauthenticated, RFC 8615)\n\tconst getProtocolVersionsRoute: IRestRoute<INoContentRequest, IGetProtocolVersionsResponse> = {\n\t\toperationId: \"getProtocolVersions\",\n\t\tsummary: \"Get supported Dataspace Protocol versions (DSP 2025-1)\",\n\t\ttag: tagsDataspaceControlPlane[2].name,\n\t\tmethod: \"GET\",\n\t\tpath: \"/.well-known/dspace-version\",\n\t\tskipAuth: true,\n\t\tskipTenant: true,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tgetProtocolVersionsHandler(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<INoContentRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"getProtocolVersionsRequestExample\",\n\t\t\t\t\trequest: {}\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<IGetProtocolVersionsResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"getProtocolVersionsResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tprotocolVersions: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tversion: \"2025-1\",\n\t\t\t\t\t\t\t\t\t\tpath: \"/dataspace-control-plane/2025-1\",\n\t\t\t\t\t\t\t\t\t\tbinding: \"HTTPS\",\n\t\t\t\t\t\t\t\t\t\tserviceId: \"twin-connector\"\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\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, baseRouteName),\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\tgetProtocolVersionsRoute,\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// DSP VERSION DISCOVERY HANDLER\n// ============================================================================\n\n/**\n * Get Protocol Versions 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 (no parameters required).\n * @returns The response with the list of supported DSP versions.\n */\nasync function getProtocolVersionsHandler(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: INoContentRequest\n): Promise<IGetProtocolVersionsResponse> {\n\tconst component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.getProtocolVersions();\n\n\treturn { body: result };\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 component = ComponentFactory.get<IDataspaceControlPlaneComponent>(componentName);\n\tconst result = await component.startTransfer(request.body, trustPayload);\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 * @param baseRouteName The base route name for constructing the Location header.\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\tbaseRouteName: string\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 id = await component.createAppDataset(\n\t\trequest.body.id,\n\t\trequest.body.appId,\n\t\trequest.body.dataset\n\t);\n\n\tconst contextIds = await ContextIdStore.getContextIds();\n\tconst publicOrigin = contextIds?.[HttpContextIdKeys.PublicOrigin];\n\n\tconst headers: IHttpHeaders = {};\n\tHttpHeaderHelper.buildId(\n\t\theaders,\n\t\tid,\n\t\tHttpUrlHelper.combineOriginPath(publicOrigin, `${baseRouteName}/app-datasets/:id`)\n\t);\n\n\treturn {\n\t\tstatusCode: HttpStatusCode.created,\n\t\theaders\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"]}