@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,730 @@
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 nock = require('nock');
19
+ const { mongoDb } = require('@spencejs/spence-mongo-repos');
20
+ const { first, flow, map, omit, sortBy } = require('lodash/fp');
21
+ const { idKeyMapper } = require('@verii/common-functions');
22
+ const { errorResponseMatcher, mongoify } = require('@verii/tests-helpers');
23
+ const {
24
+ rootIssuerProfile,
25
+ rootIssuerVerifiedProfile,
26
+ } = require('@verii/sample-data');
27
+ const { ObjectId } = require('mongodb');
28
+ const { decrypt, generateKeyPair } = require('@verii/crypto');
29
+ const buildFastify = require('./helpers/credentialagent-operator-build-fastify');
30
+ const { createOrgDoc } = require('./helpers/create-test-org-doc');
31
+ const {
32
+ nockRegistrarGetOrganizationDidDoc,
33
+ } = require('../combined/helpers/nock-registrar-get-organization-diddoc');
34
+ const {
35
+ nockRegistrarGetOrganizationVerifiedProfile,
36
+ } = require('../combined/helpers/nock-registrar-get-organization-verified-profile');
37
+
38
+ const {
39
+ initDisclosureFactory,
40
+ initTenantFactory,
41
+ initKeysFactory,
42
+ tenantRepoPlugin,
43
+ groupRepoPlugin,
44
+ initGroupsFactory,
45
+ VendorEndpoint,
46
+ } = require('../../src/entities');
47
+ const { initAgentKms } = require('./helpers/init-agent-kms');
48
+
49
+ const buildUrl = () => '/operator-api/v0.8/tenants';
50
+
51
+ describe('Tenant management Test Suite', () => {
52
+ let fastify;
53
+ let persistTenant;
54
+ let persistDisclosure;
55
+ let persistGroup;
56
+ let persistKey;
57
+ let orgDoc;
58
+ let tenantRepo;
59
+ let groupRepo;
60
+ let agentKms;
61
+
62
+ beforeAll(async () => {
63
+ fastify = buildFastify();
64
+ await fastify.ready();
65
+
66
+ ({ persistTenant } = initTenantFactory(fastify));
67
+ ({ persistDisclosure } = initDisclosureFactory(fastify));
68
+ ({ persistGroup } = initGroupsFactory(fastify));
69
+ ({ persistKey } = initKeysFactory(fastify));
70
+
71
+ ({ orgDoc } = await createOrgDoc());
72
+ tenantRepo = tenantRepoPlugin(fastify)();
73
+ groupRepo = groupRepoPlugin(fastify)();
74
+ agentKms = initAgentKms(fastify);
75
+ });
76
+
77
+ beforeEach(async () => {
78
+ nock.cleanAll();
79
+ await mongoDb().collection('tenants').deleteMany({});
80
+ await mongoDb().collection('keys').deleteMany({});
81
+ await mongoDb().collection('groups').deleteMany({});
82
+ nockRegistrarGetOrganizationDidDoc(orgDoc.id, orgDoc);
83
+ });
84
+
85
+ afterAll(async () => {
86
+ await fastify.close();
87
+ nock.cleanAll();
88
+ nock.restore();
89
+ });
90
+
91
+ describe('Tenant Update tests', () => {
92
+ it('should return HTTP 404 when tenant not found when trying to update', async () => {
93
+ const tenant = {
94
+ _id: new ObjectId(),
95
+ };
96
+
97
+ const response = await fastify.injectJson({
98
+ method: 'PUT',
99
+ url: `${buildUrl()}/${tenant._id}`,
100
+ payload: {
101
+ serviceIds: tenant.serviceIds,
102
+ },
103
+ });
104
+ expect(response.statusCode).toEqual(404);
105
+ expect(response.json.message).toEqual(
106
+ `Tenant ${JSON.stringify({ tenantId: tenant._id })} not found`
107
+ );
108
+ });
109
+
110
+ it('should return HTTP 404 when DID not found when trying to update', async () => {
111
+ const { orgDoc: orgDoc2 } = await createOrgDoc();
112
+ const tenant = await persistTenant({
113
+ did: orgDoc2.id,
114
+ serviceIds: [`${orgDoc2.id}#test-service`],
115
+ });
116
+ nockRegistrarGetOrganizationDidDoc(orgDoc2.id, {});
117
+
118
+ const response = await fastify.injectJson({
119
+ method: 'PUT',
120
+ url: `${buildUrl()}/${tenant._id}`,
121
+ payload: {
122
+ serviceIds: tenant.serviceIds,
123
+ },
124
+ });
125
+
126
+ expect(response.statusCode).toEqual(404);
127
+ });
128
+
129
+ it('should return 400 if webhookUrl is not uri', async () => {
130
+ const tenant = await persistTenant({
131
+ did: orgDoc.id,
132
+ serviceIds: [`${orgDoc.id}#test-service`],
133
+ });
134
+
135
+ const response = await fastify.injectJson({
136
+ method: 'PUT',
137
+ url: `${buildUrl()}/${tenant._id}`,
138
+ payload: {
139
+ serviceIds: tenant.serviceIds,
140
+ webhookUrl: 'customUrl',
141
+ },
142
+ });
143
+
144
+ expect(response.statusCode).toEqual(400);
145
+ expect(response.json).toEqual(
146
+ errorResponseMatcher({
147
+ error: 'Bad Request',
148
+ errorCode: 'request_validation_failed',
149
+ message: 'body/webhookUrl must match format "uri"',
150
+ statusCode: 400,
151
+ })
152
+ );
153
+ });
154
+
155
+ it('should be able to update an existing tenant', async () => {
156
+ const tenant = await persistTenant({
157
+ did: orgDoc.id,
158
+ serviceIds: [`${orgDoc.id}#test-service`],
159
+ });
160
+
161
+ const response = await fastify.injectJson({
162
+ method: 'PUT',
163
+ url: `${buildUrl()}/${tenant._id}`,
164
+ headers: {
165
+ authorization: 'Bearer',
166
+ },
167
+ payload: {
168
+ serviceIds: tenant.serviceIds,
169
+ webhookUrl: 'http://customUrl.com',
170
+ },
171
+ });
172
+
173
+ expect(response.statusCode).toEqual(200);
174
+ expect(response.json).toEqual({
175
+ createdAt: tenant.createdAt,
176
+ id: tenant._id,
177
+ });
178
+ });
179
+
180
+ it('should be updated an existing tenant with webhookUrl', async () => {
181
+ const tenant = await persistTenant({
182
+ did: orgDoc.id,
183
+ serviceIds: [`${orgDoc.id}#test-service`],
184
+ });
185
+
186
+ const response = await fastify.injectJson({
187
+ method: 'PUT',
188
+ url: `${buildUrl()}/${tenant._id}`,
189
+ payload: {
190
+ serviceIds: tenant.serviceIds,
191
+ webhookUrl: 'http://customUrl.com',
192
+ },
193
+ });
194
+
195
+ const updatedTenant = await tenantRepo.findOne(tenant._id);
196
+
197
+ expect(updatedTenant).toEqual({
198
+ ...tenant,
199
+ _id: new ObjectId(tenant._id),
200
+ webhookUrl: 'http://customUrl.com',
201
+ updatedAt: expect.any(Date),
202
+ createdAt: new Date(tenant.createdAt),
203
+ });
204
+
205
+ expect(updatedTenant.updatedAt).not.toEqual(tenant.updatedAt);
206
+
207
+ expect(response.statusCode).toEqual(200);
208
+ expect(response.json).toEqual({
209
+ createdAt: tenant.createdAt,
210
+ id: tenant._id,
211
+ });
212
+ });
213
+
214
+ it('should be updated an existing tenant with encrypted bearerToken', async () => {
215
+ const tenant = await persistTenant({
216
+ did: orgDoc.id,
217
+ serviceIds: [`${orgDoc.id}#test-service`],
218
+ });
219
+
220
+ const response = await fastify.injectJson({
221
+ method: 'PUT',
222
+ url: `${buildUrl()}/${tenant._id}`,
223
+ payload: {
224
+ serviceIds: tenant.serviceIds,
225
+ webhookAuth: {
226
+ type: ['bearer'],
227
+ bearerToken: 'secretToken',
228
+ },
229
+ },
230
+ });
231
+
232
+ const updatedTenant = await tenantRepo.findOne(tenant._id);
233
+
234
+ expect(updatedTenant).toEqual({
235
+ ...tenant,
236
+ _id: new ObjectId(tenant._id),
237
+ webhookAuth: {
238
+ bearerToken: expect.any(String),
239
+ type: 'bearer',
240
+ },
241
+ updatedAt: expect.any(Date),
242
+ createdAt: new Date(tenant.createdAt),
243
+ });
244
+
245
+ const decryptedBearerToken = decrypt(
246
+ updatedTenant.webhookAuth.bearerToken,
247
+ fastify.config.mongoSecret
248
+ );
249
+ expect(decryptedBearerToken).toBe('secretToken');
250
+
251
+ expect(response.statusCode).toEqual(200);
252
+ expect(response.json).toEqual({
253
+ createdAt: tenant.createdAt,
254
+ id: tenant._id,
255
+ });
256
+ });
257
+
258
+ it('should allow removal of bearerToken from tenant', async () => {
259
+ const tenant = await persistTenant({
260
+ did: orgDoc.id,
261
+ serviceIds: [`${orgDoc.id}#test-service`],
262
+ webhookAuth: {
263
+ type: 'bearer',
264
+ bearerToken: 'secretToken',
265
+ },
266
+ });
267
+
268
+ const response = await fastify.injectJson({
269
+ method: 'PUT',
270
+ url: `${buildUrl()}/${tenant._id}`,
271
+ payload: {
272
+ serviceIds: tenant.serviceIds,
273
+ webhookAuth: {
274
+ bearerToken: '',
275
+ type: 'bearer',
276
+ },
277
+ },
278
+ });
279
+
280
+ const updatedTenant = await tenantRepo.findOne(tenant._id);
281
+
282
+ expect(updatedTenant).toEqual({
283
+ ...tenant,
284
+ _id: new ObjectId(tenant._id),
285
+ updatedAt: expect.any(Date),
286
+ createdAt: new Date(tenant.createdAt),
287
+ webhookAuth: {
288
+ type: 'bearer',
289
+ bearerToken: '',
290
+ },
291
+ });
292
+
293
+ expect(response.statusCode).toEqual(200);
294
+ expect(response.json).toEqual({
295
+ createdAt: tenant.createdAt,
296
+ id: tenant._id,
297
+ });
298
+ });
299
+
300
+ it('should be able to update an existing tenant using relative serviceIds', async () => {
301
+ const tenant = await persistTenant({
302
+ did: orgDoc.id,
303
+ serviceIds: [`${orgDoc.id}#test-service`],
304
+ });
305
+
306
+ const response = await fastify.injectJson({
307
+ method: 'PUT',
308
+ url: `${buildUrl()}/${tenant._id}`,
309
+ payload: {
310
+ serviceIds: ['#test-service'],
311
+ },
312
+ });
313
+
314
+ expect(response.statusCode).toEqual(200);
315
+ expect(response.json).toEqual({
316
+ createdAt: tenant.createdAt,
317
+ id: tenant._id,
318
+ });
319
+ });
320
+
321
+ describe('Tenant update with authorized group test suite', () => {
322
+ it('should be able to update an existing tenant if has auth group', async () => {
323
+ const tenant = await persistTenant({
324
+ did: orgDoc.id,
325
+ serviceIds: [`${orgDoc.id}#test-service`],
326
+ });
327
+ await persistGroup({ _id: 'did:velocity:123', dids: [orgDoc.id] });
328
+ const response = await fastify.injectJson({
329
+ method: 'PUT',
330
+ url: `${buildUrl()}/${tenant._id}`,
331
+ headers: {
332
+ authorization: 'Bearer',
333
+ 'x-override-auth-user-group-id': 'did:velocity:123',
334
+ },
335
+ payload: {
336
+ serviceIds: tenant.serviceIds,
337
+ webhookUrl: 'http://customUrl.com',
338
+ },
339
+ });
340
+
341
+ expect(response.statusCode).toEqual(200);
342
+ expect(response.json).toEqual({
343
+ createdAt: tenant.createdAt,
344
+ id: tenant._id,
345
+ });
346
+ });
347
+ });
348
+ });
349
+
350
+ describe('Tenant Retrieval tests', () => {
351
+ it('should be able to get a tenant by did', async () => {
352
+ const tenant = await persistTenant({
353
+ did: orgDoc.id,
354
+ webhookUrl: 'https://customurl.com',
355
+ serviceIds: [`${orgDoc.id}#test-service`],
356
+ });
357
+
358
+ const response = await fastify.injectJson({
359
+ method: 'GET',
360
+ url: `${buildUrl()}/${tenant._id}`,
361
+ });
362
+
363
+ expect(response.statusCode).toEqual(200);
364
+ expect(response.json).toEqual({
365
+ ...omit(['_id'], tenant),
366
+ id: tenant._id,
367
+ updatedAt: expect.any(String),
368
+ });
369
+ });
370
+
371
+ it('defaultIssuingDisclosureId should be automatically set on tenant if it is missing', async () => {
372
+ const tenant = await persistTenant({
373
+ did: orgDoc.id,
374
+ webhookUrl: 'https://customurl.com',
375
+ serviceIds: [`${orgDoc.id}#test-service`],
376
+ });
377
+
378
+ const disclosure = await persistDisclosure({
379
+ tenant,
380
+ vendorEndpoint: VendorEndpoint.ISSUING_IDENTIFICATION,
381
+ });
382
+
383
+ const response = await fastify.injectJson({
384
+ method: 'GET',
385
+ url: `${buildUrl()}/${tenant._id}`,
386
+ });
387
+
388
+ await persistDisclosure({
389
+ tenant,
390
+ vendorEndpoint: VendorEndpoint.ISSUING_IDENTIFICATION,
391
+ });
392
+
393
+ await fastify.injectJson({
394
+ method: 'GET',
395
+ url: `${buildUrl()}/${tenant._id}`,
396
+ });
397
+
398
+ expect(response.statusCode).toEqual(200);
399
+ expect(response.json).toEqual({
400
+ ...omit(['_id'], tenant),
401
+ id: tenant._id,
402
+ updatedAt: expect.any(String),
403
+ });
404
+
405
+ const db = await tenantRepo.findOne(tenant._id);
406
+ expect(db.defaultIssuingDisclosureId.toString()).toEqual(disclosure._id);
407
+ });
408
+
409
+ it('defaultIssuingDisclosureId should not be set on tenant if defaultIssuingDisclosureId is null', async () => {
410
+ const insertedTenant = await mongoDb()
411
+ .collection('tenants')
412
+ .insertOne({
413
+ did: orgDoc.id,
414
+ primaryAddress: '0x12345',
415
+ webhookUrl: 'https://customurl.com',
416
+ serviceIds: [`${orgDoc.id}#test-service`],
417
+ defaultIssuingDisclosureId: null,
418
+ createdAt: new Date(),
419
+ updatedAt: new Date(),
420
+ });
421
+ const tenant = await mongoDb()
422
+ .collection('tenants')
423
+ .findOne({ _id: insertedTenant.insertedId });
424
+
425
+ await persistDisclosure({
426
+ tenant,
427
+ vendorEndpoint: VendorEndpoint.ISSUING_IDENTIFICATION,
428
+ });
429
+
430
+ const response = await fastify.injectJson({
431
+ method: 'GET',
432
+ url: `${buildUrl()}/${tenant._id}`,
433
+ });
434
+
435
+ expect(response.statusCode).toEqual(200);
436
+ expect(response.json).toEqual({
437
+ ...omit(['_id', 'defaultIssuingDisclosureId'], tenant),
438
+ id: tenant._id.toString(),
439
+ updatedAt: expect.any(String),
440
+ createdAt: expect.any(String),
441
+ });
442
+
443
+ const db = await tenantRepo.findOne(tenant._id);
444
+ expect(db.defaultIssuingDisclosureId).toEqual(null);
445
+ });
446
+
447
+ it('should 200 when getting a tenant by did', async () => {
448
+ const tenant = await persistTenant({
449
+ did: orgDoc.id,
450
+ serviceIds: [`${orgDoc.id}#test-service`],
451
+ });
452
+
453
+ const response = await fastify.injectJson({
454
+ method: 'GET',
455
+ url: `${buildUrl()}/${tenant.did}`,
456
+ });
457
+
458
+ expect(response.statusCode).toEqual(200);
459
+ expect(response.json).toEqual({
460
+ ...omit(['_id', 'serviceId'], tenant),
461
+ serviceIds: tenant.serviceIds,
462
+ id: tenant._id,
463
+ updatedAt: expect.any(String),
464
+ });
465
+ });
466
+
467
+ it('should handle tenants with single serviceId', async () => {
468
+ const tenant = await persistTenant({
469
+ did: orgDoc.id,
470
+ serviceId: `${orgDoc.id}#test-service`,
471
+ });
472
+
473
+ const response = await fastify.injectJson({
474
+ method: 'GET',
475
+ url: `${buildUrl()}/${tenant._id}`,
476
+ });
477
+
478
+ expect(response.statusCode).toEqual(200);
479
+ expect(response.json).toEqual({
480
+ ...omit(['_id', 'serviceId'], tenant),
481
+ serviceIds: [tenant.serviceId],
482
+ id: tenant._id,
483
+ updatedAt: expect.any(String),
484
+ });
485
+ });
486
+
487
+ it('should be able to get a full tenant profile by did', async () => {
488
+ nockRegistrarGetOrganizationVerifiedProfile(
489
+ orgDoc.id,
490
+ rootIssuerVerifiedProfile
491
+ );
492
+
493
+ const tenant = await persistTenant({
494
+ did: orgDoc.id,
495
+ serviceIds: [first(orgDoc.service).id],
496
+ });
497
+
498
+ const response = await fastify.injectJson({
499
+ method: 'GET',
500
+ url: `${buildUrl()}/${tenant._id}?fullProfile=true`,
501
+ });
502
+
503
+ const expectedResult = {
504
+ ...omit(['_id'], tenant),
505
+ did: orgDoc.id,
506
+ name: rootIssuerProfile.name,
507
+ logo: rootIssuerProfile.logo,
508
+ credentialTypesIssued: ['CurrentEmploymentPosition'],
509
+ };
510
+
511
+ expect(response.statusCode).toEqual(200);
512
+ expect(response.json).toEqual({
513
+ ...expectedResult,
514
+ ...omit(['_id'], tenant),
515
+ updatedAt: expect.any(String),
516
+ id: tenant._id,
517
+ });
518
+ });
519
+
520
+ it("should be able to get a full tenant profile by id when it's missing a service ID", async () => {
521
+ nockRegistrarGetOrganizationVerifiedProfile(
522
+ orgDoc.id,
523
+ rootIssuerVerifiedProfile
524
+ );
525
+
526
+ const tenant = await persistTenant({
527
+ did: orgDoc.id,
528
+ });
529
+
530
+ const response = await fastify.injectJson({
531
+ method: 'GET',
532
+ url: `${buildUrl()}/${tenant._id}?fullProfile=true`,
533
+ });
534
+
535
+ const expectedResult = {
536
+ ...omit(['_id'], tenant),
537
+ did: orgDoc.id,
538
+ name: rootIssuerProfile.name,
539
+ logo: rootIssuerProfile.logo,
540
+ credentialTypesIssued: [],
541
+ };
542
+
543
+ expect(response.statusCode).toEqual(200);
544
+ expect(response.json).toEqual({
545
+ ...expectedResult,
546
+ ...omit(['_id'], tenant),
547
+ updatedAt: expect.any(String),
548
+ id: tenant._id,
549
+ });
550
+ });
551
+
552
+ it("should be able to get a tenant's key by id from the mongo collection", async () => {
553
+ const privateKeyPair1 = generateKeyPair({ format: 'jwk' });
554
+ const privateKeyPair2 = generateKeyPair({ format: 'jwk' });
555
+ const tenant1 = await persistTenant();
556
+ const tenantKey1 = await persistKey({
557
+ tenant: tenant1,
558
+ kidFragment: '#ID1',
559
+ keyPair: privateKeyPair1,
560
+ });
561
+
562
+ const tenant2 = await persistTenant();
563
+ await persistKey({
564
+ tenant: tenant2,
565
+ kidFragment: '#ID2',
566
+ keyPair: privateKeyPair2,
567
+ });
568
+
569
+ const kmsKey = await agentKms({
570
+ tenant: mongoify(tenant1),
571
+ }).exportKeyOrSecret(tenantKey1._id);
572
+ expect(kmsKey.privateJwk).toEqual(privateKeyPair1.privateKey);
573
+ });
574
+
575
+ it('should be able to fail with 404 if a tenant cannot be found', async () => {
576
+ const response = await fastify.injectJson({
577
+ method: 'GET',
578
+ url: `${buildUrl()}/507f1f77bcf86cd799439011`,
579
+ });
580
+
581
+ expect(response.statusCode).toEqual(404);
582
+ });
583
+ });
584
+
585
+ describe('Tenants Retrieval tests', () => {
586
+ it('should be able to get multiple tenants', async () => {
587
+ const { orgDoc: orgDoc2 } = await createOrgDoc();
588
+ const { orgDoc: orgDoc3 } = await createOrgDoc();
589
+
590
+ const tenant1 = await persistTenant({
591
+ did: orgDoc.id,
592
+ serviceIds: [`${orgDoc.id}#test-service`],
593
+ });
594
+ const tenant2 = await persistTenant({
595
+ did: orgDoc2.id,
596
+ serviceIds: [`${orgDoc2.id}#test-service`],
597
+ });
598
+ const tenant3 = await persistTenant({
599
+ did: orgDoc3.id,
600
+ serviceIds: [`${orgDoc3.id}#test-service`],
601
+ });
602
+ const tenants = [tenant1, tenant2, tenant3];
603
+
604
+ const response = await fastify.injectJson({
605
+ method: 'GET',
606
+ url: `${buildUrl()}`,
607
+ });
608
+
609
+ expect(response.statusCode).toEqual(200);
610
+ expect(response.json).toEqual(
611
+ flow(
612
+ map(idKeyMapper),
613
+ map((tenant) => ({
614
+ ...omit(['_id'], tenant),
615
+ })),
616
+ sortBy((t) => -new Date(t.createdAt).getTime())
617
+ )(tenants)
618
+ );
619
+ });
620
+
621
+ it('should be able to get multiple tenants with single serviceId', async () => {
622
+ const { orgDoc: orgDoc2 } = await createOrgDoc();
623
+ const { orgDoc: orgDoc3 } = await createOrgDoc();
624
+
625
+ const tenant1 = await persistTenant({
626
+ did: orgDoc.id,
627
+ serviceId: `${orgDoc.id}#test-service`,
628
+ });
629
+ const tenant2 = await persistTenant({
630
+ did: orgDoc2.id,
631
+ serviceId: `${orgDoc2.id}#test-service`,
632
+ });
633
+ const tenant3 = await persistTenant({
634
+ did: orgDoc3.id,
635
+ serviceId: `${orgDoc3.id}#test-service`,
636
+ });
637
+ const tenants = [tenant1, tenant2, tenant3];
638
+
639
+ const response = await fastify.injectJson({
640
+ method: 'GET',
641
+ url: `${buildUrl()}`,
642
+ });
643
+
644
+ expect(response.statusCode).toEqual(200);
645
+ expect(response.json).toEqual(
646
+ flow(
647
+ map(idKeyMapper),
648
+ map((tenant) => ({
649
+ ...omit(['_id', 'serviceId'], tenant),
650
+ serviceIds: [tenant.serviceId],
651
+ })),
652
+ sortBy((t) => -new Date(t.createdAt).getTime())
653
+ )(tenants)
654
+ );
655
+ });
656
+
657
+ it('should be able to get multiple tenants that have no service ID', async () => {
658
+ const { orgDoc: orgDoc2 } = await createOrgDoc();
659
+ const { orgDoc: orgDoc3 } = await createOrgDoc();
660
+
661
+ const tenant1 = await persistTenant({
662
+ did: orgDoc.id,
663
+ });
664
+ const tenant2 = await persistTenant({
665
+ did: orgDoc2.id,
666
+ });
667
+ const tenant3 = await persistTenant({
668
+ did: orgDoc3.id,
669
+ });
670
+ const tenants = [tenant1, tenant2, tenant3];
671
+
672
+ const response = await fastify.injectJson({
673
+ method: 'GET',
674
+ url: `${buildUrl()}`,
675
+ });
676
+
677
+ expect(response.statusCode).toEqual(200);
678
+ expect(response.json).toEqual(
679
+ flow(
680
+ map(idKeyMapper),
681
+ map((tenant) => ({
682
+ ...omit(['_id'], tenant),
683
+ })),
684
+ sortBy((t) => -new Date(t.createdAt).getTime())
685
+ )(tenants)
686
+ );
687
+ });
688
+ });
689
+
690
+ describe('Tenant Removal tests', () => {
691
+ it('should be able to delete a tenant, as well as its did from related group', async () => {
692
+ const tenant = await persistTenant();
693
+
694
+ await persistGroup({
695
+ groupId: 'groupIdRemovalTest',
696
+ dids: ['test_tenant_did', tenant.did],
697
+ });
698
+
699
+ const delResponse = await fastify.injectJson({
700
+ method: 'DELETE',
701
+ url: `${buildUrl()}/${tenant._id}`,
702
+ });
703
+ expect(delResponse.statusCode).toEqual(204);
704
+
705
+ const group = await groupRepo.findOne({});
706
+
707
+ expect(group.dids).toEqual(['test_tenant_did']);
708
+
709
+ const getResponse = await fastify.injectJson({
710
+ method: 'GET',
711
+ url: `${buildUrl()}/${tenant._id}`,
712
+ });
713
+
714
+ expect(getResponse.statusCode).toEqual(404);
715
+ });
716
+
717
+ it('should 404 when deleting a tenant that does not exist', async () => {
718
+ const tenant = { _id: new ObjectId() };
719
+
720
+ const response = await fastify.injectJson({
721
+ method: 'DELETE',
722
+ url: `${buildUrl()}/${tenant._id}`,
723
+ });
724
+ expect(response.statusCode).toEqual(404);
725
+ expect(response.json.message).toEqual(
726
+ `Tenant ${JSON.stringify({ tenantId: tenant._id })} not found`
727
+ );
728
+ });
729
+ });
730
+ });