@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.
Files changed (395) hide show
  1. package/.localdev.e2e.env +40 -0
  2. package/.localdev.env +41 -0
  3. package/.standalone.env +5 -0
  4. package/LICENSE +202 -0
  5. package/NOTICE +1 -0
  6. package/README.md +19 -0
  7. package/docker/compose.yml +33 -0
  8. package/e2e/README.md +12 -0
  9. package/e2e/org-registration-and-issuing.e2e.test.js +624 -0
  10. package/jest.config.js +20 -0
  11. package/migrate-mongo.config.js +36 -0
  12. package/migrations/20210317133137-add-index-to-offers-repo.js +57 -0
  13. package/migrations/20210416145639-add-index-to-revocation-list.js +27 -0
  14. package/migrations/20210719120225-add_unique_did_index_to_tenant.js +45 -0
  15. package/migrations/20230524053029-add-vendorUserIdMappings-index.js +32 -0
  16. package/migrations/20230616111907-add-configuration-type-index.js +32 -0
  17. package/package.json +108 -0
  18. package/src/assets/public/favicon.ico +0 -0
  19. package/src/assets/public/logo192.png +0 -0
  20. package/src/assets/public/logo512.png +0 -0
  21. package/src/assets/public/manifest.json +28 -0
  22. package/src/assets/templates/app-redirect.hbs +16 -0
  23. package/src/config/config.js +44 -0
  24. package/src/config/core-config.js +143 -0
  25. package/src/config/holder-config.js +104 -0
  26. package/src/config/index.js +22 -0
  27. package/src/config/operator-config.js +64 -0
  28. package/src/controllers/autoload-holder-api-controllers.js +30 -0
  29. package/src/controllers/autoload-operator-api-controllers.js +31 -0
  30. package/src/controllers/autoload-root-api-controller.js +30 -0
  31. package/src/controllers/autoload-saasoperator-api-controllers.js +31 -0
  32. package/src/controllers/holder/autohooks.js +55 -0
  33. package/src/controllers/holder/get-exchange-progress/autohooks.js +27 -0
  34. package/src/controllers/holder/get-exchange-progress/controller.js +50 -0
  35. package/src/controllers/holder/inspect/autohooks.js +35 -0
  36. package/src/controllers/holder/inspect/get-presentation-request/controller.js +100 -0
  37. package/src/controllers/holder/inspect/schemas/holder-disclosure.schema.json +73 -0
  38. package/src/controllers/holder/inspect/schemas/index.js +33 -0
  39. package/src/controllers/holder/inspect/schemas/presentation-definition.v1.schema.json +461 -0
  40. package/src/controllers/holder/inspect/schemas/presentation-request.schema.json +279 -0
  41. package/src/controllers/holder/inspect/schemas/presentation-submission.schema.json +41 -0
  42. package/src/controllers/holder/inspect/schemas/siop-presentation-submission.schema.json +74 -0
  43. package/src/controllers/holder/inspect/schemas/velocity-presentation-submission.response.200.schema.json +36 -0
  44. package/src/controllers/holder/inspect/schemas/velocity-presentation-submission.schema.json +34 -0
  45. package/src/controllers/holder/inspect/submit-presentation/controller.js +89 -0
  46. package/src/controllers/holder/issue/autohooks.js +23 -0
  47. package/src/controllers/holder/issue/get-credential-manifest/controller.js +193 -0
  48. package/src/controllers/holder/issue/offers/autohooks.js +35 -0
  49. package/src/controllers/holder/issue/offers/controller.js +164 -0
  50. package/src/controllers/holder/issue/offers/credential-offers/controller.js +460 -0
  51. package/src/controllers/holder/issue/submit-identification/autohooks.js +37 -0
  52. package/src/controllers/holder/issue/submit-identification/controller.js +63 -0
  53. package/src/controllers/holder/oauth/autohooks.js +19 -0
  54. package/src/controllers/holder/oauth/controller.js +140 -0
  55. package/src/controllers/index.js +22 -0
  56. package/src/controllers/operator/tenants/_tenantId/autohooks.js +40 -0
  57. package/src/controllers/operator/tenants/_tenantId/check-credentials/autohooks.js +24 -0
  58. package/src/controllers/operator/tenants/_tenantId/check-credentials/controller-v0.8.js +200 -0
  59. package/src/controllers/operator/tenants/_tenantId/check-credentials/schemas/index.js +19 -0
  60. package/src/controllers/operator/tenants/_tenantId/check-credentials/schemas/vendor-credential.schema.json +244 -0
  61. package/src/controllers/operator/tenants/_tenantId/controller-v0.8.js +221 -0
  62. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/autohooks.js +30 -0
  63. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/controller-v0.8.js +271 -0
  64. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/autohooks.js +45 -0
  65. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/controller-v0.8.js +199 -0
  66. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/schemas/add-feed.schema.js +14 -0
  67. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/schemas/feed.schema.json +27 -0
  68. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/schemas/index.js +25 -0
  69. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/schemas/modify-feed-update-body.schema.js +18 -0
  70. package/src/controllers/operator/tenants/_tenantId/disclosures/_id/feeds/schemas/modify-feed.schema.json +19 -0
  71. package/src/controllers/operator/tenants/_tenantId/disclosures/autohooks.js +34 -0
  72. package/src/controllers/operator/tenants/_tenantId/disclosures/controller-v0.8.js +100 -0
  73. package/src/controllers/operator/tenants/_tenantId/disclosures/schemas/agent-disclosure-presentation-definition.schema.json +404 -0
  74. package/src/controllers/operator/tenants/_tenantId/disclosures/schemas/agent-disclosure.schema.js +24 -0
  75. package/src/controllers/operator/tenants/_tenantId/disclosures/schemas/index.js +29 -0
  76. package/src/controllers/operator/tenants/_tenantId/disclosures/schemas/new-agent-disclosure.schema.json +166 -0
  77. package/src/controllers/operator/tenants/_tenantId/disclosures/schemas/update-agent-disclosure.schema.js +20 -0
  78. package/src/controllers/operator/tenants/_tenantId/exchanges/_exchangeId/autohooks.js +30 -0
  79. package/src/controllers/operator/tenants/_tenantId/exchanges/_exchangeId/controller-v0.8.js +73 -0
  80. package/src/controllers/operator/tenants/_tenantId/exchanges/autohooks.js +19 -0
  81. package/src/controllers/operator/tenants/_tenantId/exchanges/controller-v0.8.js +150 -0
  82. package/src/controllers/operator/tenants/_tenantId/exchanges/schemas/get-exchange.response.body.json +147 -0
  83. package/src/controllers/operator/tenants/_tenantId/exchanges/schemas/index.js +21 -0
  84. package/src/controllers/operator/tenants/_tenantId/issued-credentials/autohooks.js +27 -0
  85. package/src/controllers/operator/tenants/_tenantId/issued-credentials/controller-v0.8.js +303 -0
  86. package/src/controllers/operator/tenants/_tenantId/issued-credentials/schemas/index.js +23 -0
  87. package/src/controllers/operator/tenants/_tenantId/issued-credentials/schemas/issued-credential.schema.json +115 -0
  88. package/src/controllers/operator/tenants/_tenantId/issued-credentials/schemas/revoke-credentials.schema.json +18 -0
  89. package/src/controllers/operator/tenants/_tenantId/keys/controller-v0.8.js +168 -0
  90. package/src/controllers/operator/tenants/_tenantId/offer-data/controller-v0.8.js +78 -0
  91. package/src/controllers/operator/tenants/_tenantId/offers/autohooks.js +34 -0
  92. package/src/controllers/operator/tenants/_tenantId/offers/controller-v0.8.js +253 -0
  93. package/src/controllers/operator/tenants/_tenantId/offers/schemas/index.js +23 -0
  94. package/src/controllers/operator/tenants/_tenantId/offers/schemas/new-vendor-offer.schema.js +47 -0
  95. package/src/controllers/operator/tenants/_tenantId/offers/schemas/vendor-offer.schema.json +56 -0
  96. package/src/controllers/operator/tenants/_tenantId/users/autohooks.js +24 -0
  97. package/src/controllers/operator/tenants/_tenantId/users/controller-v0.8.js +92 -0
  98. package/src/controllers/operator/tenants/_tenantId/users/schemas/index.js +23 -0
  99. package/src/controllers/operator/tenants/_tenantId/users/schemas/new-user.schema.json +13 -0
  100. package/src/controllers/operator/tenants/_tenantId/users/schemas/user.schema.json +16 -0
  101. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/autohooks.js +34 -0
  102. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/controller-v0.8.js +110 -0
  103. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/Credential.schema.js +18 -0
  104. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/IssueCredentialOptions.schema.json +42 -0
  105. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/IssueCredentialRequest.schema.json +13 -0
  106. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/IssueCredentialResponse.schema.json +19 -0
  107. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/LinkedDataProof.schema.json +43 -0
  108. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/VerifiableCredential.schema.js +16 -0
  109. package/src/controllers/operator/tenants/_tenantId/vc-api/credentials/schemas/index.js +31 -0
  110. package/src/controllers/operator/tenants/autohooks.js +65 -0
  111. package/src/controllers/operator/tenants/controller-v0.8.js +167 -0
  112. package/src/controllers/operator/tenants/schemas/index.js +41 -0
  113. package/src/controllers/operator/tenants/schemas/modify-secret.schema.json +11 -0
  114. package/src/controllers/operator/tenants/schemas/modify-tenant-v0.8.schema.json +44 -0
  115. package/src/controllers/operator/tenants/schemas/new-tenant-v0.8.schema.json +19 -0
  116. package/src/controllers/operator/tenants/schemas/new-tenant.response.200.schema.json +7 -0
  117. package/src/controllers/operator/tenants/schemas/secret-key-metadata.schema.json +31 -0
  118. package/src/controllers/operator/tenants/schemas/secret-key.schema.json +29 -0
  119. package/src/controllers/operator/tenants/schemas/secret-kid.schema.json +13 -0
  120. package/src/controllers/operator/tenants/schemas/secret-new-tenant-v0.8.schema.json +28 -0
  121. package/src/controllers/operator/tenants/schemas/secret-tenant-key-v0.8.schema.json +13 -0
  122. package/src/controllers/operator/tenants/schemas/tenant-key-v0.8.schema.json +14 -0
  123. package/src/controllers/operator/tenants/schemas/tenant-v0.8.schema.json +62 -0
  124. package/src/controllers/root/autohooks.js +23 -0
  125. package/src/controllers/root/controller.js +173 -0
  126. package/src/controllers/saasoperator/groups/_id/autohooks.js +9 -0
  127. package/src/controllers/saasoperator/groups/_id/controller.js +121 -0
  128. package/src/controllers/saasoperator/groups/autohooks.js +19 -0
  129. package/src/controllers/saasoperator/groups/controller.js +65 -0
  130. package/src/controllers/saasoperator/groups/schemas/group.schema.js +17 -0
  131. package/src/controllers/saasoperator/groups/schemas/index.js +4 -0
  132. package/src/controllers/saasoperator/groups/schemas/new-group.schema.js +13 -0
  133. package/src/entities/common/domains/get-json-at-path.js +28 -0
  134. package/src/entities/common/domains/index.js +17 -0
  135. package/src/entities/common/index.js +17 -0
  136. package/src/entities/credentials/domains/credential-format.js +22 -0
  137. package/src/entities/credentials/domains/index.js +19 -0
  138. package/src/entities/credentials/index.js +17 -0
  139. package/src/entities/deep-links/domains/extract-did.js +11 -0
  140. package/src/entities/deep-links/domains/index.js +20 -0
  141. package/src/entities/deep-links/domains/velocity-protocol-uri-to-http-uri.js +32 -0
  142. package/src/entities/deep-links/index.js +19 -0
  143. package/src/entities/disclosures/domains/assert-disclosure-active.js +21 -0
  144. package/src/entities/disclosures/domains/compute-disclosure-configuration-type.js +29 -0
  145. package/src/entities/disclosures/domains/constants.js +61 -0
  146. package/src/entities/disclosures/domains/errors.js +34 -0
  147. package/src/entities/disclosures/domains/get-disclosure-configuration-type.js +60 -0
  148. package/src/entities/disclosures/domains/index.js +32 -0
  149. package/src/entities/disclosures/domains/is-issuing-disclosure.js +23 -0
  150. package/src/entities/disclosures/domains/parse-body-to-disclosure.js +17 -0
  151. package/src/entities/disclosures/domains/validate-by-identification-method.js +69 -0
  152. package/src/entities/disclosures/domains/validate-commercial-entity.js +26 -0
  153. package/src/entities/disclosures/domains/validate-disclosure-by-configuration-type.js +47 -0
  154. package/src/entities/disclosures/domains/validate-disclosure-default-issuing.js +77 -0
  155. package/src/entities/disclosures/domains/validate-disclosure.js +37 -0
  156. package/src/entities/disclosures/domains/validate-feed.js +16 -0
  157. package/src/entities/disclosures/domains/validate-presentation-definition.js +54 -0
  158. package/src/entities/disclosures/domains/validate-vendor-endpoint.js +22 -0
  159. package/src/entities/disclosures/domains/validate-vendor-webhook.js +18 -0
  160. package/src/entities/disclosures/factories/disclosure-factory.js +94 -0
  161. package/src/entities/disclosures/factories/index.js +19 -0
  162. package/src/entities/disclosures/index.js +22 -0
  163. package/src/entities/disclosures/orchestrators/get-disclosure.js +18 -0
  164. package/src/entities/disclosures/orchestrators/index.js +20 -0
  165. package/src/entities/disclosures/orchestrators/update-disclosure-configuration-type.js +32 -0
  166. package/src/entities/disclosures/repos/index.js +20 -0
  167. package/src/entities/disclosures/repos/repo.js +118 -0
  168. package/src/entities/disclosures/repos/set-configuration-type.js +33 -0
  169. package/src/entities/exchanges/adapters/index.js +17 -0
  170. package/src/entities/exchanges/adapters/sign-exchange-response.js +45 -0
  171. package/src/entities/exchanges/domains/build-exchange-progress.js +56 -0
  172. package/src/entities/exchanges/domains/constants.js +24 -0
  173. package/src/entities/exchanges/domains/ensure-exchange-state-valid.js +35 -0
  174. package/src/entities/exchanges/domains/errors.js +33 -0
  175. package/src/entities/exchanges/domains/index.js +25 -0
  176. package/src/entities/exchanges/domains/states.js +43 -0
  177. package/src/entities/exchanges/domains/types.js +31 -0
  178. package/src/entities/exchanges/factories/disclosure-exchange-factory.js +46 -0
  179. package/src/entities/exchanges/factories/index.js +20 -0
  180. package/src/entities/exchanges/factories/offer-exchange-factory.js +48 -0
  181. package/src/entities/exchanges/index.js +23 -0
  182. package/src/entities/exchanges/orchestrators/build-exchange-request-deep-link.js +50 -0
  183. package/src/entities/exchanges/orchestrators/index.js +19 -0
  184. package/src/entities/exchanges/repos/exchange-repo-projections.js +45 -0
  185. package/src/entities/exchanges/repos/exchange-state-repo-extension.js +76 -0
  186. package/src/entities/exchanges/repos/index.js +20 -0
  187. package/src/entities/exchanges/repos/repo.js +44 -0
  188. package/src/entities/feeds/factories/feed-factory.js +47 -0
  189. package/src/entities/feeds/factories/index.js +19 -0
  190. package/src/entities/feeds/index.js +20 -0
  191. package/src/entities/feeds/repos/index.js +19 -0
  192. package/src/entities/feeds/repos/repo.js +95 -0
  193. package/src/entities/groups/domains/format-group.js +11 -0
  194. package/src/entities/groups/domains/index.js +3 -0
  195. package/src/entities/groups/factories/group-factory.js +40 -0
  196. package/src/entities/groups/factories/index.js +19 -0
  197. package/src/entities/groups/index.js +22 -0
  198. package/src/entities/groups/orchestrators/find-group-or-error.js +16 -0
  199. package/src/entities/groups/orchestrators/index.js +6 -0
  200. package/src/entities/groups/orchestrators/validate-did.js +24 -0
  201. package/src/entities/groups/orchestrators/validate-group-by-user.js +16 -0
  202. package/src/entities/groups/orchestrators/validate-group.js +39 -0
  203. package/src/entities/groups/repos/delete-tenant-extension.js +13 -0
  204. package/src/entities/groups/repos/index.js +19 -0
  205. package/src/entities/groups/repos/repo.js +38 -0
  206. package/src/entities/groups/repos/update-or-error-extension.js +46 -0
  207. package/src/entities/index.js +37 -0
  208. package/src/entities/keys/domains/constants.js +37 -0
  209. package/src/entities/keys/domains/index.js +21 -0
  210. package/src/entities/keys/domains/is-matching-private-key-kid.js +41 -0
  211. package/src/entities/keys/domains/validate-key.js +62 -0
  212. package/src/entities/keys/factories/index.js +19 -0
  213. package/src/entities/keys/factories/key-factory.js +56 -0
  214. package/src/entities/keys/index.js +22 -0
  215. package/src/entities/keys/orchestrators/index.js +3 -0
  216. package/src/entities/keys/orchestrators/validate-did-doc-keys.js +69 -0
  217. package/src/entities/metadata-list-allocations/index.js +19 -0
  218. package/src/entities/metadata-list-allocations/repos/index.js +19 -0
  219. package/src/entities/metadata-list-allocations/repos/repo.js +40 -0
  220. package/src/entities/notifications/domains/index.js +19 -0
  221. package/src/entities/notifications/domains/notification-types.js +25 -0
  222. package/src/entities/notifications/index.js +19 -0
  223. package/src/entities/offers/domains/build-clean-pii-filter.js +35 -0
  224. package/src/entities/offers/domains/build-deeplink-url.js +120 -0
  225. package/src/entities/offers/domains/build-offer.js +88 -0
  226. package/src/entities/offers/domains/build-qr-code-url.js +37 -0
  227. package/src/entities/offers/domains/constants.js +32 -0
  228. package/src/entities/offers/domains/filter-object-ids.js +34 -0
  229. package/src/entities/offers/domains/generate-issuing-challenge.js +26 -0
  230. package/src/entities/offers/domains/generate-link-code.js +35 -0
  231. package/src/entities/offers/domains/index.js +31 -0
  232. package/src/entities/offers/domains/post-validation-offers-handler.js +31 -0
  233. package/src/entities/offers/domains/prepare-linked-credentials-for-holder.js +36 -0
  234. package/src/entities/offers/domains/resolve-subject.js +142 -0
  235. package/src/entities/offers/domains/validate-offer-commercial-entity.js +24 -0
  236. package/src/entities/offers/domains/validate-offer.js +90 -0
  237. package/src/entities/offers/factories/index.js +19 -0
  238. package/src/entities/offers/factories/offer-factory.js +119 -0
  239. package/src/entities/offers/index.js +22 -0
  240. package/src/entities/offers/orchestrators/create-verifiable-credentials.js +131 -0
  241. package/src/entities/offers/orchestrators/finalize-exchange.js +44 -0
  242. package/src/entities/offers/orchestrators/index.js +23 -0
  243. package/src/entities/offers/orchestrators/load-credential-refs.js +57 -0
  244. package/src/entities/offers/orchestrators/load-credential-types-map.js +44 -0
  245. package/src/entities/offers/orchestrators/prepare-offers.js +35 -0
  246. package/src/entities/offers/orchestrators/trigger-issued-credentials-webhook.js +63 -0
  247. package/src/entities/offers/repos/clean-pii-extension.js +85 -0
  248. package/src/entities/offers/repos/index.js +20 -0
  249. package/src/entities/offers/repos/issued-credential-projection.js +44 -0
  250. package/src/entities/offers/repos/repo.js +177 -0
  251. package/src/entities/presentations/domains/build-identity-doc.js +120 -0
  252. package/src/entities/presentations/domains/build-request-response-schema.js +46 -0
  253. package/src/entities/presentations/domains/build-vendor-data.js +31 -0
  254. package/src/entities/presentations/domains/check-payment-requirement.js +30 -0
  255. package/src/entities/presentations/domains/errors.js +28 -0
  256. package/src/entities/presentations/domains/extract-fields-from-id-credential.js +35 -0
  257. package/src/entities/presentations/domains/index.js +26 -0
  258. package/src/entities/presentations/domains/merge-credential-check-results.js +24 -0
  259. package/src/entities/presentations/domains/validate-presentation.js +128 -0
  260. package/src/entities/presentations/index.js +20 -0
  261. package/src/entities/presentations/orchestrators/create-presentation-request.js +148 -0
  262. package/src/entities/presentations/orchestrators/deduplicate-disclosure-exchange.js +52 -0
  263. package/src/entities/presentations/orchestrators/handle-presentation-submission.js +47 -0
  264. package/src/entities/presentations/orchestrators/index.js +20 -0
  265. package/src/entities/presentations/orchestrators/match-identity-on-exchange.js +114 -0
  266. package/src/entities/presentations/orchestrators/share-identification-credentials.js +110 -0
  267. package/src/entities/presentations/orchestrators/share-presentation.js +234 -0
  268. package/src/entities/push-delegate/get-push-delegate.js +37 -0
  269. package/src/entities/push-delegate/index.js +17 -0
  270. package/src/entities/redirect/index.js +3 -0
  271. package/src/entities/redirect/orchestrators/index.js +3 -0
  272. package/src/entities/redirect/orchestrators/load-org-info.js +40 -0
  273. package/src/entities/revocation-list-allocations/index.js +19 -0
  274. package/src/entities/revocation-list-allocations/repos/index.js +19 -0
  275. package/src/entities/revocation-list-allocations/repos/repo.js +40 -0
  276. package/src/entities/schemas/index.js +19 -0
  277. package/src/entities/schemas/orchestrators/index.js +19 -0
  278. package/src/entities/schemas/orchestrators/load-schema-validation.js +73 -0
  279. package/src/entities/tenants/domains/build-service-ids.js +27 -0
  280. package/src/entities/tenants/domains/extract-service.js +27 -0
  281. package/src/entities/tenants/domains/index.js +21 -0
  282. package/src/entities/tenants/domains/validate-service-ids.js +35 -0
  283. package/src/entities/tenants/factories/index.js +19 -0
  284. package/src/entities/tenants/factories/tenant-factory.js +37 -0
  285. package/src/entities/tenants/index.js +22 -0
  286. package/src/entities/tenants/orchestrators/add-primary-address-to-tenant.js +47 -0
  287. package/src/entities/tenants/orchestrators/create-tenant.js +91 -0
  288. package/src/entities/tenants/orchestrators/index.js +22 -0
  289. package/src/entities/tenants/orchestrators/refresh-tenant-dids.js +146 -0
  290. package/src/entities/tenants/orchestrators/set-tenant-default-issuing-disclosure.js +31 -0
  291. package/src/entities/tenants/repos/index.js +20 -0
  292. package/src/entities/tenants/repos/insert-tenant-extension.js +33 -0
  293. package/src/entities/tenants/repos/repo.js +52 -0
  294. package/src/entities/tenants/repos/tenant-default-projection.js +33 -0
  295. package/src/entities/tokens/adapters/access-token.js +49 -0
  296. package/src/entities/tokens/adapters/index.js +19 -0
  297. package/src/entities/tokens/index.js +19 -0
  298. package/src/entities/users/factories/index.js +19 -0
  299. package/src/entities/users/factories/user-factory.js +36 -0
  300. package/src/entities/users/index.js +20 -0
  301. package/src/entities/users/repos/add-anonymous-user-repo-extension.js +23 -0
  302. package/src/entities/users/repos/find-or-insert-vendor-user-repo-extension.js +30 -0
  303. package/src/entities/users/repos/index.js +19 -0
  304. package/src/entities/users/repos/repo.js +50 -0
  305. package/src/fetchers/index.js +20 -0
  306. package/src/fetchers/operator/identify-fetcher.js +36 -0
  307. package/src/fetchers/operator/index.js +21 -0
  308. package/src/fetchers/operator/inspection-fetcher.js +35 -0
  309. package/src/fetchers/operator/issuing-fetcher.js +50 -0
  310. package/src/fetchers/operator/webhook-auth-header.js +45 -0
  311. package/src/fetchers/push-gateway/generate-push-gateway-token.js +40 -0
  312. package/src/fetchers/push-gateway/index.js +19 -0
  313. package/src/fetchers/push-gateway/push-fetcher.js +39 -0
  314. package/src/index.js +19 -0
  315. package/src/init-holder-server.js +108 -0
  316. package/src/init-operator-server.js +101 -0
  317. package/src/init-server.js +120 -0
  318. package/src/main-holder.js +18 -0
  319. package/src/main-operator.js +19 -0
  320. package/src/main.js +18 -0
  321. package/src/plugins/autoload-repos.js +28 -0
  322. package/src/plugins/disclosure-loader-plugin.js +56 -0
  323. package/src/plugins/ensure-disclosure-active-plugin.js +30 -0
  324. package/src/plugins/ensure-disclosure-configuration-type-plugin.js +29 -0
  325. package/src/plugins/ensure-tenant-default-issuing-disclosure-id-plugin.js +60 -0
  326. package/src/plugins/ensure-tenant-primary-address-plugin.js +44 -0
  327. package/src/plugins/exchange-error-handler-plugin.js +51 -0
  328. package/src/plugins/exchange-loader-plugin.js +50 -0
  329. package/src/plugins/group-loader-plugin.js +51 -0
  330. package/src/plugins/index.js +32 -0
  331. package/src/plugins/kms-plugin.js +57 -0
  332. package/src/plugins/tenant-loader-plugin.js +91 -0
  333. package/src/plugins/validate-cao-plugin.js +81 -0
  334. package/src/plugins/vendor-routes-auth-plugin.js +24 -0
  335. package/src/plugins/verify-access-token-plugin.js +88 -0
  336. package/src/standalone.js +24 -0
  337. package/src/start-app-server.js +38 -0
  338. package/test/combined/app-redirect.test.js +199 -0
  339. package/test/combined/helpers/credentialagent-build-fastify.js +29 -0
  340. package/test/combined/helpers/index.js +22 -0
  341. package/test/combined/helpers/nock-registrar-app-schema-name.js +50 -0
  342. package/test/combined/helpers/nock-registrar-get-organization-diddoc.js +26 -0
  343. package/test/combined/helpers/nock-registrar-get-organization-verified-profile.js +33 -0
  344. package/test/combined/manifest.json.test.js +55 -0
  345. package/test/combined/root-controller.test.js +42 -0
  346. package/test/combined/schemas/education-degree.schema.json +166 -0
  347. package/test/combined/schemas/employment-current-v1.1.schema.json +253 -0
  348. package/test/combined/schemas/open-badge-credential.schema.json +1285 -0
  349. package/test/combined/schemas/past-employment-position-with-uri-id.schema.js +22 -0
  350. package/test/combined/schemas/past-employment-position.schema.json +148 -0
  351. package/test/combined/schemas/will-always-validate.json +10 -0
  352. package/test/combined/validate-cao-plugin.test.js +155 -0
  353. package/test/get-push-delegate.test.js +54 -0
  354. package/test/helpers/jwt-vc-expectation.js +109 -0
  355. package/test/holder/build-request-response-schema.test.js +55 -0
  356. package/test/holder/credential-manifest-controller.test.js +3192 -0
  357. package/test/holder/e2e-issuing-controller.test.js +425 -0
  358. package/test/holder/get-exchange-progress-controller.test.js +521 -0
  359. package/test/holder/get-presentation-request.test.js +906 -0
  360. package/test/holder/helpers/credential-type-metadata.js +98 -0
  361. package/test/holder/helpers/credentialagent-holder-build-fastify.js +32 -0
  362. package/test/holder/helpers/generate-presentation.js +441 -0
  363. package/test/holder/helpers/generate-test-access-token.js +54 -0
  364. package/test/holder/helpers/jwt-access-token-expectation.js +32 -0
  365. package/test/holder/helpers/jwt-vc-expectation.js +115 -0
  366. package/test/holder/issuing-controller.test.js +7076 -0
  367. package/test/holder/oauth-token-controller.test.js +412 -0
  368. package/test/holder/presentation-submission.test.js +2365 -0
  369. package/test/holder/submit-identification.test.js +4815 -0
  370. package/test/operator/check-credentials-controller-v0.8.test.js +832 -0
  371. package/test/operator/credentials-revoke.test.js +536 -0
  372. package/test/operator/disclosures-controller-v0.8.test.js +4157 -0
  373. package/test/operator/exchanges-controller-v0.8.test.js +414 -0
  374. package/test/operator/exchanges-id-controller-v0.8.test.js +162 -0
  375. package/test/operator/feeds-controller-v0.8.test.js +659 -0
  376. package/test/operator/generate-push-gateway-token.test.js +116 -0
  377. package/test/operator/groups-controller.test.js +145 -0
  378. package/test/operator/groups-id-controller.test.js +287 -0
  379. package/test/operator/helpers/create-test-org-doc.js +60 -0
  380. package/test/operator/helpers/credentialagent-operator-build-fastify.js +32 -0
  381. package/test/operator/helpers/find-kms-key.js +31 -0
  382. package/test/operator/helpers/generate-primary-and-add-operator-to-primary.js +63 -0
  383. package/test/operator/helpers/init-agent-kms.js +22 -0
  384. package/test/operator/issued-credentials-controller-v0.8.test.js +398 -0
  385. package/test/operator/keys-controller-v0.8.test.js +1130 -0
  386. package/test/operator/offer-data-controller-v0.8.test.js +253 -0
  387. package/test/operator/offers-controller-v0.8.test.js +3026 -0
  388. package/test/operator/set-configuration-type-modifier.test.js +75 -0
  389. package/test/operator/swagger.test.js +37 -0
  390. package/test/operator/tenant-controller-v0.8.test.js +730 -0
  391. package/test/operator/tenant-loader-plugin.test.js +96 -0
  392. package/test/operator/tenants-controller-v0.8.test.js +2093 -0
  393. package/test/operator/users-controller-v0.8.test.js +137 -0
  394. package/test/operator/vc-api-credentials.test.js +963 -0
  395. 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
+ });