@verii/server-credentialagent 1.0.0-pre.1752076816
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.
- package/.localdev.e2e.env +40 -0
- package/.localdev.env +41 -0
- package/.standalone.env +5 -0
- package/LICENSE +202 -0
- package/NOTICE +1 -0
- package/README.md +19 -0
- package/docker/compose.yml +33 -0
- package/e2e/README.md +12 -0
- package/e2e/org-registration-and-issuing.e2e.test.js +624 -0
- package/jest.config.js +20 -0
- package/migrate-mongo.config.js +36 -0
- package/migrations/20210317133137-add-index-to-offers-repo.js +57 -0
- package/migrations/20210416145639-add-index-to-revocation-list.js +27 -0
- package/migrations/20210719120225-add_unique_did_index_to_tenant.js +45 -0
- package/migrations/20230524053029-add-vendorUserIdMappings-index.js +32 -0
- package/migrations/20230616111907-add-configuration-type-index.js +32 -0
- package/package.json +108 -0
- package/src/assets/public/favicon.ico +0 -0
- package/src/assets/public/logo192.png +0 -0
- package/src/assets/public/logo512.png +0 -0
- package/src/assets/public/manifest.json +28 -0
- package/src/assets/templates/app-redirect.hbs +16 -0
- package/src/config/config.js +44 -0
- package/src/config/core-config.js +143 -0
- package/src/config/holder-config.js +104 -0
- package/src/config/index.js +22 -0
- package/src/config/operator-config.js +64 -0
- package/src/controllers/autoload-holder-api-controllers.js +30 -0
- package/src/controllers/autoload-operator-api-controllers.js +31 -0
- package/src/controllers/autoload-root-api-controller.js +30 -0
- package/src/controllers/autoload-saasoperator-api-controllers.js +31 -0
- package/src/controllers/holder/autohooks.js +55 -0
- package/src/controllers/holder/get-exchange-progress/autohooks.js +27 -0
- package/src/controllers/holder/get-exchange-progress/controller.js +50 -0
- package/src/controllers/holder/inspect/autohooks.js +35 -0
- package/src/controllers/holder/inspect/get-presentation-request/controller.js +100 -0
- package/src/controllers/holder/inspect/schemas/holder-disclosure.schema.json +73 -0
- package/src/controllers/holder/inspect/schemas/index.js +33 -0
- package/src/controllers/holder/inspect/schemas/presentation-definition.v1.schema.json +461 -0
- package/src/controllers/holder/inspect/schemas/presentation-request.schema.json +279 -0
- package/src/controllers/holder/inspect/schemas/presentation-submission.schema.json +41 -0
- package/src/controllers/holder/inspect/schemas/siop-presentation-submission.schema.json +74 -0
- package/src/controllers/holder/inspect/schemas/velocity-presentation-submission.response.200.schema.json +36 -0
- package/src/controllers/holder/inspect/schemas/velocity-presentation-submission.schema.json +34 -0
- package/src/controllers/holder/inspect/submit-presentation/controller.js +89 -0
- package/src/controllers/holder/issue/autohooks.js +23 -0
- package/src/controllers/holder/issue/get-credential-manifest/controller.js +193 -0
- package/src/controllers/holder/issue/offers/autohooks.js +35 -0
- package/src/controllers/holder/issue/offers/controller.js +164 -0
- package/src/controllers/holder/issue/offers/credential-offers/controller.js +460 -0
- package/src/controllers/holder/issue/submit-identification/autohooks.js +37 -0
- package/src/controllers/holder/issue/submit-identification/controller.js +63 -0
- package/src/controllers/holder/oauth/autohooks.js +19 -0
- package/src/controllers/holder/oauth/controller.js +140 -0
- package/src/controllers/index.js +22 -0
- package/src/controllers/operator/tenants/_tenantId/autohooks.js +40 -0
- package/src/controllers/operator/tenants/_tenantId/check-credentials/autohooks.js +24 -0
- package/src/controllers/operator/tenants/_tenantId/check-credentials/controller-v0.8.js +200 -0
- package/src/controllers/operator/tenants/_tenantId/check-credentials/schemas/index.js +19 -0
- package/src/controllers/operator/tenants/_tenantId/check-credentials/schemas/vendor-credential.schema.json +244 -0
- package/src/controllers/operator/tenants/_tenantId/controller-v0.8.js +221 -0
- package/src/controllers/operator/tenants/_tenantId/disclosures/_id/autohooks.js +30 -0
- package/src/controllers/operator/tenants/_tenantId/disclosures/_id/controller-v0.8.js +271 -0
- package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/autohooks.js +45 -0
- package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/controller-v0.8.js +199 -0
- package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/schemas/add-feed.schema.js +14 -0
- package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/schemas/feed.schema.json +27 -0
- package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/schemas/index.js +25 -0
- package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/schemas/modify-feed-update-body.schema.js +18 -0
- package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/schemas/modify-feed.schema.json +19 -0
- package/src/controllers/operator/tenants/_tenantId/disclosures/autohooks.js +34 -0
- package/src/controllers/operator/tenants/_tenantId/disclosures/controller-v0.8.js +100 -0
- package/src/controllers/operator/tenants/_tenantId/disclosures/schemas/agent-disclosure-presentation-definition.schema.json +404 -0
- package/src/controllers/operator/tenants/_tenantId/disclosures/schemas/agent-disclosure.schema.js +24 -0
- package/src/controllers/operator/tenants/_tenantId/disclosures/schemas/index.js +29 -0
- package/src/controllers/operator/tenants/_tenantId/disclosures/schemas/new-agent-disclosure.schema.json +166 -0
- package/src/controllers/operator/tenants/_tenantId/disclosures/schemas/update-agent-disclosure.schema.js +20 -0
- package/src/controllers/operator/tenants/_tenantId/exchanges/_exchangeId/autohooks.js +30 -0
- package/src/controllers/operator/tenants/_tenantId/exchanges/_exchangeId/controller-v0.8.js +73 -0
- package/src/controllers/operator/tenants/_tenantId/exchanges/autohooks.js +19 -0
- package/src/controllers/operator/tenants/_tenantId/exchanges/controller-v0.8.js +150 -0
- package/src/controllers/operator/tenants/_tenantId/exchanges/schemas/get-exchange.response.body.json +147 -0
- package/src/controllers/operator/tenants/_tenantId/exchanges/schemas/index.js +21 -0
- package/src/controllers/operator/tenants/_tenantId/issued-credentials/autohooks.js +27 -0
- package/src/controllers/operator/tenants/_tenantId/issued-credentials/controller-v0.8.js +303 -0
- package/src/controllers/operator/tenants/_tenantId/issued-credentials/schemas/index.js +23 -0
- package/src/controllers/operator/tenants/_tenantId/issued-credentials/schemas/issued-credential.schema.json +115 -0
- package/src/controllers/operator/tenants/_tenantId/issued-credentials/schemas/revoke-credentials.schema.json +18 -0
- package/src/controllers/operator/tenants/_tenantId/keys/controller-v0.8.js +168 -0
- package/src/controllers/operator/tenants/_tenantId/offer-data/controller-v0.8.js +78 -0
- package/src/controllers/operator/tenants/_tenantId/offers/autohooks.js +34 -0
- package/src/controllers/operator/tenants/_tenantId/offers/controller-v0.8.js +253 -0
- package/src/controllers/operator/tenants/_tenantId/offers/schemas/index.js +23 -0
- package/src/controllers/operator/tenants/_tenantId/offers/schemas/new-vendor-offer.schema.js +47 -0
- package/src/controllers/operator/tenants/_tenantId/offers/schemas/vendor-offer.schema.json +56 -0
- package/src/controllers/operator/tenants/_tenantId/users/autohooks.js +24 -0
- package/src/controllers/operator/tenants/_tenantId/users/controller-v0.8.js +92 -0
- package/src/controllers/operator/tenants/_tenantId/users/schemas/index.js +23 -0
- package/src/controllers/operator/tenants/_tenantId/users/schemas/new-user.schema.json +13 -0
- package/src/controllers/operator/tenants/_tenantId/users/schemas/user.schema.json +16 -0
- package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/autohooks.js +34 -0
- package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/controller-v0.8.js +110 -0
- package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/Credential.schema.js +18 -0
- package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/IssueCredentialOptions.schema.json +42 -0
- package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/IssueCredentialRequest.schema.json +13 -0
- package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/IssueCredentialResponse.schema.json +19 -0
- package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/LinkedDataProof.schema.json +43 -0
- package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/VerifiableCredential.schema.js +16 -0
- package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/index.js +31 -0
- package/src/controllers/operator/tenants/autohooks.js +65 -0
- package/src/controllers/operator/tenants/controller-v0.8.js +167 -0
- package/src/controllers/operator/tenants/schemas/index.js +41 -0
- package/src/controllers/operator/tenants/schemas/modify-secret.schema.json +11 -0
- package/src/controllers/operator/tenants/schemas/modify-tenant-v0.8.schema.json +44 -0
- package/src/controllers/operator/tenants/schemas/new-tenant-v0.8.schema.json +19 -0
- package/src/controllers/operator/tenants/schemas/new-tenant.response.200.schema.json +7 -0
- package/src/controllers/operator/tenants/schemas/secret-key-metadata.schema.json +31 -0
- package/src/controllers/operator/tenants/schemas/secret-key.schema.json +29 -0
- package/src/controllers/operator/tenants/schemas/secret-kid.schema.json +13 -0
- package/src/controllers/operator/tenants/schemas/secret-new-tenant-v0.8.schema.json +28 -0
- package/src/controllers/operator/tenants/schemas/secret-tenant-key-v0.8.schema.json +13 -0
- package/src/controllers/operator/tenants/schemas/tenant-key-v0.8.schema.json +14 -0
- package/src/controllers/operator/tenants/schemas/tenant-v0.8.schema.json +62 -0
- package/src/controllers/root/autohooks.js +23 -0
- package/src/controllers/root/controller.js +173 -0
- package/src/controllers/saasoperator/groups/_id/autohooks.js +9 -0
- package/src/controllers/saasoperator/groups/_id/controller.js +121 -0
- package/src/controllers/saasoperator/groups/autohooks.js +19 -0
- package/src/controllers/saasoperator/groups/controller.js +65 -0
- package/src/controllers/saasoperator/groups/schemas/group.schema.js +17 -0
- package/src/controllers/saasoperator/groups/schemas/index.js +4 -0
- package/src/controllers/saasoperator/groups/schemas/new-group.schema.js +13 -0
- package/src/entities/common/domains/get-json-at-path.js +28 -0
- package/src/entities/common/domains/index.js +17 -0
- package/src/entities/common/index.js +17 -0
- package/src/entities/credentials/domains/credential-format.js +22 -0
- package/src/entities/credentials/domains/index.js +19 -0
- package/src/entities/credentials/index.js +17 -0
- package/src/entities/deep-links/domains/extract-did.js +11 -0
- package/src/entities/deep-links/domains/index.js +20 -0
- package/src/entities/deep-links/domains/velocity-protocol-uri-to-http-uri.js +32 -0
- package/src/entities/deep-links/index.js +19 -0
- package/src/entities/disclosures/domains/assert-disclosure-active.js +21 -0
- package/src/entities/disclosures/domains/compute-disclosure-configuration-type.js +29 -0
- package/src/entities/disclosures/domains/constants.js +61 -0
- package/src/entities/disclosures/domains/errors.js +34 -0
- package/src/entities/disclosures/domains/get-disclosure-configuration-type.js +60 -0
- package/src/entities/disclosures/domains/index.js +32 -0
- package/src/entities/disclosures/domains/is-issuing-disclosure.js +23 -0
- package/src/entities/disclosures/domains/parse-body-to-disclosure.js +17 -0
- package/src/entities/disclosures/domains/validate-by-identification-method.js +69 -0
- package/src/entities/disclosures/domains/validate-commercial-entity.js +26 -0
- package/src/entities/disclosures/domains/validate-disclosure-by-configuration-type.js +47 -0
- package/src/entities/disclosures/domains/validate-disclosure-default-issuing.js +77 -0
- package/src/entities/disclosures/domains/validate-disclosure.js +37 -0
- package/src/entities/disclosures/domains/validate-feed.js +16 -0
- package/src/entities/disclosures/domains/validate-presentation-definition.js +54 -0
- package/src/entities/disclosures/domains/validate-vendor-endpoint.js +22 -0
- package/src/entities/disclosures/domains/validate-vendor-webhook.js +18 -0
- package/src/entities/disclosures/factories/disclosure-factory.js +94 -0
- package/src/entities/disclosures/factories/index.js +19 -0
- package/src/entities/disclosures/index.js +22 -0
- package/src/entities/disclosures/orchestrators/get-disclosure.js +18 -0
- package/src/entities/disclosures/orchestrators/index.js +20 -0
- package/src/entities/disclosures/orchestrators/update-disclosure-configuration-type.js +32 -0
- package/src/entities/disclosures/repos/index.js +20 -0
- package/src/entities/disclosures/repos/repo.js +118 -0
- package/src/entities/disclosures/repos/set-configuration-type.js +33 -0
- package/src/entities/exchanges/adapters/index.js +17 -0
- package/src/entities/exchanges/adapters/sign-exchange-response.js +45 -0
- package/src/entities/exchanges/domains/build-exchange-progress.js +56 -0
- package/src/entities/exchanges/domains/constants.js +24 -0
- package/src/entities/exchanges/domains/ensure-exchange-state-valid.js +35 -0
- package/src/entities/exchanges/domains/errors.js +33 -0
- package/src/entities/exchanges/domains/index.js +25 -0
- package/src/entities/exchanges/domains/states.js +43 -0
- package/src/entities/exchanges/domains/types.js +31 -0
- package/src/entities/exchanges/factories/disclosure-exchange-factory.js +46 -0
- package/src/entities/exchanges/factories/index.js +20 -0
- package/src/entities/exchanges/factories/offer-exchange-factory.js +48 -0
- package/src/entities/exchanges/index.js +23 -0
- package/src/entities/exchanges/orchestrators/build-exchange-request-deep-link.js +50 -0
- package/src/entities/exchanges/orchestrators/index.js +19 -0
- package/src/entities/exchanges/repos/exchange-repo-projections.js +45 -0
- package/src/entities/exchanges/repos/exchange-state-repo-extension.js +76 -0
- package/src/entities/exchanges/repos/index.js +20 -0
- package/src/entities/exchanges/repos/repo.js +44 -0
- package/src/entities/feeds/factories/feed-factory.js +47 -0
- package/src/entities/feeds/factories/index.js +19 -0
- package/src/entities/feeds/index.js +20 -0
- package/src/entities/feeds/repos/index.js +19 -0
- package/src/entities/feeds/repos/repo.js +95 -0
- package/src/entities/groups/domains/format-group.js +11 -0
- package/src/entities/groups/domains/index.js +3 -0
- package/src/entities/groups/factories/group-factory.js +40 -0
- package/src/entities/groups/factories/index.js +19 -0
- package/src/entities/groups/index.js +22 -0
- package/src/entities/groups/orchestrators/find-group-or-error.js +16 -0
- package/src/entities/groups/orchestrators/index.js +6 -0
- package/src/entities/groups/orchestrators/validate-did.js +24 -0
- package/src/entities/groups/orchestrators/validate-group-by-user.js +16 -0
- package/src/entities/groups/orchestrators/validate-group.js +39 -0
- package/src/entities/groups/repos/delete-tenant-extension.js +13 -0
- package/src/entities/groups/repos/index.js +19 -0
- package/src/entities/groups/repos/repo.js +38 -0
- package/src/entities/groups/repos/update-or-error-extension.js +46 -0
- package/src/entities/index.js +37 -0
- package/src/entities/keys/domains/constants.js +37 -0
- package/src/entities/keys/domains/index.js +21 -0
- package/src/entities/keys/domains/is-matching-private-key-kid.js +41 -0
- package/src/entities/keys/domains/validate-key.js +62 -0
- package/src/entities/keys/factories/index.js +19 -0
- package/src/entities/keys/factories/key-factory.js +56 -0
- package/src/entities/keys/index.js +22 -0
- package/src/entities/keys/orchestrators/index.js +3 -0
- package/src/entities/keys/orchestrators/validate-did-doc-keys.js +69 -0
- package/src/entities/metadata-list-allocations/index.js +19 -0
- package/src/entities/metadata-list-allocations/repos/index.js +19 -0
- package/src/entities/metadata-list-allocations/repos/repo.js +40 -0
- package/src/entities/notifications/domains/index.js +19 -0
- package/src/entities/notifications/domains/notification-types.js +25 -0
- package/src/entities/notifications/index.js +19 -0
- package/src/entities/offers/domains/build-clean-pii-filter.js +35 -0
- package/src/entities/offers/domains/build-deeplink-url.js +120 -0
- package/src/entities/offers/domains/build-offer.js +88 -0
- package/src/entities/offers/domains/build-qr-code-url.js +37 -0
- package/src/entities/offers/domains/constants.js +32 -0
- package/src/entities/offers/domains/filter-object-ids.js +34 -0
- package/src/entities/offers/domains/generate-issuing-challenge.js +26 -0
- package/src/entities/offers/domains/generate-link-code.js +35 -0
- package/src/entities/offers/domains/index.js +31 -0
- package/src/entities/offers/domains/post-validation-offers-handler.js +31 -0
- package/src/entities/offers/domains/prepare-linked-credentials-for-holder.js +36 -0
- package/src/entities/offers/domains/resolve-subject.js +142 -0
- package/src/entities/offers/domains/validate-offer-commercial-entity.js +24 -0
- package/src/entities/offers/domains/validate-offer.js +90 -0
- package/src/entities/offers/factories/index.js +19 -0
- package/src/entities/offers/factories/offer-factory.js +119 -0
- package/src/entities/offers/index.js +22 -0
- package/src/entities/offers/orchestrators/create-verifiable-credentials.js +131 -0
- package/src/entities/offers/orchestrators/finalize-exchange.js +44 -0
- package/src/entities/offers/orchestrators/index.js +23 -0
- package/src/entities/offers/orchestrators/load-credential-refs.js +57 -0
- package/src/entities/offers/orchestrators/load-credential-types-map.js +44 -0
- package/src/entities/offers/orchestrators/prepare-offers.js +35 -0
- package/src/entities/offers/orchestrators/trigger-issued-credentials-webhook.js +63 -0
- package/src/entities/offers/repos/clean-pii-extension.js +85 -0
- package/src/entities/offers/repos/index.js +20 -0
- package/src/entities/offers/repos/issued-credential-projection.js +44 -0
- package/src/entities/offers/repos/repo.js +177 -0
- package/src/entities/presentations/domains/build-identity-doc.js +120 -0
- package/src/entities/presentations/domains/build-request-response-schema.js +46 -0
- package/src/entities/presentations/domains/build-vendor-data.js +31 -0
- package/src/entities/presentations/domains/check-payment-requirement.js +30 -0
- package/src/entities/presentations/domains/errors.js +28 -0
- package/src/entities/presentations/domains/extract-fields-from-id-credential.js +35 -0
- package/src/entities/presentations/domains/index.js +26 -0
- package/src/entities/presentations/domains/merge-credential-check-results.js +24 -0
- package/src/entities/presentations/domains/validate-presentation.js +128 -0
- package/src/entities/presentations/index.js +20 -0
- package/src/entities/presentations/orchestrators/create-presentation-request.js +148 -0
- package/src/entities/presentations/orchestrators/deduplicate-disclosure-exchange.js +52 -0
- package/src/entities/presentations/orchestrators/handle-presentation-submission.js +47 -0
- package/src/entities/presentations/orchestrators/index.js +20 -0
- package/src/entities/presentations/orchestrators/match-identity-on-exchange.js +114 -0
- package/src/entities/presentations/orchestrators/share-identification-credentials.js +110 -0
- package/src/entities/presentations/orchestrators/share-presentation.js +234 -0
- package/src/entities/push-delegate/get-push-delegate.js +37 -0
- package/src/entities/push-delegate/index.js +17 -0
- package/src/entities/redirect/index.js +3 -0
- package/src/entities/redirect/orchestrators/index.js +3 -0
- package/src/entities/redirect/orchestrators/load-org-info.js +40 -0
- package/src/entities/revocation-list-allocations/index.js +19 -0
- package/src/entities/revocation-list-allocations/repos/index.js +19 -0
- package/src/entities/revocation-list-allocations/repos/repo.js +40 -0
- package/src/entities/schemas/index.js +19 -0
- package/src/entities/schemas/orchestrators/index.js +19 -0
- package/src/entities/schemas/orchestrators/load-schema-validation.js +73 -0
- package/src/entities/tenants/domains/build-service-ids.js +27 -0
- package/src/entities/tenants/domains/extract-service.js +27 -0
- package/src/entities/tenants/domains/index.js +21 -0
- package/src/entities/tenants/domains/validate-service-ids.js +35 -0
- package/src/entities/tenants/factories/index.js +19 -0
- package/src/entities/tenants/factories/tenant-factory.js +37 -0
- package/src/entities/tenants/index.js +22 -0
- package/src/entities/tenants/orchestrators/add-primary-address-to-tenant.js +47 -0
- package/src/entities/tenants/orchestrators/create-tenant.js +91 -0
- package/src/entities/tenants/orchestrators/index.js +22 -0
- package/src/entities/tenants/orchestrators/refresh-tenant-dids.js +146 -0
- package/src/entities/tenants/orchestrators/set-tenant-default-issuing-disclosure.js +31 -0
- package/src/entities/tenants/repos/index.js +20 -0
- package/src/entities/tenants/repos/insert-tenant-extension.js +33 -0
- package/src/entities/tenants/repos/repo.js +52 -0
- package/src/entities/tenants/repos/tenant-default-projection.js +33 -0
- package/src/entities/tokens/adapters/access-token.js +49 -0
- package/src/entities/tokens/adapters/index.js +19 -0
- package/src/entities/tokens/index.js +19 -0
- package/src/entities/users/factories/index.js +19 -0
- package/src/entities/users/factories/user-factory.js +36 -0
- package/src/entities/users/index.js +20 -0
- package/src/entities/users/repos/add-anonymous-user-repo-extension.js +23 -0
- package/src/entities/users/repos/find-or-insert-vendor-user-repo-extension.js +30 -0
- package/src/entities/users/repos/index.js +19 -0
- package/src/entities/users/repos/repo.js +50 -0
- package/src/fetchers/index.js +20 -0
- package/src/fetchers/operator/identify-fetcher.js +36 -0
- package/src/fetchers/operator/index.js +21 -0
- package/src/fetchers/operator/inspection-fetcher.js +35 -0
- package/src/fetchers/operator/issuing-fetcher.js +50 -0
- package/src/fetchers/operator/webhook-auth-header.js +45 -0
- package/src/fetchers/push-gateway/generate-push-gateway-token.js +40 -0
- package/src/fetchers/push-gateway/index.js +19 -0
- package/src/fetchers/push-gateway/push-fetcher.js +39 -0
- package/src/index.js +19 -0
- package/src/init-holder-server.js +108 -0
- package/src/init-operator-server.js +101 -0
- package/src/init-server.js +120 -0
- package/src/main-holder.js +18 -0
- package/src/main-operator.js +19 -0
- package/src/main.js +18 -0
- package/src/plugins/autoload-repos.js +28 -0
- package/src/plugins/disclosure-loader-plugin.js +56 -0
- package/src/plugins/ensure-disclosure-active-plugin.js +30 -0
- package/src/plugins/ensure-disclosure-configuration-type-plugin.js +29 -0
- package/src/plugins/ensure-tenant-default-issuing-disclosure-id-plugin.js +60 -0
- package/src/plugins/ensure-tenant-primary-address-plugin.js +44 -0
- package/src/plugins/exchange-error-handler-plugin.js +51 -0
- package/src/plugins/exchange-loader-plugin.js +50 -0
- package/src/plugins/group-loader-plugin.js +51 -0
- package/src/plugins/index.js +32 -0
- package/src/plugins/kms-plugin.js +57 -0
- package/src/plugins/tenant-loader-plugin.js +91 -0
- package/src/plugins/validate-cao-plugin.js +81 -0
- package/src/plugins/vendor-routes-auth-plugin.js +24 -0
- package/src/plugins/verify-access-token-plugin.js +88 -0
- package/src/standalone.js +24 -0
- package/src/start-app-server.js +38 -0
- package/test/combined/app-redirect.test.js +199 -0
- package/test/combined/helpers/credentialagent-build-fastify.js +29 -0
- package/test/combined/helpers/index.js +22 -0
- package/test/combined/helpers/nock-registrar-app-schema-name.js +50 -0
- package/test/combined/helpers/nock-registrar-get-organization-diddoc.js +26 -0
- package/test/combined/helpers/nock-registrar-get-organization-verified-profile.js +33 -0
- package/test/combined/manifest.json.test.js +55 -0
- package/test/combined/root-controller.test.js +42 -0
- package/test/combined/schemas/education-degree.schema.json +166 -0
- package/test/combined/schemas/employment-current-v1.1.schema.json +253 -0
- package/test/combined/schemas/open-badge-credential.schema.json +1285 -0
- package/test/combined/schemas/past-employment-position-with-uri-id.schema.js +22 -0
- package/test/combined/schemas/past-employment-position.schema.json +148 -0
- package/test/combined/schemas/will-always-validate.json +10 -0
- package/test/combined/validate-cao-plugin.test.js +155 -0
- package/test/get-push-delegate.test.js +54 -0
- package/test/helpers/jwt-vc-expectation.js +109 -0
- package/test/holder/build-request-response-schema.test.js +55 -0
- package/test/holder/credential-manifest-controller.test.js +3192 -0
- package/test/holder/e2e-issuing-controller.test.js +425 -0
- package/test/holder/get-exchange-progress-controller.test.js +521 -0
- package/test/holder/get-presentation-request.test.js +906 -0
- package/test/holder/helpers/credential-type-metadata.js +98 -0
- package/test/holder/helpers/credentialagent-holder-build-fastify.js +32 -0
- package/test/holder/helpers/generate-presentation.js +441 -0
- package/test/holder/helpers/generate-test-access-token.js +54 -0
- package/test/holder/helpers/jwt-access-token-expectation.js +32 -0
- package/test/holder/helpers/jwt-vc-expectation.js +115 -0
- package/test/holder/issuing-controller.test.js +7076 -0
- package/test/holder/oauth-token-controller.test.js +412 -0
- package/test/holder/presentation-submission.test.js +2365 -0
- package/test/holder/submit-identification.test.js +4815 -0
- package/test/operator/check-credentials-controller-v0.8.test.js +832 -0
- package/test/operator/credentials-revoke.test.js +536 -0
- package/test/operator/disclosures-controller-v0.8.test.js +4157 -0
- package/test/operator/exchanges-controller-v0.8.test.js +414 -0
- package/test/operator/exchanges-id-controller-v0.8.test.js +162 -0
- package/test/operator/feeds-controller-v0.8.test.js +659 -0
- package/test/operator/generate-push-gateway-token.test.js +116 -0
- package/test/operator/groups-controller.test.js +145 -0
- package/test/operator/groups-id-controller.test.js +287 -0
- package/test/operator/helpers/create-test-org-doc.js +60 -0
- package/test/operator/helpers/credentialagent-operator-build-fastify.js +32 -0
- package/test/operator/helpers/find-kms-key.js +31 -0
- package/test/operator/helpers/generate-primary-and-add-operator-to-primary.js +63 -0
- package/test/operator/helpers/init-agent-kms.js +22 -0
- package/test/operator/issued-credentials-controller-v0.8.test.js +398 -0
- package/test/operator/keys-controller-v0.8.test.js +1130 -0
- package/test/operator/offer-data-controller-v0.8.test.js +253 -0
- package/test/operator/offers-controller-v0.8.test.js +3026 -0
- package/test/operator/set-configuration-type-modifier.test.js +75 -0
- package/test/operator/swagger.test.js +37 -0
- package/test/operator/tenant-controller-v0.8.test.js +730 -0
- package/test/operator/tenant-loader-plugin.test.js +96 -0
- package/test/operator/tenants-controller-v0.8.test.js +2093 -0
- package/test/operator/users-controller-v0.8.test.js +137 -0
- package/test/operator/vc-api-credentials.test.js +963 -0
- package/verification.env +28 -0
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2023 Velocity Team
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
// eslint-disable-next-line import/order
|
|
18
|
+
const buildFastify = require('./helpers/credentialagent-operator-build-fastify');
|
|
19
|
+
|
|
20
|
+
const { mongoDb } = require('@spencejs/spence-mongo-repos');
|
|
21
|
+
const { ObjectId } = require('mongodb');
|
|
22
|
+
const { mongoify, errorResponseMatcher } = require('@verii/tests-helpers');
|
|
23
|
+
const {
|
|
24
|
+
initTenantFactory,
|
|
25
|
+
initDisclosureFactory,
|
|
26
|
+
ExchangeStates,
|
|
27
|
+
ExchangeTypes,
|
|
28
|
+
VendorEndpoint,
|
|
29
|
+
ExchangeErrors,
|
|
30
|
+
} = require('../../src/entities');
|
|
31
|
+
|
|
32
|
+
const url = (tenant) => `/operator-api/v0.8/tenants/${tenant._id}/exchanges`;
|
|
33
|
+
|
|
34
|
+
const clearDb = async () => {
|
|
35
|
+
await mongoDb().collection('tenants').deleteMany({});
|
|
36
|
+
await mongoDb().collection('disclosures').deleteMany({});
|
|
37
|
+
await mongoDb().collection('exchanges').deleteMany({});
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
describe('vendor exchange creation', () => {
|
|
41
|
+
let fastify;
|
|
42
|
+
let persistTenant;
|
|
43
|
+
let persistDisclosure;
|
|
44
|
+
let tenant;
|
|
45
|
+
|
|
46
|
+
beforeAll(async () => {
|
|
47
|
+
fastify = buildFastify();
|
|
48
|
+
await fastify.ready();
|
|
49
|
+
({ persistTenant } = initTenantFactory(fastify));
|
|
50
|
+
({ persistDisclosure } = initDisclosureFactory(fastify));
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
beforeEach(async () => {
|
|
54
|
+
await clearDb();
|
|
55
|
+
tenant = await persistTenant();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
afterAll(async () => {
|
|
59
|
+
await clearDb();
|
|
60
|
+
await fastify.close();
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('should 201 when exchangeId generated for DISCLOSURE type', async () => {
|
|
64
|
+
const disclosure = await persistDisclosure({ tenant });
|
|
65
|
+
const payload = { type: 'DISCLOSURE', disclosureId: disclosure._id };
|
|
66
|
+
const response = await fastify.injectJson({
|
|
67
|
+
method: 'POST',
|
|
68
|
+
url: url(tenant),
|
|
69
|
+
payload,
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
expect(response.statusCode).toEqual(201);
|
|
73
|
+
expect(response.json).toEqual({ id: expect.any(String) });
|
|
74
|
+
const dbResult = await mongoDb()
|
|
75
|
+
.collection('exchanges')
|
|
76
|
+
.findOne({ _id: new ObjectId(response.json.id) });
|
|
77
|
+
expect(dbResult).toEqual(
|
|
78
|
+
mongoify({
|
|
79
|
+
...payload,
|
|
80
|
+
_id: response.json.id,
|
|
81
|
+
events: [{ state: ExchangeStates.NEW, timestamp: expect.any(Date) }],
|
|
82
|
+
tenantId: tenant._id,
|
|
83
|
+
createdBy: 'velocity.admin@example.com',
|
|
84
|
+
createdAt: expect.any(Date),
|
|
85
|
+
updatedAt: expect.any(Date),
|
|
86
|
+
})
|
|
87
|
+
);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('should 400 when disclosureId is missing for a DISCLOSURE type', async () => {
|
|
91
|
+
await persistDisclosure({ tenant });
|
|
92
|
+
|
|
93
|
+
const response = await fastify.injectJson({
|
|
94
|
+
method: 'POST',
|
|
95
|
+
url: url(tenant),
|
|
96
|
+
payload: { type: 'DISCLOSURE' },
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
expect(response.statusCode).toEqual(400);
|
|
100
|
+
expect(response.json.message).toEqual(
|
|
101
|
+
ExchangeErrors.DISCLOSURE_ID_REQUIRED
|
|
102
|
+
);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('should 400 when type is missing', async () => {
|
|
106
|
+
const response = await fastify.injectJson({
|
|
107
|
+
method: 'POST',
|
|
108
|
+
url: url(tenant),
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
expect(response.statusCode).toEqual(400);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('should 201 when exchangeId generated for ISSUING type', async () => {
|
|
115
|
+
const disclosure = await persistDisclosure({
|
|
116
|
+
vendorEndpoint: VendorEndpoint.ISSUING_IDENTIFICATION,
|
|
117
|
+
tenant,
|
|
118
|
+
});
|
|
119
|
+
const payload = {
|
|
120
|
+
type: ExchangeTypes.ISSUING,
|
|
121
|
+
};
|
|
122
|
+
const response = await fastify.injectJson({
|
|
123
|
+
method: 'POST',
|
|
124
|
+
url: url(tenant),
|
|
125
|
+
payload,
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
expect(response.statusCode).toEqual(201);
|
|
129
|
+
expect(response.json).toEqual({ id: expect.any(String) });
|
|
130
|
+
const dbResult = await mongoDb()
|
|
131
|
+
.collection('exchanges')
|
|
132
|
+
.findOne({ _id: new ObjectId(response.json.id) });
|
|
133
|
+
expect(dbResult).toEqual(
|
|
134
|
+
mongoify({
|
|
135
|
+
...payload,
|
|
136
|
+
_id: response.json.id,
|
|
137
|
+
events: [{ state: ExchangeStates.NEW, timestamp: expect.any(Date) }],
|
|
138
|
+
disclosureId: disclosure._id,
|
|
139
|
+
tenantId: tenant._id,
|
|
140
|
+
createdBy: 'velocity.admin@example.com',
|
|
141
|
+
createdAt: expect.any(Date),
|
|
142
|
+
updatedAt: expect.any(Date),
|
|
143
|
+
})
|
|
144
|
+
);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('should 400 when exchangeId generated for ISSUING type but no disclosure is setup', async () => {
|
|
148
|
+
const response = await fastify.injectJson({
|
|
149
|
+
method: 'POST',
|
|
150
|
+
url: url(tenant),
|
|
151
|
+
payload: {
|
|
152
|
+
type: ExchangeTypes.ISSUING,
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
expect(response.statusCode).toEqual(400);
|
|
157
|
+
expect(response.json.message).toEqual(
|
|
158
|
+
ExchangeErrors.IDENTIFICATION_DISCLOSURE_MISSING_TEMPLATE(tenant)
|
|
159
|
+
);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('should 400 when wrong type specified', async () => {
|
|
163
|
+
const response = await fastify.injectJson({
|
|
164
|
+
method: 'POST',
|
|
165
|
+
url: url(tenant),
|
|
166
|
+
payload: { type: 'SOMETHING' },
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
expect(response.statusCode).toEqual(400);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
describe('INTEGRATED_IDENTIFICATION exchanges', () => {
|
|
173
|
+
it('should 201 when creating a properly formatted integrated issuing exchange', async () => {
|
|
174
|
+
const disclosure = await persistDisclosure({
|
|
175
|
+
vendorEndpoint: VendorEndpoint.INTEGRATED_ISSUING_IDENTIFICATION,
|
|
176
|
+
tenant,
|
|
177
|
+
identityMatchers: {
|
|
178
|
+
rules: [
|
|
179
|
+
{
|
|
180
|
+
valueIndex: 0, // used for identifying the value
|
|
181
|
+
path: ['$.emails'], // jsonPath within the credential
|
|
182
|
+
rule: 'pick', // Rule to execute can be pick, all (if the target is an array), equal (if the target is a singleValue)
|
|
183
|
+
},
|
|
184
|
+
],
|
|
185
|
+
vendorUserIdIndex: 0,
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
const payload = {
|
|
189
|
+
type: ExchangeTypes.ISSUING,
|
|
190
|
+
disclosureId: disclosure._id,
|
|
191
|
+
identityMatcherValues: ['adam.smith@example.com'],
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
const response = await fastify.injectJson({
|
|
195
|
+
method: 'POST',
|
|
196
|
+
url: url(tenant),
|
|
197
|
+
payload,
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
expect(response.statusCode).toEqual(201);
|
|
201
|
+
expect(response.json).toEqual({ id: expect.any(String) });
|
|
202
|
+
const dbResult = await mongoDb()
|
|
203
|
+
.collection('exchanges')
|
|
204
|
+
.findOne({ _id: new ObjectId(response.json.id) });
|
|
205
|
+
expect(dbResult).toEqual(
|
|
206
|
+
mongoify({
|
|
207
|
+
...payload,
|
|
208
|
+
_id: response.json.id,
|
|
209
|
+
events: [{ state: ExchangeStates.NEW, timestamp: expect.any(Date) }],
|
|
210
|
+
tenantId: tenant._id,
|
|
211
|
+
createdBy: 'velocity.admin@example.com',
|
|
212
|
+
createdAt: expect.any(Date),
|
|
213
|
+
updatedAt: expect.any(Date),
|
|
214
|
+
})
|
|
215
|
+
);
|
|
216
|
+
});
|
|
217
|
+
it('should 201 when creating a properly formatted integrated issuing exchange with sparse value array', async () => {
|
|
218
|
+
const disclosure = await persistDisclosure({
|
|
219
|
+
vendorEndpoint: VendorEndpoint.INTEGRATED_ISSUING_IDENTIFICATION,
|
|
220
|
+
tenant,
|
|
221
|
+
identityMatchers: {
|
|
222
|
+
rules: [
|
|
223
|
+
{
|
|
224
|
+
valueIndex: 0, // used for identifying the value
|
|
225
|
+
path: ['$.emails'], // jsonPath within the credential
|
|
226
|
+
rule: 'pick', // Rule to execute can be pick, all (if the target is an array), equal (if the target is a singleValue)
|
|
227
|
+
},
|
|
228
|
+
],
|
|
229
|
+
vendorUserIdIndex: 2,
|
|
230
|
+
},
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
const payload = {
|
|
234
|
+
type: ExchangeTypes.ISSUING,
|
|
235
|
+
disclosureId: disclosure._id,
|
|
236
|
+
identityMatcherValues: [10, '', 'adam.smith@example.com', ''],
|
|
237
|
+
};
|
|
238
|
+
const response = await fastify.injectJson({
|
|
239
|
+
method: 'POST',
|
|
240
|
+
url: url(tenant),
|
|
241
|
+
payload,
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
expect(response.statusCode).toEqual(201);
|
|
245
|
+
expect(response.json).toEqual({ id: expect.any(String) });
|
|
246
|
+
const dbResult = await mongoDb()
|
|
247
|
+
.collection('exchanges')
|
|
248
|
+
.findOne({ _id: new ObjectId(response.json.id) });
|
|
249
|
+
expect(dbResult).toEqual(
|
|
250
|
+
mongoify({
|
|
251
|
+
...payload,
|
|
252
|
+
_id: response.json.id,
|
|
253
|
+
events: [{ state: ExchangeStates.NEW, timestamp: expect.any(Date) }],
|
|
254
|
+
tenantId: tenant._id,
|
|
255
|
+
createdBy: 'velocity.admin@example.com',
|
|
256
|
+
createdAt: expect.any(Date),
|
|
257
|
+
updatedAt: expect.any(Date),
|
|
258
|
+
})
|
|
259
|
+
);
|
|
260
|
+
});
|
|
261
|
+
it('should 201 when creating a an integrated issuing exchange with a phone number with a leading plus', async () => {
|
|
262
|
+
const disclosure = await persistDisclosure({
|
|
263
|
+
vendorEndpoint: VendorEndpoint.INTEGRATED_ISSUING_IDENTIFICATION,
|
|
264
|
+
tenant,
|
|
265
|
+
identityMatchers: {
|
|
266
|
+
rules: [
|
|
267
|
+
{
|
|
268
|
+
valueIndex: 0, // used for identifying the value
|
|
269
|
+
path: ['$.phones'], // jsonPath within the credential
|
|
270
|
+
rule: 'pick', // Rule to execute can be pick, all (if the target is an array), equal (if the target is a singleValue)
|
|
271
|
+
},
|
|
272
|
+
],
|
|
273
|
+
vendorUserIdIndex: 0,
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
const identityMatcherValues = ['+15556192191'];
|
|
277
|
+
const response = await fastify.injectJson({
|
|
278
|
+
method: 'POST',
|
|
279
|
+
url: url(tenant),
|
|
280
|
+
payload: {
|
|
281
|
+
type: ExchangeTypes.ISSUING,
|
|
282
|
+
disclosureId: disclosure._id,
|
|
283
|
+
identityMatcherValues,
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
expect(response.statusCode).toEqual(201);
|
|
288
|
+
expect(response.json).toEqual({ id: expect.any(String) });
|
|
289
|
+
const dbResult = await mongoDb()
|
|
290
|
+
.collection('exchanges')
|
|
291
|
+
.findOne({ _id: new ObjectId(response.json.id) });
|
|
292
|
+
expect(dbResult).toEqual({
|
|
293
|
+
_id: new ObjectId(response.json.id),
|
|
294
|
+
type: ExchangeTypes.ISSUING,
|
|
295
|
+
identityMatcherValues,
|
|
296
|
+
events: [{ state: ExchangeStates.NEW, timestamp: expect.any(Date) }],
|
|
297
|
+
disclosureId: new ObjectId(disclosure._id),
|
|
298
|
+
tenantId: new ObjectId(tenant._id),
|
|
299
|
+
createdBy: 'velocity.admin@example.com',
|
|
300
|
+
createdAt: expect.any(Date),
|
|
301
|
+
updatedAt: expect.any(Date),
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
it('should 400 if identityMatchValues not set', async () => {
|
|
305
|
+
const disclosure = await persistDisclosure({
|
|
306
|
+
vendorEndpoint: VendorEndpoint.INTEGRATED_ISSUING_IDENTIFICATION,
|
|
307
|
+
tenant,
|
|
308
|
+
identityMatchers: {
|
|
309
|
+
rules: [
|
|
310
|
+
{
|
|
311
|
+
valueIndex: 0, // used for identifying the value
|
|
312
|
+
path: ['$.emails'], // jsonPath within the credential
|
|
313
|
+
rule: 'pick', // Rule to execute can be pick, all (if the target is an array), equal (if the target is a singleValue)
|
|
314
|
+
},
|
|
315
|
+
],
|
|
316
|
+
vendorUserIdIndex: 0,
|
|
317
|
+
},
|
|
318
|
+
});
|
|
319
|
+
const response = await fastify.injectJson({
|
|
320
|
+
method: 'POST',
|
|
321
|
+
url: url(tenant),
|
|
322
|
+
payload: {
|
|
323
|
+
disclosureId: disclosure._id,
|
|
324
|
+
type: ExchangeTypes.ISSUING,
|
|
325
|
+
},
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
expect(response.statusCode).toEqual(400);
|
|
329
|
+
expect(response.json).toEqual(
|
|
330
|
+
errorResponseMatcher({
|
|
331
|
+
statusCode: 400,
|
|
332
|
+
error: 'Bad Request',
|
|
333
|
+
errorCode: 'missing_error_code',
|
|
334
|
+
message:
|
|
335
|
+
'When disclosure is using the { "vendorEndpoint: "integrated-issuing-identification" } "identityMatcherValues" property is required',
|
|
336
|
+
})
|
|
337
|
+
);
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
it('should 400 if missing an identityMatchValue', async () => {
|
|
341
|
+
const disclosure = await persistDisclosure({
|
|
342
|
+
vendorEndpoint: VendorEndpoint.INTEGRATED_ISSUING_IDENTIFICATION,
|
|
343
|
+
tenant,
|
|
344
|
+
identityMatchers: {
|
|
345
|
+
rules: [
|
|
346
|
+
{
|
|
347
|
+
valueIndex: 0, // used for identifying the value
|
|
348
|
+
path: ['$.emails'], // jsonPath within the credential
|
|
349
|
+
rule: 'pick', // Rule to execute can be pick, all (if the target is an array), equal (if the target is a singleValue)
|
|
350
|
+
},
|
|
351
|
+
],
|
|
352
|
+
vendorUserIdIndex: 0,
|
|
353
|
+
},
|
|
354
|
+
});
|
|
355
|
+
const response = await fastify.injectJson({
|
|
356
|
+
method: 'POST',
|
|
357
|
+
url: url(tenant),
|
|
358
|
+
payload: {
|
|
359
|
+
disclosureId: disclosure._id,
|
|
360
|
+
type: ExchangeTypes.ISSUING,
|
|
361
|
+
identityMatcherValues: [''],
|
|
362
|
+
},
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
expect(response.statusCode).toEqual(400);
|
|
366
|
+
expect(response.json).toEqual(
|
|
367
|
+
errorResponseMatcher({
|
|
368
|
+
statusCode: 400,
|
|
369
|
+
error: 'Bad Request',
|
|
370
|
+
errorCode: 'missing_error_code',
|
|
371
|
+
message: '"identityMatcherValues[0]" must contain a value',
|
|
372
|
+
})
|
|
373
|
+
);
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
it('should 400 when if sparse array is missing a value', async () => {
|
|
377
|
+
const disclosure = await persistDisclosure({
|
|
378
|
+
vendorEndpoint: VendorEndpoint.INTEGRATED_ISSUING_IDENTIFICATION,
|
|
379
|
+
tenant,
|
|
380
|
+
identityMatchers: {
|
|
381
|
+
rules: [
|
|
382
|
+
{
|
|
383
|
+
valueIndex: 0, // used for identifying the value
|
|
384
|
+
path: ['$.emails'], // jsonPath within the credential
|
|
385
|
+
rule: 'pick', // Rule to execute can be pick, all (if the target is an array), equal (if the target is a singleValue)
|
|
386
|
+
},
|
|
387
|
+
],
|
|
388
|
+
vendorUserIdIndex: 1,
|
|
389
|
+
},
|
|
390
|
+
});
|
|
391
|
+
// eslint-disable-next-line no-sparse-arrays
|
|
392
|
+
const identityMatcherValues = [10, '', 'adam.smith@example.com', ''];
|
|
393
|
+
const response = await fastify.injectJson({
|
|
394
|
+
method: 'POST',
|
|
395
|
+
url: url(tenant),
|
|
396
|
+
payload: {
|
|
397
|
+
type: ExchangeTypes.ISSUING,
|
|
398
|
+
disclosureId: disclosure._id,
|
|
399
|
+
identityMatcherValues,
|
|
400
|
+
},
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
expect(response.statusCode).toEqual(400);
|
|
404
|
+
expect(response.json).toEqual(
|
|
405
|
+
errorResponseMatcher({
|
|
406
|
+
statusCode: 400,
|
|
407
|
+
error: 'Bad Request',
|
|
408
|
+
errorCode: 'missing_error_code',
|
|
409
|
+
message: '"identityMatcherValues[1]" must contain a value',
|
|
410
|
+
})
|
|
411
|
+
);
|
|
412
|
+
});
|
|
413
|
+
});
|
|
414
|
+
});
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2023 Velocity Team
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
// eslint-disable-next-line import/order
|
|
18
|
+
const buildFastify = require('./helpers/credentialagent-operator-build-fastify');
|
|
19
|
+
|
|
20
|
+
const { mongoDb } = require('@spencejs/spence-mongo-repos');
|
|
21
|
+
const { omit } = require('lodash/fp');
|
|
22
|
+
const {
|
|
23
|
+
initTenantFactory,
|
|
24
|
+
initDisclosureFactory,
|
|
25
|
+
initOfferExchangeFactory,
|
|
26
|
+
ExchangeStates,
|
|
27
|
+
} = require('../../src/entities');
|
|
28
|
+
|
|
29
|
+
const buildExchangeIdUrl = (tenant, exchange) =>
|
|
30
|
+
`/operator-api/v0.8/tenants/${tenant._id}/exchanges/${exchange._id}`;
|
|
31
|
+
|
|
32
|
+
const clearDb = async () => {
|
|
33
|
+
await mongoDb().collection('tenants').deleteMany({});
|
|
34
|
+
await mongoDb().collection('disclosures').deleteMany({});
|
|
35
|
+
await mongoDb().collection('exchanges').deleteMany({});
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
describe('Exchange of specific Id Controller Test Suite', () => {
|
|
39
|
+
let fastify;
|
|
40
|
+
let persistTenant;
|
|
41
|
+
let persistDisclosure;
|
|
42
|
+
let persistOfferExchange;
|
|
43
|
+
let tenant;
|
|
44
|
+
|
|
45
|
+
beforeAll(async () => {
|
|
46
|
+
fastify = buildFastify();
|
|
47
|
+
await fastify.ready();
|
|
48
|
+
({ persistTenant } = initTenantFactory(fastify));
|
|
49
|
+
({ persistDisclosure } = initDisclosureFactory(fastify));
|
|
50
|
+
({ persistOfferExchange } = initOfferExchangeFactory(fastify));
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
beforeEach(async () => {
|
|
54
|
+
await clearDb();
|
|
55
|
+
tenant = await persistTenant();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
afterAll(async () => {
|
|
59
|
+
await clearDb();
|
|
60
|
+
await fastify.close();
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("should 404 when exchange doesn't exist", async () => {
|
|
64
|
+
const url = buildExchangeIdUrl(tenant, { _id: 'foo' });
|
|
65
|
+
const response = await fastify.injectJson({
|
|
66
|
+
method: 'GET',
|
|
67
|
+
url,
|
|
68
|
+
});
|
|
69
|
+
expect(response.statusCode).toEqual(404);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('should 200 and return an exchange in which errors occurred', async () => {
|
|
73
|
+
const disclosure = await persistDisclosure({ tenant });
|
|
74
|
+
const exchange = await persistOfferExchange({
|
|
75
|
+
tenant,
|
|
76
|
+
disclosure,
|
|
77
|
+
events: [
|
|
78
|
+
{ state: ExchangeStates.NEW, timestamp: new Date() },
|
|
79
|
+
{ state: ExchangeStates.UNEXPECTED_ERROR, timestamp: new Date() },
|
|
80
|
+
],
|
|
81
|
+
err: 'test error',
|
|
82
|
+
});
|
|
83
|
+
const url = buildExchangeIdUrl(tenant, exchange);
|
|
84
|
+
const response = await fastify.injectJson({
|
|
85
|
+
method: 'GET',
|
|
86
|
+
url,
|
|
87
|
+
});
|
|
88
|
+
expect(response.statusCode).toEqual(200);
|
|
89
|
+
expect(response.json).toEqual({
|
|
90
|
+
exchange: {
|
|
91
|
+
...omit(['credentialTypes', 'offerHashes', '_id', 'err'], exchange),
|
|
92
|
+
id: exchange._id,
|
|
93
|
+
err: 'test error',
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('Should get an Exchange HTTP Deep Link', async () => {
|
|
99
|
+
const disclosure = await persistDisclosure({ tenant });
|
|
100
|
+
const exchange = await persistOfferExchange({
|
|
101
|
+
tenant,
|
|
102
|
+
disclosure,
|
|
103
|
+
vendorOfferStatuses: {
|
|
104
|
+
fooOfferId: 'OK',
|
|
105
|
+
},
|
|
106
|
+
protocolMetadata: {
|
|
107
|
+
protocol: 'foo',
|
|
108
|
+
},
|
|
109
|
+
events: [
|
|
110
|
+
{ state: ExchangeStates.OFFERS_RECEIVED, timestamp: new Date() },
|
|
111
|
+
],
|
|
112
|
+
});
|
|
113
|
+
const url = buildExchangeIdUrl(tenant, exchange);
|
|
114
|
+
const urlEncodedDid = encodeURIComponent(tenant.did);
|
|
115
|
+
|
|
116
|
+
const response = await fastify.inject({
|
|
117
|
+
method: 'GET',
|
|
118
|
+
url: `${url}/deep-link`,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
expect(response.statusCode).toEqual(200);
|
|
122
|
+
expect(response.json()).toEqual({
|
|
123
|
+
deepLink:
|
|
124
|
+
// eslint-disable-next-line max-len
|
|
125
|
+
`http://localhost.test/app-redirect?request_uri=http%3A%2F%2Flocalhost.test%2Fapi%2Fholder%2Fv0.6%2Forg%2F${urlEncodedDid}%2Fissue%2Fget-credential-manifest%3Fid%3D${exchange.disclosureId}%26exchange_id%3D${exchange._id}&issuerDid=${urlEncodedDid}&exchange_type=issue`,
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it('should 200 and return an exchange', async () => {
|
|
130
|
+
const disclosure = await persistDisclosure({ tenant });
|
|
131
|
+
const exchange = await persistOfferExchange({
|
|
132
|
+
tenant,
|
|
133
|
+
disclosure,
|
|
134
|
+
vendorOfferStatuses: {
|
|
135
|
+
fooOfferId: 'OK',
|
|
136
|
+
},
|
|
137
|
+
protocolMetadata: {
|
|
138
|
+
protocol: 'foo',
|
|
139
|
+
},
|
|
140
|
+
foo: 'bar',
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
const url = buildExchangeIdUrl(tenant, exchange);
|
|
144
|
+
const response = await fastify.injectJson({
|
|
145
|
+
method: 'GET',
|
|
146
|
+
url,
|
|
147
|
+
});
|
|
148
|
+
expect(response.statusCode).toEqual(200);
|
|
149
|
+
expect(response.json).toEqual({
|
|
150
|
+
exchange: {
|
|
151
|
+
...omit(['credentialTypes', 'offerHashes', '_id'], exchange),
|
|
152
|
+
id: exchange._id,
|
|
153
|
+
vendorOfferStatuses: {
|
|
154
|
+
fooOfferId: 'OK',
|
|
155
|
+
},
|
|
156
|
+
protocolMetadata: {
|
|
157
|
+
protocol: 'foo',
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
});
|