diff --git a/package-lock.json b/package-lock.json index 53c1dfa65..1354fe12c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8934,6 +8934,8 @@ }, "node_modules/ts-mockito": { "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ts-mockito/-/ts-mockito-2.6.1.tgz", + "integrity": "sha512-qU9m/oEBQrKq5hwfbJ7MgmVN5Gu6lFnIGWvpxSjrqq6YYEVv+RwVFWySbZMBgazsWqv6ctAyVBpo9TmAxnOEKw==", "dev": true, "license": "MIT", "dependencies": { @@ -9633,7 +9635,8 @@ "@types/lodash": "^4.17.13", "@types/luxon": "^3.4.2", "@types/qrcode": "^1.5.5", - "ts-json-schema-generator": "2.3.0" + "ts-json-schema-generator": "2.3.0", + "ts-mockito": "^2.6.1" } }, "packages/runtime/node_modules/ajv-errors": { diff --git a/packages/runtime/package.json b/packages/runtime/package.json index 376cee3a2..9737ff10a 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -70,6 +70,7 @@ "@nmshd/crypto": "2.1.0", "@nmshd/iql": "^1.0.2", "@nmshd/transport": "*", + "@nmshd/typescript-ioc": "3.2.4", "ajv": "^8.17.1", "ajv-errors": "^3.0.0", "ajv-formats": "^3.0.1", @@ -78,8 +79,7 @@ "luxon": "^3.5.0", "qrcode": "1.5.4", "reflect-metadata": "^0.2.2", - "ts-simple-nameof": "^1.3.1", - "@nmshd/typescript-ioc": "3.2.4" + "ts-simple-nameof": "^1.3.1" }, "devDependencies": { "@js-soft/docdb-access-loki": "1.1.0", @@ -89,7 +89,8 @@ "@types/lodash": "^4.17.13", "@types/luxon": "^3.4.2", "@types/qrcode": "^1.5.5", - "ts-json-schema-generator": "2.3.0" + "ts-json-schema-generator": "2.3.0", + "ts-mockito": "^2.6.1" }, "publishConfig": { "access": "public", diff --git a/packages/runtime/src/Runtime.ts b/packages/runtime/src/Runtime.ts index 6f2faa8e7..4ebfe50fa 100644 --- a/packages/runtime/src/Runtime.ts +++ b/packages/runtime/src/Runtime.ts @@ -25,6 +25,7 @@ import { IdentityController, IdentityDeletionProcessController, MessageController, + PublicRelationshipTemplateReferencesController, RelationshipsController, RelationshipTemplateController, TokenController, @@ -258,6 +259,10 @@ export abstract class Runtime { .factory(() => this.getAccountController().tokens) .scope(Scope.Request); + Container.bind(PublicRelationshipTemplateReferencesController) + .factory(() => this.getAccountController().publicRelationshipTemplateReferences) + .scope(Scope.Request); + Container.bind(ChallengeController) .factory(() => this.getAccountController().challenges) .scope(Scope.Request); diff --git a/packages/runtime/src/extensibility/TransportServices.ts b/packages/runtime/src/extensibility/TransportServices.ts index ecf2c97ac..32cdac56e 100644 --- a/packages/runtime/src/extensibility/TransportServices.ts +++ b/packages/runtime/src/extensibility/TransportServices.ts @@ -6,6 +6,7 @@ import { FilesFacade, IdentityDeletionProcessesFacade, MessagesFacade, + PublicRelationshipTemplateReferencesFacade, RelationshipsFacade, RelationshipTemplatesFacade, TokensFacade @@ -21,6 +22,7 @@ export class TransportServices { @Inject public readonly account: AccountFacade, @Inject public readonly devices: DevicesFacade, @Inject public readonly challenges: ChallengesFacade, - @Inject public readonly identityDeletionProcesses: IdentityDeletionProcessesFacade + @Inject public readonly identityDeletionProcesses: IdentityDeletionProcessesFacade, + @Inject public readonly publicRelationshipTemplateReferences: PublicRelationshipTemplateReferencesFacade ) {} } diff --git a/packages/runtime/src/extensibility/facades/transport/PublicRelationshipTemplateReferencesFacade.ts b/packages/runtime/src/extensibility/facades/transport/PublicRelationshipTemplateReferencesFacade.ts new file mode 100644 index 000000000..88351bf33 --- /dev/null +++ b/packages/runtime/src/extensibility/facades/transport/PublicRelationshipTemplateReferencesFacade.ts @@ -0,0 +1,12 @@ +import { Result } from "@js-soft/ts-utils"; +import { Inject } from "@nmshd/typescript-ioc"; +import { PublicRelationshipTemplateReferenceDTO } from "../../../types"; +import { GetPublicRelationshipTemplateReferencesUseCase } from "../../../useCases"; + +export class PublicRelationshipTemplateReferencesFacade { + public constructor(@Inject private readonly getPublicRelationshipTemplateReferencesUseCase: GetPublicRelationshipTemplateReferencesUseCase) {} + + public async getPublicRelationshipTemplateReferences(): Promise> { + return await this.getPublicRelationshipTemplateReferencesUseCase.execute(); + } +} diff --git a/packages/runtime/src/extensibility/facades/transport/index.ts b/packages/runtime/src/extensibility/facades/transport/index.ts index a14fc3df7..2f313be75 100644 --- a/packages/runtime/src/extensibility/facades/transport/index.ts +++ b/packages/runtime/src/extensibility/facades/transport/index.ts @@ -4,6 +4,7 @@ export * from "./DevicesFacade"; export * from "./FilesFacade"; export * from "./IdentityDeletionProcessesFacade"; export * from "./MessagesFacade"; -export * from "./RelationshipTemplatesFacade"; +export * from "./PublicRelationshipTemplateReferencesFacade"; export * from "./RelationshipsFacade"; +export * from "./RelationshipTemplatesFacade"; export * from "./TokensFacade"; diff --git a/packages/runtime/src/types/transport/PublicRelationshipTemplateReferenceDTO.ts b/packages/runtime/src/types/transport/PublicRelationshipTemplateReferenceDTO.ts new file mode 100644 index 000000000..9e90e73b4 --- /dev/null +++ b/packages/runtime/src/types/transport/PublicRelationshipTemplateReferenceDTO.ts @@ -0,0 +1,5 @@ +export interface PublicRelationshipTemplateReferenceDTO { + title: string; + description: string; + truncatedReference: string; +} diff --git a/packages/runtime/src/types/transport/index.ts b/packages/runtime/src/types/transport/index.ts index 2235cf6e4..c0e6f8064 100644 --- a/packages/runtime/src/types/transport/index.ts +++ b/packages/runtime/src/types/transport/index.ts @@ -2,10 +2,11 @@ export * from "./ChallengeDTO"; export * from "./DeviceDTO"; export * from "./DeviceOnboardingInfoDTO"; export * from "./FileDTO"; -export * from "./IdentityDTO"; export * from "./IdentityDeletionProcessDTO"; +export * from "./IdentityDTO"; export * from "./MessageDTO"; export * from "./MessageWithAttachmentsDTO"; +export * from "./PublicRelationshipTemplateReferenceDTO"; export * from "./RecipientDTO"; export * from "./RelationshipDTO"; export * from "./RelationshipTemplateDTO"; diff --git a/packages/runtime/src/useCases/common/Schemas.ts b/packages/runtime/src/useCases/common/Schemas.ts index 178cd5b8f..10416a7a8 100644 --- a/packages/runtime/src/useCases/common/Schemas.ts +++ b/packages/runtime/src/useCases/common/Schemas.ts @@ -21998,70 +21998,63 @@ export const SendMessageRequest: any = { } } -export const CreateOwnRelationshipTemplateRequest: any = { +export const AcceptRelationshipRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/CreateOwnRelationshipTemplateRequest", + "$ref": "#/definitions/AcceptRelationshipRequest", "definitions": { - "CreateOwnRelationshipTemplateRequest": { + "AcceptRelationshipRequest": { "type": "object", "properties": { - "expiresAt": { - "$ref": "#/definitions/ISO8601DateTimeString" - }, - "content": {}, - "maxNumberOfAllocations": { - "type": "number", - "minimum": 1 - }, - "forIdentity": { - "$ref": "#/definitions/AddressString" - }, - "passwordProtection": { - "type": "object", - "properties": { - "password": { - "type": "string", - "minLength": 1 - }, - "passwordIsPin": { - "type": "boolean", - "const": true - } - }, - "required": [ - "password" - ], - "additionalProperties": false + "relationshipId": { + "$ref": "#/definitions/RelationshipIdString" } }, "required": [ - "expiresAt", - "content" + "relationshipId" ], "additionalProperties": false }, - "ISO8601DateTimeString": { + "RelationshipIdString": { "type": "string", - "errorMessage": "must match ISO8601 datetime format", - "pattern": "^([+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24:?00)([.,]\\d+(?!:))?)?(\\17[0-5]\\d([.,]\\d+)?)?([zZ]|([+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$" + "pattern": "REL[A-Za-z0-9]{17}" + } + } +} + +export const AcceptRelationshipReactivationRequest: any = { + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/AcceptRelationshipReactivationRequest", + "definitions": { + "AcceptRelationshipReactivationRequest": { + "type": "object", + "properties": { + "relationshipId": { + "$ref": "#/definitions/RelationshipIdString" + } + }, + "required": [ + "relationshipId" + ], + "additionalProperties": false }, - "AddressString": { + "RelationshipIdString": { "type": "string", - "pattern": "did:e:((([A-Za-z0-9]+(-[A-Za-z0-9]+)*)\\.)+[a-z]{2,}|localhost):dids:[0-9a-f]{22}" + "pattern": "REL[A-Za-z0-9]{17}" } } } -export const CreateQRCodeForOwnTemplateRequest: any = { +export const CanCreateRelationshipRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/CreateQRCodeForOwnTemplateRequest", + "$ref": "#/definitions/CanCreateRelationshipRequest", "definitions": { - "CreateQRCodeForOwnTemplateRequest": { + "CanCreateRelationshipRequest": { "type": "object", "properties": { "templateId": { "$ref": "#/definitions/RelationshipTemplateIdString" - } + }, + "creationContent": {} }, "required": [ "templateId" @@ -22075,94 +22068,93 @@ export const CreateQRCodeForOwnTemplateRequest: any = { } } -export const CreateTokenForOwnTemplateRequest: any = { +export const CreateRelationshipRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/CreateTokenForOwnTemplateRequest", + "$ref": "#/definitions/CreateRelationshipRequest", "definitions": { - "CreateTokenForOwnTemplateRequest": { + "CreateRelationshipRequest": { "type": "object", "properties": { "templateId": { "$ref": "#/definitions/RelationshipTemplateIdString" }, - "expiresAt": { - "$ref": "#/definitions/ISO8601DateTimeString" - }, - "ephemeral": { - "type": "boolean" - }, - "forIdentity": { - "$ref": "#/definitions/AddressString" - } + "creationContent": {} }, "required": [ - "templateId" + "templateId", + "creationContent" ], "additionalProperties": false }, "RelationshipTemplateIdString": { "type": "string", "pattern": "RLT[A-Za-z0-9]{17}" + } + } +} + +export const DecomposeRelationshipRequest: any = { + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/DecomposeRelationshipRequest", + "definitions": { + "DecomposeRelationshipRequest": { + "type": "object", + "properties": { + "relationshipId": { + "$ref": "#/definitions/RelationshipIdString" + } + }, + "required": [ + "relationshipId" + ], + "additionalProperties": false }, - "ISO8601DateTimeString": { - "type": "string", - "errorMessage": "must match ISO8601 datetime format", - "pattern": "^([+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24:?00)([.,]\\d+(?!:))?)?(\\17[0-5]\\d([.,]\\d+)?)?([zZ]|([+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$" - }, - "AddressString": { + "RelationshipIdString": { "type": "string", - "pattern": "did:e:((([A-Za-z0-9]+(-[A-Za-z0-9]+)*)\\.)+[a-z]{2,}|localhost):dids:[0-9a-f]{22}" + "pattern": "REL[A-Za-z0-9]{17}" } } } -export const CreateTokenQRCodeForOwnTemplateRequest: any = { +export const GetAttributesForRelationshipRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/CreateTokenQRCodeForOwnTemplateRequest", + "$ref": "#/definitions/GetAttributesForRelationshipRequest", "definitions": { - "CreateTokenQRCodeForOwnTemplateRequest": { + "GetAttributesForRelationshipRequest": { "type": "object", "properties": { - "templateId": { - "$ref": "#/definitions/RelationshipTemplateIdString" + "id": { + "$ref": "#/definitions/RelationshipIdString" }, - "expiresAt": { - "$ref": "#/definitions/ISO8601DateTimeString" + "hideTechnical": { + "type": "boolean" }, - "forIdentity": { - "$ref": "#/definitions/AddressString" + "onlyLatestVersions": { + "type": "boolean", + "description": "default: true" } }, "required": [ - "templateId" + "id" ], "additionalProperties": false }, - "RelationshipTemplateIdString": { - "type": "string", - "pattern": "RLT[A-Za-z0-9]{17}" - }, - "ISO8601DateTimeString": { - "type": "string", - "errorMessage": "must match ISO8601 datetime format", - "pattern": "^([+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24:?00)([.,]\\d+(?!:))?)?(\\17[0-5]\\d([.,]\\d+)?)?([zZ]|([+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$" - }, - "AddressString": { + "RelationshipIdString": { "type": "string", - "pattern": "did:e:((([A-Za-z0-9]+(-[A-Za-z0-9]+)*)\\.)+[a-z]{2,}|localhost):dids:[0-9a-f]{22}" + "pattern": "REL[A-Za-z0-9]{17}" } } } -export const GetRelationshipTemplateRequest: any = { +export const GetRelationshipRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/GetRelationshipTemplateRequest", + "$ref": "#/definitions/GetRelationshipRequest", "definitions": { - "GetRelationshipTemplateRequest": { + "GetRelationshipRequest": { "type": "object", "properties": { "id": { - "$ref": "#/definitions/RelationshipTemplateIdString" + "$ref": "#/definitions/RelationshipIdString" } }, "required": [ @@ -22170,72 +22162,53 @@ export const GetRelationshipTemplateRequest: any = { ], "additionalProperties": false }, - "RelationshipTemplateIdString": { + "RelationshipIdString": { "type": "string", - "pattern": "RLT[A-Za-z0-9]{17}" + "pattern": "REL[A-Za-z0-9]{17}" } } } -export const GetRelationshipTemplatesRequest: any = { +export const GetRelationshipByAddressRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/GetRelationshipTemplatesRequest", + "$ref": "#/definitions/GetRelationshipByAddressRequest", "definitions": { - "GetRelationshipTemplatesRequest": { + "GetRelationshipByAddressRequest": { + "type": "object", + "properties": { + "address": { + "$ref": "#/definitions/AddressString" + } + }, + "required": [ + "address" + ], + "additionalProperties": false + }, + "AddressString": { + "type": "string", + "pattern": "did:e:((([A-Za-z0-9]+(-[A-Za-z0-9]+)*)\\.)+[a-z]{2,}|localhost):dids:[0-9a-f]{22}" + } + } +} + +export const GetRelationshipsRequest: any = { + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/GetRelationshipsRequest", + "definitions": { + "GetRelationshipsRequest": { "type": "object", "properties": { "query": { - "$ref": "#/definitions/GetRelationshipTemplatesQuery" - }, - "ownerRestriction": { - "$ref": "#/definitions/OwnerRestriction" + "$ref": "#/definitions/GetRelationshipsQuery" } }, "additionalProperties": false }, - "GetRelationshipTemplatesQuery": { + "GetRelationshipsQuery": { "type": "object", "properties": { - "isOwn": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ] - }, - "createdAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ] - }, - "expiresAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ] - }, - "createdBy": { + "peer": { "anyOf": [ { "type": "string" @@ -22248,7 +22221,7 @@ export const GetRelationshipTemplatesRequest: any = { } ] }, - "createdByDevice": { + "status": { "anyOf": [ { "type": "string" @@ -22261,20 +22234,7 @@ export const GetRelationshipTemplatesRequest: any = { } ] }, - "maxNumberOfAllocations": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ] - }, - "forIdentity": { + "template.id": { "anyOf": [ { "type": "string" @@ -22289,60 +22249,38 @@ export const GetRelationshipTemplatesRequest: any = { } }, "additionalProperties": false - }, - "OwnerRestriction": { - "type": "string", - "enum": [ - "o", - "p" - ] } } } -export const LoadPeerRelationshipTemplateRequest: any = { +export const RejectRelationshipRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/LoadPeerRelationshipTemplateRequest", + "$ref": "#/definitions/RejectRelationshipRequest", "definitions": { - "LoadPeerRelationshipTemplateRequest": { + "RejectRelationshipRequest": { "type": "object", "properties": { - "reference": { - "anyOf": [ - { - "$ref": "#/definitions/TokenReferenceString" - }, - { - "$ref": "#/definitions/RelationshipTemplateReferenceString" - } - ] - }, - "password": { - "type": "string" + "relationshipId": { + "$ref": "#/definitions/RelationshipIdString" } }, "required": [ - "reference" + "relationshipId" ], - "additionalProperties": false, - "errorMessage": "token / relationship template reference invalid" - }, - "TokenReferenceString": { - "type": "string", - "pattern": "VE9L.{84}" + "additionalProperties": false }, - "RelationshipTemplateReferenceString": { + "RelationshipIdString": { "type": "string", - "pattern": "UkxU.{84}" + "pattern": "REL[A-Za-z0-9]{17}" } } } -export const AcceptRelationshipRequest: any = { +export const RejectRelationshipReactivationRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/AcceptRelationshipRequest", + "$ref": "#/definitions/RejectRelationshipReactivationRequest", "definitions": { - "AcceptRelationshipRequest": { + "RejectRelationshipReactivationRequest": { "type": "object", "properties": { "relationshipId": { @@ -22361,11 +22299,11 @@ export const AcceptRelationshipRequest: any = { } } -export const AcceptRelationshipReactivationRequest: any = { +export const RequestRelationshipReactivationRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/AcceptRelationshipReactivationRequest", + "$ref": "#/definitions/RequestRelationshipReactivationRequest", "definitions": { - "AcceptRelationshipReactivationRequest": { + "RequestRelationshipReactivationRequest": { "type": "object", "properties": { "relationshipId": { @@ -22384,60 +22322,57 @@ export const AcceptRelationshipReactivationRequest: any = { } } -export const CanCreateRelationshipRequest: any = { +export const RevokeRelationshipRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/CanCreateRelationshipRequest", + "$ref": "#/definitions/RevokeRelationshipRequest", "definitions": { - "CanCreateRelationshipRequest": { + "RevokeRelationshipRequest": { "type": "object", "properties": { - "templateId": { - "$ref": "#/definitions/RelationshipTemplateIdString" - }, - "creationContent": {} + "relationshipId": { + "$ref": "#/definitions/RelationshipIdString" + } }, "required": [ - "templateId" + "relationshipId" ], "additionalProperties": false }, - "RelationshipTemplateIdString": { + "RelationshipIdString": { "type": "string", - "pattern": "RLT[A-Za-z0-9]{17}" + "pattern": "REL[A-Za-z0-9]{17}" } } } -export const CreateRelationshipRequest: any = { +export const RevokeRelationshipReactivationRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/CreateRelationshipRequest", + "$ref": "#/definitions/RevokeRelationshipReactivationRequest", "definitions": { - "CreateRelationshipRequest": { + "RevokeRelationshipReactivationRequest": { "type": "object", "properties": { - "templateId": { - "$ref": "#/definitions/RelationshipTemplateIdString" - }, - "creationContent": {} + "relationshipId": { + "$ref": "#/definitions/RelationshipIdString" + } }, "required": [ - "templateId", - "creationContent" + "relationshipId" ], "additionalProperties": false }, - "RelationshipTemplateIdString": { + "RelationshipIdString": { "type": "string", - "pattern": "RLT[A-Za-z0-9]{17}" + "pattern": "REL[A-Za-z0-9]{17}" } } } -export const DecomposeRelationshipRequest: any = { +export const TerminateRelationshipRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/DecomposeRelationshipRequest", + "$ref": "#/definitions/TerminateRelationshipRequest", "definitions": { - "DecomposeRelationshipRequest": { + "TerminateRelationshipRequest": { "type": "object", "properties": { "relationshipId": { @@ -22456,75 +22391,117 @@ export const DecomposeRelationshipRequest: any = { } } -export const GetAttributesForRelationshipRequest: any = { +export const CreateOwnRelationshipTemplateRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/GetAttributesForRelationshipRequest", + "$ref": "#/definitions/CreateOwnRelationshipTemplateRequest", "definitions": { - "GetAttributesForRelationshipRequest": { + "CreateOwnRelationshipTemplateRequest": { "type": "object", "properties": { - "id": { - "$ref": "#/definitions/RelationshipIdString" + "expiresAt": { + "$ref": "#/definitions/ISO8601DateTimeString" }, - "hideTechnical": { - "type": "boolean" + "content": {}, + "maxNumberOfAllocations": { + "type": "number", + "minimum": 1 }, - "onlyLatestVersions": { - "type": "boolean", - "description": "default: true" + "forIdentity": { + "$ref": "#/definitions/AddressString" + }, + "passwordProtection": { + "type": "object", + "properties": { + "password": { + "type": "string", + "minLength": 1 + }, + "passwordIsPin": { + "type": "boolean", + "const": true + } + }, + "required": [ + "password" + ], + "additionalProperties": false } }, "required": [ - "id" + "expiresAt", + "content" ], "additionalProperties": false }, - "RelationshipIdString": { + "ISO8601DateTimeString": { "type": "string", - "pattern": "REL[A-Za-z0-9]{17}" + "errorMessage": "must match ISO8601 datetime format", + "pattern": "^([+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24:?00)([.,]\\d+(?!:))?)?(\\17[0-5]\\d([.,]\\d+)?)?([zZ]|([+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$" + }, + "AddressString": { + "type": "string", + "pattern": "did:e:((([A-Za-z0-9]+(-[A-Za-z0-9]+)*)\\.)+[a-z]{2,}|localhost):dids:[0-9a-f]{22}" } } } -export const GetRelationshipRequest: any = { +export const CreateQRCodeForOwnTemplateRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/GetRelationshipRequest", + "$ref": "#/definitions/CreateQRCodeForOwnTemplateRequest", "definitions": { - "GetRelationshipRequest": { + "CreateQRCodeForOwnTemplateRequest": { "type": "object", "properties": { - "id": { - "$ref": "#/definitions/RelationshipIdString" + "templateId": { + "$ref": "#/definitions/RelationshipTemplateIdString" } }, "required": [ - "id" + "templateId" ], "additionalProperties": false }, - "RelationshipIdString": { + "RelationshipTemplateIdString": { "type": "string", - "pattern": "REL[A-Za-z0-9]{17}" + "pattern": "RLT[A-Za-z0-9]{17}" } } } -export const GetRelationshipByAddressRequest: any = { +export const CreateTokenForOwnTemplateRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/GetRelationshipByAddressRequest", + "$ref": "#/definitions/CreateTokenForOwnTemplateRequest", "definitions": { - "GetRelationshipByAddressRequest": { + "CreateTokenForOwnTemplateRequest": { "type": "object", "properties": { - "address": { + "templateId": { + "$ref": "#/definitions/RelationshipTemplateIdString" + }, + "expiresAt": { + "$ref": "#/definitions/ISO8601DateTimeString" + }, + "ephemeral": { + "type": "boolean" + }, + "forIdentity": { "$ref": "#/definitions/AddressString" } }, "required": [ - "address" + "templateId" ], "additionalProperties": false }, + "RelationshipTemplateIdString": { + "type": "string", + "pattern": "RLT[A-Za-z0-9]{17}" + }, + "ISO8601DateTimeString": { + "type": "string", + "errorMessage": "must match ISO8601 datetime format", + "pattern": "^([+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24:?00)([.,]\\d+(?!:))?)?(\\17[0-5]\\d([.,]\\d+)?)?([zZ]|([+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$" + }, "AddressString": { "type": "string", "pattern": "did:e:((([A-Za-z0-9]+(-[A-Za-z0-9]+)*)\\.)+[a-z]{2,}|localhost):dids:[0-9a-f]{22}" @@ -22532,23 +22509,87 @@ export const GetRelationshipByAddressRequest: any = { } } -export const GetRelationshipsRequest: any = { +export const CreateTokenQRCodeForOwnTemplateRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/GetRelationshipsRequest", + "$ref": "#/definitions/CreateTokenQRCodeForOwnTemplateRequest", "definitions": { - "GetRelationshipsRequest": { + "CreateTokenQRCodeForOwnTemplateRequest": { + "type": "object", + "properties": { + "templateId": { + "$ref": "#/definitions/RelationshipTemplateIdString" + }, + "expiresAt": { + "$ref": "#/definitions/ISO8601DateTimeString" + }, + "forIdentity": { + "$ref": "#/definitions/AddressString" + } + }, + "required": [ + "templateId" + ], + "additionalProperties": false + }, + "RelationshipTemplateIdString": { + "type": "string", + "pattern": "RLT[A-Za-z0-9]{17}" + }, + "ISO8601DateTimeString": { + "type": "string", + "errorMessage": "must match ISO8601 datetime format", + "pattern": "^([+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24:?00)([.,]\\d+(?!:))?)?(\\17[0-5]\\d([.,]\\d+)?)?([zZ]|([+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$" + }, + "AddressString": { + "type": "string", + "pattern": "did:e:((([A-Za-z0-9]+(-[A-Za-z0-9]+)*)\\.)+[a-z]{2,}|localhost):dids:[0-9a-f]{22}" + } + } +} + +export const GetRelationshipTemplateRequest: any = { + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/GetRelationshipTemplateRequest", + "definitions": { + "GetRelationshipTemplateRequest": { + "type": "object", + "properties": { + "id": { + "$ref": "#/definitions/RelationshipTemplateIdString" + } + }, + "required": [ + "id" + ], + "additionalProperties": false + }, + "RelationshipTemplateIdString": { + "type": "string", + "pattern": "RLT[A-Za-z0-9]{17}" + } + } +} + +export const GetRelationshipTemplatesRequest: any = { + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/GetRelationshipTemplatesRequest", + "definitions": { + "GetRelationshipTemplatesRequest": { "type": "object", "properties": { "query": { - "$ref": "#/definitions/GetRelationshipsQuery" + "$ref": "#/definitions/GetRelationshipTemplatesQuery" + }, + "ownerRestriction": { + "$ref": "#/definitions/OwnerRestriction" } }, "additionalProperties": false }, - "GetRelationshipsQuery": { + "GetRelationshipTemplatesQuery": { "type": "object", "properties": { - "peer": { + "isOwn": { "anyOf": [ { "type": "string" @@ -22561,7 +22602,7 @@ export const GetRelationshipsRequest: any = { } ] }, - "status": { + "createdAt": { "anyOf": [ { "type": "string" @@ -22574,7 +22615,59 @@ export const GetRelationshipsRequest: any = { } ] }, - "template.id": { + "expiresAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "createdBy": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "createdByDevice": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "maxNumberOfAllocations": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "forIdentity": { "anyOf": [ { "type": "string" @@ -22589,144 +22682,51 @@ export const GetRelationshipsRequest: any = { } }, "additionalProperties": false - } - } -} - -export const RejectRelationshipRequest: any = { - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/RejectRelationshipRequest", - "definitions": { - "RejectRelationshipRequest": { - "type": "object", - "properties": { - "relationshipId": { - "$ref": "#/definitions/RelationshipIdString" - } - }, - "required": [ - "relationshipId" - ], - "additionalProperties": false - }, - "RelationshipIdString": { - "type": "string", - "pattern": "REL[A-Za-z0-9]{17}" - } - } -} - -export const RejectRelationshipReactivationRequest: any = { - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/RejectRelationshipReactivationRequest", - "definitions": { - "RejectRelationshipReactivationRequest": { - "type": "object", - "properties": { - "relationshipId": { - "$ref": "#/definitions/RelationshipIdString" - } - }, - "required": [ - "relationshipId" - ], - "additionalProperties": false - }, - "RelationshipIdString": { - "type": "string", - "pattern": "REL[A-Za-z0-9]{17}" - } - } -} - -export const RequestRelationshipReactivationRequest: any = { - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/RequestRelationshipReactivationRequest", - "definitions": { - "RequestRelationshipReactivationRequest": { - "type": "object", - "properties": { - "relationshipId": { - "$ref": "#/definitions/RelationshipIdString" - } - }, - "required": [ - "relationshipId" - ], - "additionalProperties": false - }, - "RelationshipIdString": { - "type": "string", - "pattern": "REL[A-Za-z0-9]{17}" - } - } -} - -export const RevokeRelationshipRequest: any = { - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/RevokeRelationshipRequest", - "definitions": { - "RevokeRelationshipRequest": { - "type": "object", - "properties": { - "relationshipId": { - "$ref": "#/definitions/RelationshipIdString" - } - }, - "required": [ - "relationshipId" - ], - "additionalProperties": false }, - "RelationshipIdString": { + "OwnerRestriction": { "type": "string", - "pattern": "REL[A-Za-z0-9]{17}" + "enum": [ + "o", + "p" + ] } } } -export const RevokeRelationshipReactivationRequest: any = { +export const LoadPeerRelationshipTemplateRequest: any = { "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/RevokeRelationshipReactivationRequest", + "$ref": "#/definitions/LoadPeerRelationshipTemplateRequest", "definitions": { - "RevokeRelationshipReactivationRequest": { + "LoadPeerRelationshipTemplateRequest": { "type": "object", "properties": { - "relationshipId": { - "$ref": "#/definitions/RelationshipIdString" + "reference": { + "anyOf": [ + { + "$ref": "#/definitions/TokenReferenceString" + }, + { + "$ref": "#/definitions/RelationshipTemplateReferenceString" + } + ] + }, + "password": { + "type": "string" } }, "required": [ - "relationshipId" + "reference" ], - "additionalProperties": false + "additionalProperties": false, + "errorMessage": "token / relationship template reference invalid" }, - "RelationshipIdString": { + "TokenReferenceString": { "type": "string", - "pattern": "REL[A-Za-z0-9]{17}" - } - } -} - -export const TerminateRelationshipRequest: any = { - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "#/definitions/TerminateRelationshipRequest", - "definitions": { - "TerminateRelationshipRequest": { - "type": "object", - "properties": { - "relationshipId": { - "$ref": "#/definitions/RelationshipIdString" - } - }, - "required": [ - "relationshipId" - ], - "additionalProperties": false + "pattern": "VE9L.{84}" }, - "RelationshipIdString": { + "RelationshipTemplateReferenceString": { "type": "string", - "pattern": "REL[A-Za-z0-9]{17}" + "pattern": "UkxU.{84}" } } } diff --git a/packages/runtime/src/useCases/transport/index.ts b/packages/runtime/src/useCases/transport/index.ts index 0bce894c3..51425e014 100644 --- a/packages/runtime/src/useCases/transport/index.ts +++ b/packages/runtime/src/useCases/transport/index.ts @@ -4,6 +4,7 @@ export * from "./devices"; export * from "./files"; export * from "./identityDeletionProcesses"; export * from "./messages"; -export * from "./relationshipTemplates"; +export * from "./publicRelationshipTemplateReferences"; export * from "./relationships"; +export * from "./relationshipTemplates"; export * from "./tokens"; diff --git a/packages/runtime/src/useCases/transport/publicRelationshipTemplateReferences/GetPublicRelationshipTemplateReferences.ts b/packages/runtime/src/useCases/transport/publicRelationshipTemplateReferences/GetPublicRelationshipTemplateReferences.ts new file mode 100644 index 000000000..5699b8d5f --- /dev/null +++ b/packages/runtime/src/useCases/transport/publicRelationshipTemplateReferences/GetPublicRelationshipTemplateReferences.ts @@ -0,0 +1,19 @@ +import { Result } from "@js-soft/ts-utils"; +import { PublicRelationshipTemplateReferencesController } from "@nmshd/transport"; +import { Inject } from "@nmshd/typescript-ioc"; +import { PublicRelationshipTemplateReferenceDTO } from "../../../types"; +import { UseCase } from "../../common"; +import { PublicRelationshipTemplateReferenceMapper } from "./PublicRelationshipTemplateReferenceMapper"; + +export class GetPublicRelationshipTemplateReferencesUseCase extends UseCase { + public constructor(@Inject private readonly publicRelationshipTemplateReferencesController: PublicRelationshipTemplateReferencesController) { + super(); + } + + protected async executeInternal(): Promise> { + const publicRelationshipTemplateReferences = await this.publicRelationshipTemplateReferencesController.getPublicRelationshipTemplateReferences(); + const templateReferences = PublicRelationshipTemplateReferenceMapper.toPublicRelationshipTemplateReferenceDTOList(publicRelationshipTemplateReferences); + + return Result.ok(templateReferences); + } +} diff --git a/packages/runtime/src/useCases/transport/publicRelationshipTemplateReferences/PublicRelationshipTemplateReferenceMapper.ts b/packages/runtime/src/useCases/transport/publicRelationshipTemplateReferences/PublicRelationshipTemplateReferenceMapper.ts new file mode 100644 index 000000000..4194f6306 --- /dev/null +++ b/packages/runtime/src/useCases/transport/publicRelationshipTemplateReferences/PublicRelationshipTemplateReferenceMapper.ts @@ -0,0 +1,18 @@ +import { PublicRelationshipTemplateReference } from "@nmshd/transport"; +import { PublicRelationshipTemplateReferenceDTO } from "../../../types/transport/PublicRelationshipTemplateReferenceDTO"; + +export class PublicRelationshipTemplateReferenceMapper { + public static toPublicRelationshipTemplateReferenceDTO(publicRelationshipTemplateReference: PublicRelationshipTemplateReference): PublicRelationshipTemplateReferenceDTO { + return { + title: publicRelationshipTemplateReference.title, + description: publicRelationshipTemplateReference.description, + truncatedReference: publicRelationshipTemplateReference.truncatedReference + }; + } + + public static toPublicRelationshipTemplateReferenceDTOList( + publicRelationshipTemplateReferences: PublicRelationshipTemplateReference[] + ): PublicRelationshipTemplateReferenceDTO[] { + return publicRelationshipTemplateReferences.map((reference) => this.toPublicRelationshipTemplateReferenceDTO(reference)); + } +} diff --git a/packages/runtime/src/useCases/transport/publicRelationshipTemplateReferences/index.ts b/packages/runtime/src/useCases/transport/publicRelationshipTemplateReferences/index.ts new file mode 100644 index 000000000..5aedb3201 --- /dev/null +++ b/packages/runtime/src/useCases/transport/publicRelationshipTemplateReferences/index.ts @@ -0,0 +1 @@ +export * from "./GetPublicRelationshipTemplateReferences"; diff --git a/packages/runtime/test/transport/publicRelationshipTemplateReferences.test.ts b/packages/runtime/test/transport/publicRelationshipTemplateReferences.test.ts new file mode 100644 index 000000000..b9829087c --- /dev/null +++ b/packages/runtime/test/transport/publicRelationshipTemplateReferences.test.ts @@ -0,0 +1,38 @@ +import { ClientResult, PublicRelationshipTemplateReferenceClient } from "@nmshd/transport"; +import { reset, spy, when } from "ts-mockito"; +import { RuntimeServiceProvider, TestRuntimeServices } from "../lib"; + +const serviceProvider = new RuntimeServiceProvider(); +let runtimeServices: TestRuntimeServices; +let mockClient: PublicRelationshipTemplateReferenceClient; + +beforeAll(async () => { + runtimeServices = (await serviceProvider.launch(1))[0]; + const client = runtimeServices.transport.publicRelationshipTemplateReferences["getPublicRelationshipTemplateReferencesUseCase"][ + "publicRelationshipTemplateReferencesController" + ]["client"] as PublicRelationshipTemplateReferenceClient; + + mockClient = spy(client); +}, 30000); + +afterAll(() => serviceProvider.stop()); + +afterEach(() => reset(mockClient)); + +describe("PublicRelationshipTemplateReferences", () => { + test("should read the PublicRelationshipTemplateReferences", async () => { + const mockResponse = [ + { + title: "aTitle", + description: "aDescription", + truncatedReference: "aReference" + } + ]; + + when(mockClient.getPublicRelationshipTemplateReferences()).thenResolve(ClientResult.ok(mockResponse)); + + const publicRelationshipTemplateReferences = await runtimeServices.transport.publicRelationshipTemplateReferences.getPublicRelationshipTemplateReferences(); + + expect(publicRelationshipTemplateReferences.value).toStrictEqual(mockResponse); + }); +}); diff --git a/packages/transport/src/core/TransportController.ts b/packages/transport/src/core/TransportController.ts index 05e549fa1..3743cf316 100644 --- a/packages/transport/src/core/TransportController.ts +++ b/packages/transport/src/core/TransportController.ts @@ -20,6 +20,7 @@ export enum ControllerName { File = "File", Identity = "Identity", Message = "Message", + PublicRelationshipTemplateReferences = "PublicRelationshipTemplateReferences", Relationship = "Relationship", Relationships = "Relationships", RelationshipTemplate = "RelationshipTemplate", diff --git a/packages/transport/src/modules/accounts/AccountController.ts b/packages/transport/src/modules/accounts/AccountController.ts index 6dee85801..96e761ea4 100644 --- a/packages/transport/src/modules/accounts/AccountController.ts +++ b/packages/transport/src/modules/accounts/AccountController.ts @@ -23,6 +23,7 @@ import { DeviceSecretCredentials } from "../devices/local/DeviceSecretCredential import { DeviceSharedSecret } from "../devices/transmission/DeviceSharedSecret"; import { FileController } from "../files/FileController"; import { MessageController } from "../messages/MessageController"; +import { PublicRelationshipTemplateReferencesController } from "../publicRelationshipTemplateReferences/PublicRelationshipTemplateReferencesController"; import { RelationshipTemplateController } from "../relationshipTemplates/RelationshipTemplateController"; import { RelationshipSecretController } from "../relationships/RelationshipSecretController"; import { RelationshipsController } from "../relationships/RelationshipsController"; @@ -59,6 +60,7 @@ export class AccountController { public devices: DevicesController; public files: FileController; public messages: MessageController; + public publicRelationshipTemplateReferences: PublicRelationshipTemplateReferencesController; public relationships: RelationshipsController; public relationshipTemplates: RelationshipTemplateController; private synchronization: SyncController; @@ -213,6 +215,7 @@ export class AccountController { this.relationshipTemplates = await new RelationshipTemplateController(this, this.relationshipSecrets).init(); this.messages = await new MessageController(this).init(); this.tokens = await new TokenController(this).init(); + this.publicRelationshipTemplateReferences = await new PublicRelationshipTemplateReferencesController(this).init(); this.synchronization = await new SyncController(this, this.dependencyOverrides, this.unpushedDatawalletModifications, this.config.datawalletEnabled).init(); diff --git a/packages/transport/src/modules/index.ts b/packages/transport/src/modules/index.ts index cefb1bab6..5d7c511a6 100644 --- a/packages/transport/src/modules/index.ts +++ b/packages/transport/src/modules/index.ts @@ -65,6 +65,9 @@ export * from "./messages/transmission/MessageEnvelope"; export * from "./messages/transmission/MessageEnvelopeRecipient"; export * from "./messages/transmission/MessageSignature"; export * from "./messages/transmission/MessageSigned"; +export * from "./publicRelationshipTemplateReferences/backbone/PublicRelationshipTemplateReferenceClient"; +export * from "./publicRelationshipTemplateReferences/data/PublicRelationshipTemplateReference"; +export * from "./publicRelationshipTemplateReferences/PublicRelationshipTemplateReferencesController"; export * from "./relationships/backbone/BackboneGetRelationships"; export * from "./relationships/backbone/BackbonePostRelationship"; export * from "./relationships/backbone/RelationshipClient"; diff --git a/packages/transport/src/modules/publicRelationshipTemplateReferences/PublicRelationshipTemplateReferencesController.ts b/packages/transport/src/modules/publicRelationshipTemplateReferences/PublicRelationshipTemplateReferencesController.ts new file mode 100644 index 000000000..635c15e36 --- /dev/null +++ b/packages/transport/src/modules/publicRelationshipTemplateReferences/PublicRelationshipTemplateReferencesController.ts @@ -0,0 +1,34 @@ +import { RequestError } from "../../core/backbone/RequestError"; +import { ControllerName, TransportController } from "../../core/TransportController"; +import { AccountController } from "../accounts/AccountController"; +import { PublicRelationshipTemplateReferenceClient } from "./backbone/PublicRelationshipTemplateReferenceClient"; +import { PublicRelationshipTemplateReference } from "./data/PublicRelationshipTemplateReference"; + +export class PublicRelationshipTemplateReferencesController extends TransportController { + public constructor(parent: AccountController) { + super(ControllerName.PublicRelationshipTemplateReferences, parent); + } + + private client: PublicRelationshipTemplateReferenceClient; + + public override async init(): Promise { + await super.init(); + + this.client = new PublicRelationshipTemplateReferenceClient(this.config, this.parent.authenticator, this.transport.correlator); + + return this; + } + + public async getPublicRelationshipTemplateReferences(): Promise { + try { + const result = await this.client.getPublicRelationshipTemplateReferences(); + + const references = result.value.map((reference) => PublicRelationshipTemplateReference.fromAny(reference)); + return references; + } catch (e) { + if (e instanceof RequestError && e.status === 404) return []; + + throw e; + } + } +} diff --git a/packages/transport/src/modules/publicRelationshipTemplateReferences/backbone/PublicRelationshipTemplateReferenceClient.ts b/packages/transport/src/modules/publicRelationshipTemplateReferences/backbone/PublicRelationshipTemplateReferenceClient.ts new file mode 100644 index 000000000..d048413cb --- /dev/null +++ b/packages/transport/src/modules/publicRelationshipTemplateReferences/backbone/PublicRelationshipTemplateReferenceClient.ts @@ -0,0 +1,14 @@ +import { ClientResult } from "../../../core/backbone/ClientResult"; +import { RESTClientAuthenticate } from "../../../core/backbone/RESTClientAuthenticate"; + +export interface BackbonePublicRelationshipTemplateReference { + title: string; + description: string; + truncatedReference: string; +} + +export class PublicRelationshipTemplateReferenceClient extends RESTClientAuthenticate { + public async getPublicRelationshipTemplateReferences(): Promise> { + return await this.get("/api/poc/PublicRelationshipTemplateReferences"); + } +} diff --git a/packages/transport/src/modules/publicRelationshipTemplateReferences/data/PublicRelationshipTemplateReference.ts b/packages/transport/src/modules/publicRelationshipTemplateReferences/data/PublicRelationshipTemplateReference.ts new file mode 100644 index 000000000..10c53b4be --- /dev/null +++ b/packages/transport/src/modules/publicRelationshipTemplateReferences/data/PublicRelationshipTemplateReference.ts @@ -0,0 +1,15 @@ +import { Serializable, serialize, validate } from "@js-soft/ts-serval"; + +export class PublicRelationshipTemplateReference extends Serializable { + @serialize() + @validate() + public title: string; + + @serialize() + @validate() + public description: string; + + @serialize() + @validate() + public truncatedReference: string; +} diff --git a/packages/transport/test/modules/publicRelationshipTemplateReferences/PublicRelationshipTemplateReferencesController.test.ts b/packages/transport/test/modules/publicRelationshipTemplateReferences/PublicRelationshipTemplateReferencesController.test.ts new file mode 100644 index 000000000..536a8e1c9 --- /dev/null +++ b/packages/transport/test/modules/publicRelationshipTemplateReferences/PublicRelationshipTemplateReferencesController.test.ts @@ -0,0 +1,61 @@ +import { IDatabaseConnection } from "@js-soft/docdb-access-abstractions"; +import { reset, spy, when } from "ts-mockito"; +import { AccountController, ClientResult, PublicRelationshipTemplateReferenceClient, RequestError, Transport } from "../../../src"; +import { TestUtil } from "../../testHelpers/TestUtil"; + +let connection: IDatabaseConnection; + +let transport: Transport; +let account: AccountController; +let mockedClient: PublicRelationshipTemplateReferenceClient; + +beforeAll(async function () { + connection = await TestUtil.createDatabaseConnection(); + transport = TestUtil.createTransport(connection); + + await transport.init(); + + const accounts = await TestUtil.provideAccounts(transport, 1); + + account = accounts[0]; + + const client = account.publicRelationshipTemplateReferences["client"]; + mockedClient = spy(client); +}); + +afterAll(async () => { + await account.close(); + + await connection.close(); +}); + +afterEach(() => reset(mockedClient)); + +describe("PublicRelationshipTemplateReferencesController", () => { + test("should return the backbone defined PublicRelationshipTemplateReferences", async () => { + const mockResponse = [{ title: "aTitle", description: "aDescription", truncatedReference: "aReference" }]; + when(mockedClient.getPublicRelationshipTemplateReferences()).thenResolve(ClientResult.ok(mockResponse)); + + const publicRelationshipTemplates = await account.publicRelationshipTemplateReferences.getPublicRelationshipTemplateReferences(); + + expect(publicRelationshipTemplates.map((reference) => reference.toJSON())).toStrictEqual(mockResponse); + }); + + test("should return an empty array if the backbone endpoint returns an empty array", async () => { + when(mockedClient.getPublicRelationshipTemplateReferences()).thenResolve(ClientResult.ok([])); + + const publicRelationshipTemplates = await account.publicRelationshipTemplateReferences.getPublicRelationshipTemplateReferences(); + + expect(publicRelationshipTemplates).toStrictEqual([]); + }); + + test("should return an empty array if the backbone endpoint is not available", async () => { + when(mockedClient.getPublicRelationshipTemplateReferences()).thenResolve( + ClientResult.fail(new RequestError("some method", "some path", undefined, undefined, undefined, undefined, 404)) + ); + + const publicRelationshipTemplates = await account.publicRelationshipTemplateReferences.getPublicRelationshipTemplateReferences(); + + expect(publicRelationshipTemplates).toHaveLength(0); + }); +});