@verii/endpoints-organizations-registrar 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 (259) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +1 -0
  3. package/README.md +3 -0
  4. package/package.json +86 -0
  5. package/src/config/abi.json +1 -0
  6. package/src/config/config.js +261 -0
  7. package/src/controllers/consents/autohooks.js +6 -0
  8. package/src/controllers/consents/controller.js +106 -0
  9. package/src/controllers/consents/schemas/consent-response.schema.js +45 -0
  10. package/src/controllers/did-web-host/controller.js +64 -0
  11. package/src/controllers/groups/autohooks.js +10 -0
  12. package/src/controllers/groups/controller.js +172 -0
  13. package/src/controllers/groups/schemas/group.schema.json +22 -0
  14. package/src/controllers/groups/schemas/index.js +7 -0
  15. package/src/controllers/groups/schemas/modify-group.schema.json +25 -0
  16. package/src/controllers/image_upload/controller.js +48 -0
  17. package/src/controllers/invitations/controller.js +79 -0
  18. package/src/controllers/organizations/_did/autohooks.js +16 -0
  19. package/src/controllers/organizations/_did/controller.js +617 -0
  20. package/src/controllers/organizations/_did/invitations/_invitationId/autohooks.js +16 -0
  21. package/src/controllers/organizations/_did/invitations/_invitationId/controller.js +217 -0
  22. package/src/controllers/organizations/_did/invitations/controller.js +197 -0
  23. package/src/controllers/organizations/_did/keys/controller.js +141 -0
  24. package/src/controllers/organizations/_did/services/controller.js +195 -0
  25. package/src/controllers/organizations/_did/signatories/controller.js +63 -0
  26. package/src/controllers/organizations/autohooks.js +65 -0
  27. package/src/controllers/organizations/controller.js +322 -0
  28. package/src/controllers/organizations/full/controller.js +285 -0
  29. package/src/controllers/organizations/plugins.js +21 -0
  30. package/src/controllers/organizations/schemas/add-key-body.schema.json +35 -0
  31. package/src/controllers/organizations/schemas/create-did-service.schema.json +70 -0
  32. package/src/controllers/organizations/schemas/did-key.schema.json +178 -0
  33. package/src/controllers/organizations/schemas/full-organization.schema.json +35 -0
  34. package/src/controllers/organizations/schemas/index.js +33 -0
  35. package/src/controllers/organizations/schemas/invitationCodeProperty.schema.json +3 -0
  36. package/src/controllers/organizations/schemas/organization-ids.schema.json +34 -0
  37. package/src/controllers/organizations/schemas/organization-kyb-profile-creation.schema.json +26 -0
  38. package/src/controllers/organizations/schemas/organization-profile-creation.schema.json +20 -0
  39. package/src/controllers/organizations/schemas/organization-profile-update.schema.json +19 -0
  40. package/src/controllers/organizations/schemas/organization-profile-verifiable-credential.schema.json +25 -0
  41. package/src/controllers/organizations/schemas/organization-registry-service-response.schema.json +26 -0
  42. package/src/controllers/organizations/schemas/organization-service.schema.json +34 -0
  43. package/src/controllers/organizations/schemas/organization-verified-profile.schema.json +123 -0
  44. package/src/controllers/organizations/schemas/organization.search-profile.query-params.schema.json +50 -0
  45. package/src/controllers/organizations/schemas/organization.search.query-params.schema.json +42 -0
  46. package/src/controllers/reference/controller.js +103 -0
  47. package/src/controllers/resolve-did/controller.js +45 -0
  48. package/src/controllers/resolve-did/resolve-did.js +30 -0
  49. package/src/controllers/resolve-did/schemas/did-doc.schema.json +155 -0
  50. package/src/controllers/resolve-did/schemas/did-proof.schema.json +44 -0
  51. package/src/controllers/resolve-did/schemas/index.js +26 -0
  52. package/src/controllers/resolve-did/schemas/public-key.schema.json +173 -0
  53. package/src/controllers/resolve-kid/controller.js +76 -0
  54. package/src/controllers/resolve-kid/public-key-formats.js +8 -0
  55. package/src/controllers/service-types/controller.js +81 -0
  56. package/src/controllers/setup_image_upload/controller.js +99 -0
  57. package/src/controllers/signatories/controller.js +43 -0
  58. package/src/controllers/users/autohooks.js +10 -0
  59. package/src/controllers/users/controller.js +221 -0
  60. package/src/controllers/users/schemas/base-user.schema.json +55 -0
  61. package/src/controllers/users/schemas/index.js +4 -0
  62. package/src/controllers/users/schemas/modify-user.schema.js +17 -0
  63. package/src/controllers/users/schemas/user.schema.js +20 -0
  64. package/src/entities/groups/domain/constants.js +21 -0
  65. package/src/entities/groups/domain/index.js +19 -0
  66. package/src/entities/groups/factories/groups-factory.js +48 -0
  67. package/src/entities/groups/factories/index.js +17 -0
  68. package/src/entities/groups/index.js +19 -0
  69. package/src/entities/groups/repo.js +122 -0
  70. package/src/entities/images/domain/constant.js +11 -0
  71. package/src/entities/images/domain/index.js +3 -0
  72. package/src/entities/images/extension/activate.extension.js +35 -0
  73. package/src/entities/images/extension/deactivate.extension.js +27 -0
  74. package/src/entities/images/extension/find-by-url.extension.js +24 -0
  75. package/src/entities/images/extension/index.js +5 -0
  76. package/src/entities/images/factories/images-factory.js +43 -0
  77. package/src/entities/images/factories/index.js +17 -0
  78. package/src/entities/images/index.js +5 -0
  79. package/src/entities/images/repo.js +43 -0
  80. package/src/entities/images/schema/image-metadata.schema.js +58 -0
  81. package/src/entities/images/schema/index.js +3 -0
  82. package/src/entities/index.js +31 -0
  83. package/src/entities/invitations/domains/build-invitation-url.js +14 -0
  84. package/src/entities/invitations/domains/get-given-family-name-from-name.js +20 -0
  85. package/src/entities/invitations/domains/index.js +7 -0
  86. package/src/entities/invitations/domains/init-invitation-emails.js +17 -0
  87. package/src/entities/invitations/domains/is-invitation-expired.js +5 -0
  88. package/src/entities/invitations/domains/validate-invitee-email.js +18 -0
  89. package/src/entities/invitations/factories/index.js +17 -0
  90. package/src/entities/invitations/factories/invitations-factory.js +51 -0
  91. package/src/entities/invitations/index.js +6 -0
  92. package/src/entities/invitations/orchestrators/accept-invitation.js +24 -0
  93. package/src/entities/invitations/orchestrators/index.js +4 -0
  94. package/src/entities/invitations/orchestrators/send-email-invitee.js +36 -0
  95. package/src/entities/invitations/repo.js +37 -0
  96. package/src/entities/invitations/schemas/add-invitation-body.js +122 -0
  97. package/src/entities/invitations/schemas/get-invitation-response-body.js +20 -0
  98. package/src/entities/invitations/schemas/index.js +5 -0
  99. package/src/entities/invitations/schemas/invitation-response-item-body.js +61 -0
  100. package/src/entities/kms/factories/index.js +17 -0
  101. package/src/entities/kms/factories/kms-factory.js +31 -0
  102. package/src/entities/monitors/index.js +17 -0
  103. package/src/entities/monitors/orchestrators/index.js +17 -0
  104. package/src/entities/monitors/orchestrators/monitors.js +230 -0
  105. package/src/entities/oauth/domain/constants.js +23 -0
  106. package/src/entities/oauth/domain/index.js +5 -0
  107. package/src/entities/oauth/domain/roles.js +92 -0
  108. package/src/entities/oauth/domain/scopes.js +35 -0
  109. package/src/entities/oauth/index.js +4 -0
  110. package/src/entities/oauth/orchestrators/auth0-provisioner.js +293 -0
  111. package/src/entities/oauth/orchestrators/index.js +3 -0
  112. package/src/entities/organization-keys/domains/build-organization-key.js +50 -0
  113. package/src/entities/organization-keys/domains/constants.js +30 -0
  114. package/src/entities/organization-keys/domains/extract-verification-method-from-byo-did-document.js +38 -0
  115. package/src/entities/organization-keys/domains/find-key-by-purpose.js +6 -0
  116. package/src/entities/organization-keys/domains/index.js +10 -0
  117. package/src/entities/organization-keys/domains/jwk-to-hex-key-transformer.js +13 -0
  118. package/src/entities/organization-keys/domains/map-key-response.js +29 -0
  119. package/src/entities/organization-keys/domains/validate-non-custodial-key.js +11 -0
  120. package/src/entities/organization-keys/domains/validate-organization-key.js +42 -0
  121. package/src/entities/organization-keys/factories/index.js +17 -0
  122. package/src/entities/organization-keys/factories/organization-keys-factory.js +55 -0
  123. package/src/entities/organization-keys/index.js +5 -0
  124. package/src/entities/organization-keys/orchestrators/add-key-to-did-doc.js +19 -0
  125. package/src/entities/organization-keys/orchestrators/add-key.js +155 -0
  126. package/src/entities/organization-keys/orchestrators/add-operator-keys.js +46 -0
  127. package/src/entities/organization-keys/orchestrators/delete-key.js +93 -0
  128. package/src/entities/organization-keys/orchestrators/get-key.js +39 -0
  129. package/src/entities/organization-keys/orchestrators/index.js +24 -0
  130. package/src/entities/organization-keys/orchestrators/resolve-verification-method-byo-did.js +28 -0
  131. package/src/entities/organization-keys/repos/repo.js +48 -0
  132. package/src/entities/organization-services/adapters/index.js +21 -0
  133. package/src/entities/organization-services/adapters/init-provision-auth0-client-grants.js +44 -0
  134. package/src/entities/organization-services/adapters/init-provision-auth0-clients.js +56 -0
  135. package/src/entities/organization-services/adapters/update-blockchain-permissions-from-permitted-services.js +118 -0
  136. package/src/entities/organization-services/domains/activate-services.js +12 -0
  137. package/src/entities/organization-services/domains/build-organizations-services.js +38 -0
  138. package/src/entities/organization-services/domains/build-public-services.js +19 -0
  139. package/src/entities/organization-services/domains/constants.js +32 -0
  140. package/src/entities/organization-services/domains/extract-cao-service-refs.js +10 -0
  141. package/src/entities/organization-services/domains/extract-service-endpoint-did.js +10 -0
  142. package/src/entities/organization-services/domains/get-service-consent-type.js +16 -0
  143. package/src/entities/organization-services/domains/get-service-types-from-categories.js +18 -0
  144. package/src/entities/organization-services/domains/index.js +17 -0
  145. package/src/entities/organization-services/domains/is-new-node-operator-service.js +25 -0
  146. package/src/entities/organization-services/domains/is-service-category.js +31 -0
  147. package/src/entities/organization-services/domains/normalize-service-endpoint.js +6 -0
  148. package/src/entities/organization-services/domains/select-activated-services.js +8 -0
  149. package/src/entities/organization-services/domains/transform-profile-service.js +88 -0
  150. package/src/entities/organization-services/domains/validate-cao-service-refs.js +25 -0
  151. package/src/entities/organization-services/domains/validate-service-credential-type.js +47 -0
  152. package/src/entities/organization-services/domains/validate-service-endpoint.js +35 -0
  153. package/src/entities/organization-services/domains/validate-service-fields-by-service-type.js +37 -0
  154. package/src/entities/organization-services/domains/validate-service-id-uniqueness.js +19 -0
  155. package/src/entities/organization-services/domains/validate-service-key-purposes.js +56 -0
  156. package/src/entities/organization-services/domains/validate-service-type.js +12 -0
  157. package/src/entities/organization-services/domains/validate-service.js +80 -0
  158. package/src/entities/organization-services/domains/validate-services-for-delete.js +32 -0
  159. package/src/entities/organization-services/index.js +5 -0
  160. package/src/entities/organization-services/orchestrators/add-service.js +106 -0
  161. package/src/entities/organization-services/orchestrators/delete-service.js +142 -0
  162. package/src/entities/organization-services/orchestrators/get-service.js +36 -0
  163. package/src/entities/organization-services/orchestrators/index.js +8 -0
  164. package/src/entities/organization-services/orchestrators/init-add-service-to-organization.js +141 -0
  165. package/src/entities/organization-services/orchestrators/load-cao-service-refs.js +56 -0
  166. package/src/entities/organization-services/orchestrators/update-service.js +103 -0
  167. package/src/entities/organizations/adapters/index.js +6 -0
  168. package/src/entities/organizations/adapters/init-organization-registrar-emails.js +215 -0
  169. package/src/entities/organizations/adapters/init-send-activation-emails-to-caos.js +89 -0
  170. package/src/entities/organizations/adapters/send-email-invitation-accepted-to-inviter.js +70 -0
  171. package/src/entities/organizations/adapters/send-email-notifications.js +212 -0
  172. package/src/entities/organizations/domains/build-custodied-did-web.js +12 -0
  173. package/src/entities/organizations/domains/build-full-organization-response.js +40 -0
  174. package/src/entities/organizations/domains/build-organization-modifications-on-service-change.js +82 -0
  175. package/src/entities/organizations/domains/build-profile-vc-url.js +8 -0
  176. package/src/entities/organizations/domains/build-profile-verifiable-credential.js +36 -0
  177. package/src/entities/organizations/domains/build-public-profile.js +9 -0
  178. package/src/entities/organizations/domains/constants.js +54 -0
  179. package/src/entities/organizations/domains/index.js +17 -0
  180. package/src/entities/organizations/domains/organization-vc-checks.js +49 -0
  181. package/src/entities/organizations/domains/parse-profile-to-csv.js +41 -0
  182. package/src/entities/organizations/domains/prepare-profile-vc.js +28 -0
  183. package/src/entities/organizations/domains/profile-name-normalization.js +5 -0
  184. package/src/entities/organizations/domains/validate-byo-did-keys.js +28 -0
  185. package/src/entities/organizations/domains/validate-profile-name.js +48 -0
  186. package/src/entities/organizations/domains/validate-profile-website.js +17 -0
  187. package/src/entities/organizations/domains/validate-update-profile.js +11 -0
  188. package/src/entities/organizations/factories/index.js +17 -0
  189. package/src/entities/organizations/factories/organizations-factory.js +180 -0
  190. package/src/entities/organizations/index.js +6 -0
  191. package/src/entities/organizations/orchestrators/add-primary-permissions.js +28 -0
  192. package/src/entities/organizations/orchestrators/build-custodied-organization.js +92 -0
  193. package/src/entities/organizations/orchestrators/build-non-custodied-organization.js +83 -0
  194. package/src/entities/organizations/orchestrators/index.js +6 -0
  195. package/src/entities/organizations/orchestrators/init-create-organization.js +221 -0
  196. package/src/entities/organizations/orchestrators/init-provision-group.js +48 -0
  197. package/src/entities/organizations/orchestrators/verify-profile-website-unique.js +15 -0
  198. package/src/entities/organizations/repos/find-caos-extension.js +49 -0
  199. package/src/entities/organizations/repos/index.js +17 -0
  200. package/src/entities/organizations/repos/repo.js +156 -0
  201. package/src/entities/organizations/repos/search-by-aggregation-extension.js +128 -0
  202. package/src/entities/organizations/repos/transform-did-filter.js +13 -0
  203. package/src/entities/organizations/repos/transform-organization-filter.js +106 -0
  204. package/src/entities/registrar-consents/constants.js +10 -0
  205. package/src/entities/registrar-consents/factories/index.js +17 -0
  206. package/src/entities/registrar-consents/factories/registrar-consents-factory.js +38 -0
  207. package/src/entities/registrar-consents/index.js +3 -0
  208. package/src/entities/registrar-consents/repos/registrar-consent-repo-extension.js +55 -0
  209. package/src/entities/registrar-consents/repos/repo.js +31 -0
  210. package/src/entities/signatories/domain/constants.js +12 -0
  211. package/src/entities/signatories/domain/index.js +4 -0
  212. package/src/entities/signatories/domain/organization-emails.js +29 -0
  213. package/src/entities/signatories/factories/index.js +17 -0
  214. package/src/entities/signatories/factories/signatory-status-factory.js +53 -0
  215. package/src/entities/signatories/index.js +5 -0
  216. package/src/entities/signatories/orchestrators/approve-reminder.js +24 -0
  217. package/src/entities/signatories/orchestrators/index.js +6 -0
  218. package/src/entities/signatories/orchestrators/reject-reminder.js +17 -0
  219. package/src/entities/signatories/orchestrators/send-reminders.js +102 -0
  220. package/src/entities/signatories/orchestrators/validate-auth-code.js +56 -0
  221. package/src/entities/signatories/repos/index.js +3 -0
  222. package/src/entities/signatories/repos/repo.js +35 -0
  223. package/src/entities/signatories/repos/signatory-status-state-repo-extension.js +124 -0
  224. package/src/entities/users/domains/constants.js +40 -0
  225. package/src/entities/users/domains/index.js +4 -0
  226. package/src/entities/users/domains/user-registrar-emails.js +52 -0
  227. package/src/entities/users/index.js +4 -0
  228. package/src/entities/users/orchestrators/create-auth0-user.js +60 -0
  229. package/src/entities/users/orchestrators/get-or-create-auth0-user.js +63 -0
  230. package/src/entities/users/orchestrators/index.js +22 -0
  231. package/src/entities/users/orchestrators/user-management.js +157 -0
  232. package/src/fetchers/index.js +19 -0
  233. package/src/fetchers/monitoring/index.js +9 -0
  234. package/src/fetchers/monitoring/monitor-add-to-page-fetcher.js +18 -0
  235. package/src/fetchers/monitoring/monitor-create-fetcher.js +23 -0
  236. package/src/fetchers/monitoring/monitor-delete-fetcher.js +6 -0
  237. package/src/fetchers/monitoring/monitor-get-all-fetcher.js +6 -0
  238. package/src/fetchers/monitoring/section-create-fetcher.js +16 -0
  239. package/src/fetchers/monitoring/section-get-all-fetcher.js +6 -0
  240. package/src/fetchers/monitoring/service-version-fetcher.js +6 -0
  241. package/src/helpers/init-permissions-contract.js +48 -0
  242. package/src/index.js +23 -0
  243. package/src/init-server.js +91 -0
  244. package/src/organizations-registrar-endpoints.js +68 -0
  245. package/src/plugins/authorization.js +233 -0
  246. package/src/plugins/index.js +4 -0
  247. package/src/plugins/pubsub-plugin.js +82 -0
  248. package/src/subscribers/notify-caos.js +63 -0
  249. package/src/subscribers/notify-inviters.js +42 -0
  250. package/src/subscribers/notify-monitoring.js +40 -0
  251. package/src/subscribers/notify-signatory.js +51 -0
  252. package/src/subscribers/notify-support-and-groups.js +95 -0
  253. package/src/templates/invitee-invitation-email-body.hbs +13 -0
  254. package/src/templates/invitee-invitation-email-subject.hbs +1 -0
  255. package/src/templates/signatory-approval-email-body.hbs +92 -0
  256. package/src/templates/support-organization-created-body.hbs +17 -0
  257. package/src/templates/support-organization-created-subject.hbs +1 -0
  258. package/src/templates/support-signatory-max-reminders-reached-email-body.hbs +6 -0
  259. package/src/templates/support-signatory-max-reminders-reached-email-subject.hbs +1 -0
@@ -0,0 +1,195 @@
1
+ /*
2
+ * Copyright 2025 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
+ const { RegistrarScopes } = require('../../../../entities');
18
+ const {
19
+ verifyUserOrganizationReadAuthorized,
20
+ verifyUserOrganizationWriteAuthorized,
21
+ } = require('../../../../plugins/authorization');
22
+ const { registeredCredentialTypesPreHandler } = require('../../plugins');
23
+ const { invitationCodePropertySchema } = require('../../schemas');
24
+ const {
25
+ initAddService,
26
+ initDeleteService,
27
+ getService,
28
+ updateService,
29
+ } = require('../../../../entities');
30
+
31
+ const servicesController = async (fastify) => {
32
+ const deleteService = initDeleteService(fastify);
33
+ const addService = initAddService(fastify);
34
+
35
+ fastify
36
+ .get(
37
+ '/:serviceId',
38
+ {
39
+ onRequest: fastify.verifyAccessToken([
40
+ RegistrarScopes.AdminOrganizations,
41
+ RegistrarScopes.ReadOrganizations,
42
+ ]),
43
+ preHandler: [verifyUserOrganizationReadAuthorized],
44
+ schema: fastify.autoSchema({
45
+ security: [
46
+ {
47
+ RegistrarOAuth2: [
48
+ RegistrarScopes.ReadOrganizations,
49
+ RegistrarScopes.AdminOrganizations,
50
+ ],
51
+ },
52
+ ],
53
+ params: {
54
+ type: 'object',
55
+ properties: {
56
+ serviceId: { type: 'string' },
57
+ },
58
+ },
59
+ response: {
60
+ 200: { $ref: 'organization-service#' },
61
+ },
62
+ }),
63
+ },
64
+ async (req) => getService(req.params.did, req.params.serviceId, req)
65
+ )
66
+ .post(
67
+ '/',
68
+ {
69
+ onRequest: fastify.verifyAccessToken([
70
+ RegistrarScopes.AdminOrganizations,
71
+ RegistrarScopes.WriteOrganizations,
72
+ ]),
73
+ preHandler: [
74
+ verifyUserOrganizationWriteAuthorized,
75
+ registeredCredentialTypesPreHandler,
76
+ ],
77
+ schema: fastify.autoSchema({
78
+ security: [
79
+ {
80
+ RegistrarOAuth2: [
81
+ RegistrarScopes.WriteOrganizations,
82
+ RegistrarScopes.AdminOrganizations,
83
+ ],
84
+ },
85
+ ],
86
+ body: {
87
+ allOf: [
88
+ { $ref: 'create-did-service#' },
89
+ {
90
+ type: 'object',
91
+ properties: {
92
+ invitationCode: invitationCodePropertySchema,
93
+ },
94
+ },
95
+ ],
96
+ },
97
+ response: {
98
+ 201: {
99
+ type: 'object',
100
+ properties: {
101
+ service: { $ref: 'did-service#' },
102
+ authClient: {
103
+ type: 'object',
104
+ properties: {
105
+ type: { type: 'string' },
106
+ clientType: { type: 'string' },
107
+ clientId: { type: 'string' },
108
+ clientSecret: { type: 'string' },
109
+ serviceId: { type: 'string' },
110
+ },
111
+ },
112
+ },
113
+ },
114
+ },
115
+ }),
116
+ },
117
+ async (req, reply) => {
118
+ const response = await addService(req.params.did, req.body, req);
119
+ reply.code(201);
120
+ return response;
121
+ }
122
+ )
123
+ .put(
124
+ '/:serviceId',
125
+ {
126
+ onRequest: fastify.verifyAccessToken([
127
+ RegistrarScopes.AdminOrganizations,
128
+ RegistrarScopes.WriteOrganizations,
129
+ ]),
130
+ preHandler: [
131
+ verifyUserOrganizationWriteAuthorized,
132
+ registeredCredentialTypesPreHandler,
133
+ ],
134
+ schema: fastify.autoSchema({
135
+ security: [
136
+ {
137
+ RegistrarOAuth2: [
138
+ RegistrarScopes.WriteOrganizations,
139
+ RegistrarScopes.AdminOrganizations,
140
+ ],
141
+ },
142
+ ],
143
+ params: {
144
+ type: 'object',
145
+ properties: {
146
+ serviceId: { type: 'string' },
147
+ },
148
+ },
149
+ body: { $ref: 'modify-did-service#' },
150
+ response: {
151
+ 200: { $ref: 'did-service#' },
152
+ },
153
+ }),
154
+ },
155
+ async (req) =>
156
+ updateService(req.params.did, req.params.serviceId, req.body, req)
157
+ )
158
+ .delete(
159
+ '/:serviceId',
160
+ {
161
+ onRequest: fastify.verifyAccessToken([
162
+ RegistrarScopes.AdminOrganizations,
163
+ RegistrarScopes.WriteOrganizations,
164
+ ]),
165
+ preHandler: [verifyUserOrganizationWriteAuthorized],
166
+ schema: fastify.autoSchema({
167
+ security: [
168
+ {
169
+ RegistrarOAuth2: [
170
+ RegistrarScopes.WriteOrganizations,
171
+ RegistrarScopes.AdminOrganizations,
172
+ ],
173
+ },
174
+ ],
175
+ params: {
176
+ type: 'object',
177
+ properties: {
178
+ serviceId: { type: 'string' },
179
+ },
180
+ },
181
+ response: {
182
+ 204: {
183
+ type: 'null',
184
+ },
185
+ },
186
+ }),
187
+ },
188
+ async (req, reply) => {
189
+ await deleteService(req.params.did, req.params.serviceId, req);
190
+ return reply.status(204).send();
191
+ }
192
+ );
193
+ };
194
+
195
+ module.exports = servicesController;
@@ -0,0 +1,63 @@
1
+ const {
2
+ signatoryApproveOrganizationEmail,
3
+ approveReminder,
4
+ rejectReminder,
5
+ validateAuthCode,
6
+ } = require('../../../../entities');
7
+
8
+ const signatoriesController = async (fastify) => {
9
+ const { sendEmail } = fastify;
10
+
11
+ fastify.get(
12
+ '/response/:response',
13
+ {
14
+ schema: fastify.autoSchema({
15
+ params: {
16
+ type: 'object',
17
+ properties: {
18
+ did: {
19
+ type: 'string',
20
+ },
21
+ response: {
22
+ type: 'string',
23
+ enum: ['approve', 'reject'],
24
+ },
25
+ },
26
+ required: ['did', 'response'],
27
+ },
28
+ querystring: {
29
+ type: 'object',
30
+ properties: {
31
+ authCode: {
32
+ type: 'string',
33
+ },
34
+ },
35
+ required: ['authCode'],
36
+ },
37
+ response: {
38
+ 200: { type: 'null' },
39
+ 401: { $ref: 'error#' },
40
+ 400: { $ref: 'error#' },
41
+ },
42
+ }),
43
+ },
44
+ async (req) => {
45
+ const { repos, params, query } = req;
46
+ const { did, response } = params;
47
+ const { authCode } = query;
48
+ const organization = await repos.organizations.findOneByDid(did);
49
+ await validateAuthCode(organization, authCode, req);
50
+ await sendEmail(
51
+ signatoryApproveOrganizationEmail({ organization, response }, req)
52
+ );
53
+ if (response === 'approve') {
54
+ await approveReminder(organization, req);
55
+ } else {
56
+ await rejectReminder(organization, req);
57
+ }
58
+ return {};
59
+ }
60
+ );
61
+ };
62
+
63
+ module.exports = signatoriesController;
@@ -0,0 +1,65 @@
1
+ const {
2
+ didServiceSchema,
3
+ addressSchema,
4
+ locationSchema,
5
+ organizationProfileBaseSchema,
6
+ organizationProfileSchema,
7
+ modifyDidServiceSchema,
8
+ pageQuerySchema,
9
+ } = require('@verii/common-schemas');
10
+ const { CredentialTypesPlugin } = require('./plugins');
11
+ const {
12
+ createDidServiceSchema,
13
+ addKeyBodySchema,
14
+ organizationIdsSchema,
15
+ organizationRegistryServiceResponseSchema,
16
+ fullOrganizationSchema,
17
+ organizationProfileCreationSchema,
18
+ organizationKybProfileCreationSchema,
19
+ organizationProfileUpdateSchema,
20
+ organizationSearchQueryParamsSchema,
21
+ organizationSearchQueryProfileParamsSchema,
22
+ organizationProfileVerifiableCredentialSchema,
23
+ organizationVerifiedProfileSchema,
24
+ didKeySchema,
25
+ organizationServiceSchema,
26
+ } = require('./schemas');
27
+ const {
28
+ publicKeySchema,
29
+ didProofSchema,
30
+ didDocSchema,
31
+ } = require('../resolve-did/schemas');
32
+
33
+ module.exports = async (fastify) => {
34
+ fastify
35
+ .addSchema(pageQuerySchema)
36
+ .addSchema(publicKeySchema)
37
+ .addSchema(didProofSchema)
38
+ .addSchema(didServiceSchema)
39
+ .addSchema(fullOrganizationSchema)
40
+ .addSchema(organizationServiceSchema)
41
+ .addSchema(organizationRegistryServiceResponseSchema)
42
+ .addSchema(addressSchema)
43
+ .addSchema(locationSchema)
44
+ .addSchema(organizationProfileBaseSchema)
45
+ .addSchema(organizationProfileCreationSchema)
46
+ .addSchema(organizationKybProfileCreationSchema)
47
+ .addSchema(organizationProfileUpdateSchema)
48
+ .addSchema(organizationProfileSchema)
49
+ .addSchema(didDocSchema)
50
+ .addSchema(organizationSearchQueryParamsSchema)
51
+ .addSchema(organizationSearchQueryProfileParamsSchema)
52
+ .addSchema(organizationProfileVerifiableCredentialSchema)
53
+ .addSchema(organizationVerifiedProfileSchema)
54
+ .addSchema(addKeyBodySchema)
55
+ .addSchema(organizationIdsSchema)
56
+ .addSchema(createDidServiceSchema)
57
+ .addSchema(modifyDidServiceSchema)
58
+ .addSchema(didKeySchema)
59
+ .autoSchemaPreset({ tags: ['registrar_organizations'] })
60
+ .register(CredentialTypesPlugin)
61
+ .register(
62
+ // eslint-disable-next-line import/no-dynamic-require
63
+ require(fastify.config.kmsPluginModule)[fastify.config.kmsPlugin]
64
+ );
65
+ };
@@ -0,0 +1,322 @@
1
+ const {
2
+ find,
3
+ first,
4
+ flatMap,
5
+ intersection,
6
+ map,
7
+ mapKeys,
8
+ omit,
9
+ castArray,
10
+ without,
11
+ } = require('lodash/fp');
12
+ const newError = require('http-errors');
13
+ const { prepCamelCase } = require('@verii/common-functions');
14
+ const {
15
+ buildDidDocWithAlternativeId,
16
+ getDidAndAliases,
17
+ } = require('@verii/did-doc');
18
+ const { isWebDid } = require('@verii/did-web');
19
+ const {
20
+ verifyUserOrganizationWriteAuthorized,
21
+ verifyUserOrganizationReadAuthorized,
22
+ } = require('../../plugins/authorization');
23
+ const {
24
+ buildProfileResponse,
25
+ initPrepareProfileVc,
26
+ initTransformOrganizationFilter,
27
+ getServiceTypesFromCategories,
28
+ transformProfileService,
29
+ OrganizationErrorMessages,
30
+ RegistrarScopes,
31
+ normalizeProfileName,
32
+ loadCaoServiceRefs,
33
+ buildPublicProfile,
34
+ synchronizeMonitors,
35
+ validateProfileName,
36
+ validateUpdateProfile,
37
+ } = require('../../entities');
38
+
39
+ const custodiedFinder = (existingFinder) => ({
40
+ ...existingFinder,
41
+ filter: {
42
+ ...existingFinder.filter,
43
+ didNotCustodied: { $ne: true },
44
+ },
45
+ });
46
+
47
+ const organizationController = async (fastify) => {
48
+ const prepareProfileVc = initPrepareProfileVc(fastify);
49
+
50
+ fastify
51
+ .get(
52
+ '/search-profiles',
53
+ {
54
+ preHandler: (req, reply, done) => {
55
+ // eslint-disable-next-line better-mutation/no-mutation
56
+ req.query = prepCamelCase(req.query);
57
+ done();
58
+ },
59
+ schema: fastify.autoSchema({
60
+ querystring: { $ref: 'organization-search-profile-query-params#' },
61
+ response: {
62
+ 200: {
63
+ type: 'object',
64
+ properties: {
65
+ result: {
66
+ type: 'array',
67
+ items: {
68
+ allOf: [
69
+ { $ref: 'organization-profile#' },
70
+ {
71
+ type: 'object',
72
+ properties: {
73
+ service: {
74
+ type: 'array',
75
+ items: { $ref: 'did-service#' },
76
+ },
77
+ },
78
+ },
79
+ ],
80
+ },
81
+ },
82
+ },
83
+ },
84
+ },
85
+ }),
86
+ },
87
+ async (req) => {
88
+ const { repos, query } = req;
89
+ const serviceTypes = getServiceTypesFromCategories(query);
90
+
91
+ let organizations = await repos.organizations.searchByAggregation(
92
+ query
93
+ );
94
+
95
+ organizations = map(
96
+ (org) => organizationWithAlternativeDidDoc(org, req),
97
+ organizations
98
+ );
99
+
100
+ const caoServiceRefs = query.noServiceEndpointTransform
101
+ ? {}
102
+ : await loadAllOrgCaoServiceRefs(organizations, req);
103
+ const result = map(
104
+ (organization) => ({
105
+ id: organization.didDoc.id,
106
+ alsoKnownAs: organization.didDoc.alsoKnownAs,
107
+ ...buildPublicProfile(organization.profile),
108
+ verifiableCredentialJwt: organization.verifiableCredentialJwt,
109
+ service: transformProfileService(
110
+ organization,
111
+ organization.services,
112
+ serviceTypes,
113
+ caoServiceRefs,
114
+ req
115
+ ),
116
+ }),
117
+ organizations
118
+ );
119
+ return { result };
120
+ }
121
+ )
122
+ .get(
123
+ '/',
124
+ {
125
+ onRequest: fastify.verifyAccessToken([
126
+ RegistrarScopes.ReadOrganizations,
127
+ RegistrarScopes.AdminOrganizations,
128
+ ]),
129
+ preHandler: [verifyUserOrganizationReadAuthorized],
130
+ schema: fastify.autoSchema({
131
+ security: [
132
+ {
133
+ RegistrarOAuth2: [
134
+ RegistrarScopes.ReadOrganizations,
135
+ RegistrarScopes.AdminOrganizations,
136
+ ],
137
+ },
138
+ ],
139
+ querystring: { $ref: 'organization-search-query-params#' },
140
+ response: {
141
+ 200: {
142
+ type: 'object',
143
+ properties: {
144
+ result: {
145
+ type: 'array',
146
+ items: { $ref: 'did-doc#' },
147
+ },
148
+ },
149
+ },
150
+ },
151
+ }),
152
+ },
153
+ async (req) => {
154
+ const { repos, query } = req;
155
+ const organizations = await repos.organizations.find(
156
+ custodiedFinder(initTransformOrganizationFilter(query)),
157
+ { didDoc: 1 }
158
+ );
159
+ return {
160
+ result: map('didDoc', organizations),
161
+ };
162
+ }
163
+ )
164
+ .put(
165
+ '/profile/:did',
166
+ {
167
+ onRequest: fastify.verifyAccessToken([
168
+ RegistrarScopes.AdminOrganizations,
169
+ RegistrarScopes.WriteOrganizations,
170
+ ]),
171
+ preHandler: [verifyUserOrganizationWriteAuthorized],
172
+ schema: fastify.autoSchema({
173
+ security: [
174
+ {
175
+ RegistrarOAuth2: [
176
+ RegistrarScopes.WriteOrganizations,
177
+ RegistrarScopes.AdminOrganizations,
178
+ ],
179
+ },
180
+ ],
181
+ body: {
182
+ $ref: 'organization-profile-update#',
183
+ },
184
+ response: {
185
+ 200: {
186
+ allOf: [
187
+ {
188
+ $ref: 'organization-profile#',
189
+ },
190
+ {
191
+ type: 'object',
192
+ properties: {
193
+ createdAt: {
194
+ type: 'string',
195
+ format: 'date-time',
196
+ },
197
+ updatedAt: {
198
+ type: 'string',
199
+ format: 'date-time',
200
+ },
201
+ },
202
+ required: ['updatedAt', 'createdAt'],
203
+ },
204
+ ],
205
+ },
206
+ 400: {
207
+ $ref: 'error#',
208
+ },
209
+ },
210
+ }),
211
+ },
212
+ async (req) => {
213
+ const { repos, params, body: profile } = req;
214
+ validateUpdateProfile(profile);
215
+ const organization = await repos.organizations.findOneByDid(
216
+ params.did,
217
+ {
218
+ _id: 1,
219
+ didDoc: 1,
220
+ profile: 1,
221
+ activatedServiceIds: 1,
222
+ verifiableCredentialJwt: 1,
223
+ adminEmail: 1,
224
+ normalizedProfileName: 1,
225
+ ids: 1,
226
+ createdAt: 1,
227
+ updatedAt: 1,
228
+ }
229
+ );
230
+
231
+ if (organization == null) {
232
+ throw newError.NotFound(
233
+ OrganizationErrorMessages.ORGANIZATION_NOT_FOUND
234
+ );
235
+ }
236
+
237
+ await validateProfileName(profile.name, organization, req);
238
+
239
+ const modifiedProfile = {
240
+ ...omit(['createdAt'], profile),
241
+ permittedVelocityServiceCategory:
242
+ organization.profile.permittedVelocityServiceCategory,
243
+ };
244
+
245
+ const { jwtVc, credentialId, vcUrl } = await prepareProfileVc(
246
+ organization.didDoc,
247
+ { ...organization.profile, ...modifiedProfile }
248
+ );
249
+
250
+ const prefixedModification = mapKeys(
251
+ (k) => `profile.${k}`,
252
+ modifiedProfile
253
+ );
254
+
255
+ const updatedOrganization = await repos.organizations.update(
256
+ organization._id,
257
+ {
258
+ ...prefixedModification,
259
+ normalizedProfileName: normalizeProfileName(profile.name),
260
+ signedProfileVcJwt: { signedCredential: jwtVc, credentialId },
261
+ verifiableCredentialJwt: vcUrl,
262
+ }
263
+ );
264
+ if (organization.profile.logo !== profile.logo) {
265
+ await repos.images.activate(profile.logo);
266
+ await repos.images.deactivate(organization.profile.logo);
267
+ }
268
+ return buildProfileResponse(updatedOrganization, true);
269
+ }
270
+ )
271
+ .post(
272
+ '/monitoring/sync',
273
+ {
274
+ onRequest: fastify.verifyAccessToken([
275
+ RegistrarScopes.AdminOrganizations,
276
+ ]),
277
+ schema: fastify.autoSchema({
278
+ security: [
279
+ {
280
+ RegistrarOAuth2: [RegistrarScopes.AdminOrganizations],
281
+ },
282
+ ],
283
+ body: { type: 'object' },
284
+ response: {
285
+ 204: { type: 'null' },
286
+ },
287
+ }),
288
+ },
289
+ async (req, reply) => {
290
+ reply.code(204);
291
+ return synchronizeMonitors(req);
292
+ }
293
+ );
294
+ };
295
+
296
+ const organizationWithAlternativeDidDoc = (org, context) => {
297
+ const did = selectDid(context.query?.filter?.did, org.didDoc);
298
+ return {
299
+ ...org,
300
+ didDoc: buildDidDocWithAlternativeId(did, org.didDoc),
301
+ };
302
+ };
303
+
304
+ const selectDid = (didFromQuery, didDoc) => {
305
+ const didsFromQuery = castArray(didFromQuery);
306
+ const didsFromDidDoc = getDidAndAliases(didDoc);
307
+ const matchingDids = intersection(didsFromQuery, didsFromDidDoc);
308
+ const matchingDidWeb = find(isWebDid, matchingDids);
309
+ if (matchingDidWeb != null) {
310
+ return matchingDidWeb;
311
+ }
312
+ const aliases = without([didDoc.id], didsFromDidDoc);
313
+ const firstAlias = first(aliases);
314
+ return firstAlias ?? didDoc.id;
315
+ };
316
+
317
+ const loadAllOrgCaoServiceRefs = async (organizationDocs, context) => {
318
+ const allOrgsServices = flatMap('services', organizationDocs);
319
+ return loadCaoServiceRefs(allOrgsServices, context);
320
+ };
321
+
322
+ module.exports = organizationController;