@contember/engine-tenant-api 2.0.0-alpha.32 → 2.0.0-alpha.35

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 (730) hide show
  1. package/dist/development/src/TenantContainer.cjs.map +1 -1
  2. package/dist/development/src/TenantContainer.js.map +1 -1
  3. package/dist/development/src/bridges/system/IdentityFetcher.cjs.map +1 -1
  4. package/dist/development/src/bridges/system/IdentityFetcher.js.map +1 -1
  5. package/dist/development/src/exceptions.cjs.map +1 -1
  6. package/dist/development/src/exceptions.js.map +1 -1
  7. package/dist/development/src/migrations/runner.cjs.map +1 -1
  8. package/dist/development/src/migrations/runner.js.map +1 -1
  9. package/dist/development/src/migrations/tenantCredentials.cjs.map +1 -1
  10. package/dist/development/src/migrations/tenantCredentials.js.map +1 -1
  11. package/dist/development/src/model/authorization/AclSchemaAccessNodeFactory.cjs.map +1 -1
  12. package/dist/development/src/model/authorization/AclSchemaAccessNodeFactory.js.map +1 -1
  13. package/dist/development/src/model/authorization/DirectPermissionsAccessNode.cjs.map +1 -1
  14. package/dist/development/src/model/authorization/DirectPermissionsAccessNode.js.map +1 -1
  15. package/dist/development/src/model/authorization/Identity.cjs.map +1 -1
  16. package/dist/development/src/model/authorization/Identity.js.map +1 -1
  17. package/dist/development/src/model/authorization/IdentityFactory.cjs.map +1 -1
  18. package/dist/development/src/model/authorization/IdentityFactory.js.map +1 -1
  19. package/dist/development/src/model/authorization/IdentityScope.cjs.map +1 -1
  20. package/dist/development/src/model/authorization/IdentityScope.js.map +1 -1
  21. package/dist/development/src/model/authorization/MembershipMatcher.cjs.map +1 -1
  22. package/dist/development/src/model/authorization/MembershipMatcher.js.map +1 -1
  23. package/dist/development/src/model/authorization/PermissionActions.cjs.map +1 -1
  24. package/dist/development/src/model/authorization/PermissionActions.js.map +1 -1
  25. package/dist/development/src/model/authorization/PermissionContext.cjs.map +1 -1
  26. package/dist/development/src/model/authorization/PermissionContext.js.map +1 -1
  27. package/dist/development/src/model/authorization/PermissionContextFactory.cjs.map +1 -1
  28. package/dist/development/src/model/authorization/PermissionContextFactory.js.map +1 -1
  29. package/dist/development/src/model/authorization/PermissionsFactory.cjs.map +1 -1
  30. package/dist/development/src/model/authorization/PermissionsFactory.js.map +1 -1
  31. package/dist/development/src/model/authorization/ProjectScope.cjs.map +1 -1
  32. package/dist/development/src/model/authorization/ProjectScope.js.map +1 -1
  33. package/dist/development/src/model/authorization/ProjectScopeFactory.cjs.map +1 -1
  34. package/dist/development/src/model/authorization/ProjectScopeFactory.js.map +1 -1
  35. package/dist/development/src/model/commands/CommandBus.cjs.map +1 -1
  36. package/dist/development/src/model/commands/CommandBus.js.map +1 -1
  37. package/dist/development/src/model/commands/apiKey/ApiKeyHelper.cjs.map +1 -1
  38. package/dist/development/src/model/commands/apiKey/ApiKeyHelper.js.map +1 -1
  39. package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.cjs.map +1 -1
  40. package/dist/development/src/model/commands/apiKey/CreateApiKeyCommand.js.map +1 -1
  41. package/dist/development/src/model/commands/apiKey/DisableApiKeyCommand.cjs.map +1 -1
  42. package/dist/development/src/model/commands/apiKey/DisableApiKeyCommand.js.map +1 -1
  43. package/dist/development/src/model/commands/apiKey/DisableIdentityApiKeysCommand.cjs.map +1 -1
  44. package/dist/development/src/model/commands/apiKey/DisableIdentityApiKeysCommand.js.map +1 -1
  45. package/dist/development/src/model/commands/apiKey/DisableOneOffApiKeyCommand.cjs.map +1 -1
  46. package/dist/development/src/model/commands/apiKey/DisableOneOffApiKeyCommand.js.map +1 -1
  47. package/dist/development/src/model/commands/apiKey/ProlongApiKeyCommand.cjs.map +1 -1
  48. package/dist/development/src/model/commands/apiKey/ProlongApiKeyCommand.js.map +1 -1
  49. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.cjs.map +1 -1
  50. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.js.map +1 -1
  51. package/dist/development/src/model/commands/identity/CreateIdentityCommand.cjs.map +1 -1
  52. package/dist/development/src/model/commands/identity/CreateIdentityCommand.js.map +1 -1
  53. package/dist/development/src/model/commands/identity/PatchIdentityGlobalRoles.cjs.map +1 -1
  54. package/dist/development/src/model/commands/identity/PatchIdentityGlobalRoles.js.map +1 -1
  55. package/dist/development/src/model/commands/idp/CreateIdpCommand.cjs.map +1 -1
  56. package/dist/development/src/model/commands/idp/CreateIdpCommand.js.map +1 -1
  57. package/dist/development/src/model/commands/idp/DisableIdpCommand.cjs.map +1 -1
  58. package/dist/development/src/model/commands/idp/DisableIdpCommand.js.map +1 -1
  59. package/dist/development/src/model/commands/idp/EnableIdpCommand.cjs.map +1 -1
  60. package/dist/development/src/model/commands/idp/EnableIdpCommand.js.map +1 -1
  61. package/dist/development/src/model/commands/idp/UpdateIdpCommand.cjs.map +1 -1
  62. package/dist/development/src/model/commands/idp/UpdateIdpCommand.js.map +1 -1
  63. package/dist/development/src/model/commands/mailTemplate/AddMailTemplateCommand.cjs.map +1 -1
  64. package/dist/development/src/model/commands/mailTemplate/AddMailTemplateCommand.js.map +1 -1
  65. package/dist/development/src/model/commands/mailTemplate/RemoveMailTemplateCommand.cjs.map +1 -1
  66. package/dist/development/src/model/commands/mailTemplate/RemoveMailTemplateCommand.js.map +1 -1
  67. package/dist/development/src/model/commands/membership/AddProjectMemberCommand.cjs.map +1 -1
  68. package/dist/development/src/model/commands/membership/AddProjectMemberCommand.js.map +1 -1
  69. package/dist/development/src/model/commands/membership/CreateOrUpdateProjectMembershipCommand.cjs.map +1 -1
  70. package/dist/development/src/model/commands/membership/CreateOrUpdateProjectMembershipCommand.js.map +1 -1
  71. package/dist/development/src/model/commands/membership/RemoveProjectMemberCommand.cjs.map +1 -1
  72. package/dist/development/src/model/commands/membership/RemoveProjectMemberCommand.js.map +1 -1
  73. package/dist/development/src/model/commands/membership/RemoveProjectMembershipsCommand.cjs.map +1 -1
  74. package/dist/development/src/model/commands/membership/RemoveProjectMembershipsCommand.js.map +1 -1
  75. package/dist/development/src/model/commands/membership/UpdateProjectMemberCommand.cjs.map +1 -1
  76. package/dist/development/src/model/commands/membership/UpdateProjectMemberCommand.js.map +1 -1
  77. package/dist/development/src/model/commands/membership/variables/PatchProjectMembershipVariableValuesCommand.cjs.map +1 -1
  78. package/dist/development/src/model/commands/membership/variables/PatchProjectMembershipVariableValuesCommand.js.map +1 -1
  79. package/dist/development/src/model/commands/membership/variables/PatchProjectMembershipVariablesCommand.cjs.map +1 -1
  80. package/dist/development/src/model/commands/membership/variables/PatchProjectMembershipVariablesCommand.js.map +1 -1
  81. package/dist/development/src/model/commands/membership/variables/SetProjectMembershipVariableValuesCommand.cjs.map +1 -1
  82. package/dist/development/src/model/commands/membership/variables/SetProjectMembershipVariableValuesCommand.js.map +1 -1
  83. package/dist/development/src/model/commands/otp/ConfirmOtpCommand.cjs.map +1 -1
  84. package/dist/development/src/model/commands/otp/ConfirmOtpCommand.js.map +1 -1
  85. package/dist/development/src/model/commands/otp/DisableOtpCommand.cjs.map +1 -1
  86. package/dist/development/src/model/commands/otp/DisableOtpCommand.js.map +1 -1
  87. package/dist/development/src/model/commands/otp/PrepareOtpCommand.cjs.map +1 -1
  88. package/dist/development/src/model/commands/otp/PrepareOtpCommand.js.map +1 -1
  89. package/dist/development/src/model/commands/person/ChangePasswordCommand.cjs.map +1 -1
  90. package/dist/development/src/model/commands/person/ChangePasswordCommand.js.map +1 -1
  91. package/dist/development/src/model/commands/person/ChangeProfileCommand.cjs.map +1 -1
  92. package/dist/development/src/model/commands/person/ChangeProfileCommand.js.map +1 -1
  93. package/dist/development/src/model/commands/person/CreatePersonCommand.cjs.map +1 -1
  94. package/dist/development/src/model/commands/person/CreatePersonCommand.js.map +1 -1
  95. package/dist/development/src/model/commands/person/CreatePersonIdentityProviderIdentifierCommand.cjs.map +1 -1
  96. package/dist/development/src/model/commands/person/CreatePersonIdentityProviderIdentifierCommand.js.map +1 -1
  97. package/dist/development/src/model/commands/person/DisablePersonCommand.cjs.map +1 -1
  98. package/dist/development/src/model/commands/person/DisablePersonCommand.js.map +1 -1
  99. package/dist/development/src/model/commands/person/TogglePersonPasswordlessCommand.cjs.map +1 -1
  100. package/dist/development/src/model/commands/person/TogglePersonPasswordlessCommand.js.map +1 -1
  101. package/dist/development/src/model/commands/personToken/ActivateOtpCommand.cjs.map +1 -1
  102. package/dist/development/src/model/commands/personToken/ActivateOtpCommand.js.map +1 -1
  103. package/dist/development/src/model/commands/personToken/CreatePersonTokenCommand.cjs.map +1 -1
  104. package/dist/development/src/model/commands/personToken/CreatePersonTokenCommand.js.map +1 -1
  105. package/dist/development/src/model/commands/personToken/IncreaseOtpAttemptCommand.cjs.map +1 -1
  106. package/dist/development/src/model/commands/personToken/IncreaseOtpAttemptCommand.js.map +1 -1
  107. package/dist/development/src/model/commands/personToken/InvalidateTokenCommand.cjs.map +1 -1
  108. package/dist/development/src/model/commands/personToken/InvalidateTokenCommand.js.map +1 -1
  109. package/dist/development/src/model/commands/personToken/ResetPasswordCommand.cjs.map +1 -1
  110. package/dist/development/src/model/commands/personToken/ResetPasswordCommand.js.map +1 -1
  111. package/dist/development/src/model/commands/personToken/SavePersonTokenCommand.cjs.map +1 -1
  112. package/dist/development/src/model/commands/personToken/SavePersonTokenCommand.js.map +1 -1
  113. package/dist/development/src/model/commands/project/CreateProjectCommand.cjs.map +1 -1
  114. package/dist/development/src/model/commands/project/CreateProjectCommand.js.map +1 -1
  115. package/dist/development/src/model/commands/project/SetProjectSecretCommand.cjs.map +1 -1
  116. package/dist/development/src/model/commands/project/SetProjectSecretCommand.js.map +1 -1
  117. package/dist/development/src/model/commands/project/UpdateProjectCommand.cjs.map +1 -1
  118. package/dist/development/src/model/commands/project/UpdateProjectCommand.js.map +1 -1
  119. package/dist/development/src/model/dtos/Password.cjs.map +1 -1
  120. package/dist/development/src/model/dtos/Password.js.map +1 -1
  121. package/dist/development/src/model/mailing/UserMailer.cjs.map +1 -1
  122. package/dist/development/src/model/mailing/UserMailer.js.map +1 -1
  123. package/dist/development/src/model/mailing/templates/ExistingUserInvited.mustache.cjs.map +1 -1
  124. package/dist/development/src/model/mailing/templates/ExistingUserInvited.mustache.js.map +1 -1
  125. package/dist/development/src/model/mailing/templates/NewUserInvited.mustache.cjs.map +1 -1
  126. package/dist/development/src/model/mailing/templates/NewUserInvited.mustache.js.map +1 -1
  127. package/dist/development/src/model/mailing/templates/PasswordReset.mustache.cjs.map +1 -1
  128. package/dist/development/src/model/mailing/templates/PasswordReset.mustache.js.map +1 -1
  129. package/dist/development/src/model/mailing/templates/PasswordlessSignIn.mustache.cjs.map +1 -1
  130. package/dist/development/src/model/mailing/templates/PasswordlessSignIn.mustache.js.map +1 -1
  131. package/dist/development/src/model/mailing/type.cjs.map +1 -1
  132. package/dist/development/src/model/mailing/type.js.map +1 -1
  133. package/dist/development/src/model/queries/apiKey/ApiKeyQuery.cjs.map +1 -1
  134. package/dist/development/src/model/queries/apiKey/ApiKeyQuery.js.map +1 -1
  135. package/dist/development/src/model/queries/configuration/ConfigurationQuery.cjs.map +1 -1
  136. package/dist/development/src/model/queries/configuration/ConfigurationQuery.js.map +1 -1
  137. package/dist/development/src/model/queries/identity/IdentityQuery.cjs.map +1 -1
  138. package/dist/development/src/model/queries/identity/IdentityQuery.js.map +1 -1
  139. package/dist/development/src/model/queries/idp/IdentityProviderBySlugQuery.cjs.map +1 -1
  140. package/dist/development/src/model/queries/idp/IdentityProviderBySlugQuery.js.map +1 -1
  141. package/dist/development/src/model/queries/idp/IdentityProvidersQuery.cjs.map +1 -1
  142. package/dist/development/src/model/queries/idp/IdentityProvidersQuery.js.map +1 -1
  143. package/dist/development/src/model/queries/idp/helpers.cjs.map +1 -1
  144. package/dist/development/src/model/queries/idp/helpers.js.map +1 -1
  145. package/dist/development/src/model/queries/mailTemplate/MailTemplateListQuery.cjs.map +1 -1
  146. package/dist/development/src/model/queries/mailTemplate/MailTemplateListQuery.js.map +1 -1
  147. package/dist/development/src/model/queries/mailTemplate/MailTemplateQuery.cjs.map +1 -1
  148. package/dist/development/src/model/queries/mailTemplate/MailTemplateQuery.js.map +1 -1
  149. package/dist/development/src/model/queries/membership/ProjectMembersQuery.cjs.map +1 -1
  150. package/dist/development/src/model/queries/membership/ProjectMembersQuery.js.map +1 -1
  151. package/dist/development/src/model/queries/membership/ProjectMembershipByIdentityQuery.cjs.map +1 -1
  152. package/dist/development/src/model/queries/membership/ProjectMembershipByIdentityQuery.js.map +1 -1
  153. package/dist/development/src/model/queries/membership/ProjectRolesByIdentityQuery.cjs.map +1 -1
  154. package/dist/development/src/model/queries/membership/ProjectRolesByIdentityQuery.js.map +1 -1
  155. package/dist/development/src/model/queries/membership/ProjectSlugSpecification.cjs.map +1 -1
  156. package/dist/development/src/model/queries/membership/ProjectSlugSpecification.js.map +1 -1
  157. package/dist/development/src/model/queries/person/PersonByIdPQuery.cjs.map +1 -1
  158. package/dist/development/src/model/queries/person/PersonByIdPQuery.js.map +1 -1
  159. package/dist/development/src/model/queries/person/PersonByIdentityBatchQuery.cjs.map +1 -1
  160. package/dist/development/src/model/queries/person/PersonByIdentityBatchQuery.js.map +1 -1
  161. package/dist/development/src/model/queries/person/PersonQuery.cjs.map +1 -1
  162. package/dist/development/src/model/queries/person/PersonQuery.js.map +1 -1
  163. package/dist/development/src/model/queries/person/PersonQueryBuilderFactory.cjs.map +1 -1
  164. package/dist/development/src/model/queries/person/PersonQueryBuilderFactory.js.map +1 -1
  165. package/dist/development/src/model/queries/personToken/PersonTokenQuery.cjs.map +1 -1
  166. package/dist/development/src/model/queries/personToken/PersonTokenQuery.js.map +1 -1
  167. package/dist/development/src/model/queries/project/ProjectBySlugQuery.cjs.map +1 -1
  168. package/dist/development/src/model/queries/project/ProjectBySlugQuery.js.map +1 -1
  169. package/dist/development/src/model/queries/project/ProjectSecretsQuery.cjs.map +1 -1
  170. package/dist/development/src/model/queries/project/ProjectSecretsQuery.js.map +1 -1
  171. package/dist/development/src/model/queries/project/ProjectUpdateTimestampQuery.cjs.map +1 -1
  172. package/dist/development/src/model/queries/project/ProjectUpdateTimestampQuery.js.map +1 -1
  173. package/dist/development/src/model/queries/project/ProjectsByIdentityQuery.cjs.map +1 -1
  174. package/dist/development/src/model/queries/project/ProjectsByIdentityQuery.js.map +1 -1
  175. package/dist/development/src/model/queries/project/ProjectsQuery.cjs.map +1 -1
  176. package/dist/development/src/model/queries/project/ProjectsQuery.js.map +1 -1
  177. package/dist/development/src/model/service/ConfigurationManager.cjs.map +1 -1
  178. package/dist/development/src/model/service/ConfigurationManager.js.map +1 -1
  179. package/dist/development/src/model/service/EmailValidator.cjs.map +1 -1
  180. package/dist/development/src/model/service/EmailValidator.js.map +1 -1
  181. package/dist/development/src/model/service/IDPSignInManager.cjs.map +1 -1
  182. package/dist/development/src/model/service/IDPSignInManager.js.map +1 -1
  183. package/dist/development/src/model/service/InviteManager.cjs.map +1 -1
  184. package/dist/development/src/model/service/InviteManager.js.map +1 -1
  185. package/dist/development/src/model/service/MailTemplateManager.cjs.map +1 -1
  186. package/dist/development/src/model/service/MailTemplateManager.js.map +1 -1
  187. package/dist/development/src/model/service/MembershipValidator.cjs.map +1 -1
  188. package/dist/development/src/model/service/MembershipValidator.js.map +1 -1
  189. package/dist/development/src/model/service/OtpAuthenticator.cjs.map +1 -1
  190. package/dist/development/src/model/service/OtpAuthenticator.js.map +1 -1
  191. package/dist/development/src/model/service/OtpManager.cjs.map +1 -1
  192. package/dist/development/src/model/service/OtpManager.js.map +1 -1
  193. package/dist/development/src/model/service/PasswordChangeManager.cjs.map +1 -1
  194. package/dist/development/src/model/service/PasswordChangeManager.js.map +1 -1
  195. package/dist/development/src/model/service/PasswordResetManager.cjs.map +1 -1
  196. package/dist/development/src/model/service/PasswordResetManager.js.map +1 -1
  197. package/dist/development/src/model/service/PasswordlessSignInManager.cjs.map +1 -1
  198. package/dist/development/src/model/service/PasswordlessSignInManager.js.map +1 -1
  199. package/dist/development/src/model/service/PersonAccessManager.cjs.map +1 -1
  200. package/dist/development/src/model/service/PersonAccessManager.js.map +1 -1
  201. package/dist/development/src/model/service/PersonManager.cjs.map +1 -1
  202. package/dist/development/src/model/service/PersonManager.js.map +1 -1
  203. package/dist/development/src/model/service/ProjectManager.cjs.map +1 -1
  204. package/dist/development/src/model/service/ProjectManager.js.map +1 -1
  205. package/dist/development/src/model/service/ProjectMemberManager.cjs.map +1 -1
  206. package/dist/development/src/model/service/ProjectMemberManager.js.map +1 -1
  207. package/dist/development/src/model/service/RolesManager.cjs.map +1 -1
  208. package/dist/development/src/model/service/RolesManager.js.map +1 -1
  209. package/dist/development/src/model/service/SecretsManager.cjs.map +1 -1
  210. package/dist/development/src/model/service/SecretsManager.js.map +1 -1
  211. package/dist/development/src/model/service/SignInManager.cjs.map +1 -1
  212. package/dist/development/src/model/service/SignInManager.js.map +1 -1
  213. package/dist/development/src/model/service/SignUpManager.cjs.map +1 -1
  214. package/dist/development/src/model/service/SignUpManager.js.map +1 -1
  215. package/dist/development/src/model/service/apiKey/ApiKeyManager.cjs.map +1 -1
  216. package/dist/development/src/model/service/apiKey/ApiKeyManager.js.map +1 -1
  217. package/dist/development/src/model/service/apiKey/ApiKeyService.cjs.map +1 -1
  218. package/dist/development/src/model/service/apiKey/ApiKeyService.js.map +1 -1
  219. package/dist/development/src/model/service/helpers/getPreferredProject.cjs.map +1 -1
  220. package/dist/development/src/model/service/helpers/getPreferredProject.js.map +1 -1
  221. package/dist/development/src/model/service/idp/IDPHandlerRegistry.cjs.map +1 -1
  222. package/dist/development/src/model/service/idp/IDPHandlerRegistry.js.map +1 -1
  223. package/dist/development/src/model/service/idp/IDPManager.cjs.map +1 -1
  224. package/dist/development/src/model/service/idp/IDPManager.js.map +1 -1
  225. package/dist/development/src/model/service/idp/IDPResponseError.cjs.map +1 -1
  226. package/dist/development/src/model/service/idp/IDPResponseError.js.map +1 -1
  227. package/dist/development/src/model/service/idp/IDPValidationError.cjs.map +1 -1
  228. package/dist/development/src/model/service/idp/IDPValidationError.js.map +1 -1
  229. package/dist/development/src/model/service/idp/IdentityProviderNotFoundError.cjs.map +1 -1
  230. package/dist/development/src/model/service/idp/IdentityProviderNotFoundError.js.map +1 -1
  231. package/dist/development/src/model/service/idp/InvalidIDPConfigurationError.cjs.map +1 -1
  232. package/dist/development/src/model/service/idp/InvalidIDPConfigurationError.js.map +1 -1
  233. package/dist/development/src/model/service/idp/providers/AppleProvider.cjs.map +1 -1
  234. package/dist/development/src/model/service/idp/providers/AppleProvider.js.map +1 -1
  235. package/dist/development/src/model/service/idp/providers/FacebookProvider.cjs.map +1 -1
  236. package/dist/development/src/model/service/idp/providers/FacebookProvider.js.map +1 -1
  237. package/dist/development/src/model/service/idp/providers/OIDCHelpers.cjs.map +1 -1
  238. package/dist/development/src/model/service/idp/providers/OIDCHelpers.js.map +1 -1
  239. package/dist/development/src/model/service/idp/providers/OIDCProvider.cjs.map +1 -1
  240. package/dist/development/src/model/service/idp/providers/OIDCProvider.js.map +1 -1
  241. package/dist/development/src/model/service/idp/providers/OIDCTypes.cjs.map +1 -1
  242. package/dist/development/src/model/service/idp/providers/OIDCTypes.js.map +1 -1
  243. package/dist/development/src/model/service/idp/providers/helpers.cjs.map +1 -1
  244. package/dist/development/src/model/service/idp/providers/helpers.js.map +1 -1
  245. package/dist/development/src/model/service/membershipUtils.cjs.map +1 -1
  246. package/dist/development/src/model/service/membershipUtils.js.map +1 -1
  247. package/dist/development/src/model/type/ApiKey.cjs.map +1 -1
  248. package/dist/development/src/model/type/ApiKey.js.map +1 -1
  249. package/dist/development/src/model/utils/DatabaseContext.cjs.map +1 -1
  250. package/dist/development/src/model/utils/DatabaseContext.js.map +1 -1
  251. package/dist/development/src/model/utils/Response.cjs.map +1 -1
  252. package/dist/development/src/model/utils/Response.js.map +1 -1
  253. package/dist/development/src/model/utils/password.cjs.map +1 -1
  254. package/dist/development/src/model/utils/password.js.map +1 -1
  255. package/dist/development/src/model/utils/tokenUtils.cjs.map +1 -1
  256. package/dist/development/src/model/utils/tokenUtils.js.map +1 -1
  257. package/dist/development/src/resolvers/ResolverFactory.cjs.map +1 -1
  258. package/dist/development/src/resolvers/ResolverFactory.js.map +1 -1
  259. package/dist/development/src/resolvers/TenantResolverContextFactory.cjs.map +1 -1
  260. package/dist/development/src/resolvers/TenantResolverContextFactory.js.map +1 -1
  261. package/dist/development/src/resolvers/errorUtils.cjs.map +1 -1
  262. package/dist/development/src/resolvers/errorUtils.js.map +1 -1
  263. package/dist/development/src/resolvers/membershipUtils.cjs.map +1 -1
  264. package/dist/development/src/resolvers/membershipUtils.js.map +1 -1
  265. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs.map +1 -1
  266. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js.map +1 -1
  267. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs.map +1 -1
  268. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js.map +1 -1
  269. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs.map +1 -1
  270. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js.map +1 -1
  271. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs.map +1 -1
  272. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js.map +1 -1
  273. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs.map +1 -1
  274. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.js.map +1 -1
  275. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs.map +1 -1
  276. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.js.map +1 -1
  277. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs.map +1 -1
  278. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.js.map +1 -1
  279. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs.map +1 -1
  280. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js.map +1 -1
  281. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs.map +1 -1
  282. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js.map +1 -1
  283. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs.map +1 -1
  284. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.js.map +1 -1
  285. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs.map +1 -1
  286. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.js.map +1 -1
  287. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs.map +1 -1
  288. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.js.map +1 -1
  289. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.cjs.map +1 -1
  290. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.js.map +1 -1
  291. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.cjs.map +1 -1
  292. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.js.map +1 -1
  293. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.cjs.map +1 -1
  294. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.js.map +1 -1
  295. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs.map +1 -1
  296. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.js.map +1 -1
  297. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs.map +1 -1
  298. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.js.map +1 -1
  299. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.cjs.map +1 -1
  300. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.js.map +1 -1
  301. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.cjs.map +1 -1
  302. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.js.map +1 -1
  303. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.cjs.map +1 -1
  304. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.js.map +1 -1
  305. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs.map +1 -1
  306. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js.map +1 -1
  307. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs.map +1 -1
  308. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.js.map +1 -1
  309. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs.map +1 -1
  310. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js.map +1 -1
  311. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs.map +1 -1
  312. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.js.map +1 -1
  313. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs.map +1 -1
  314. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js.map +1 -1
  315. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs.map +1 -1
  316. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js.map +1 -1
  317. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs.map +1 -1
  318. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js.map +1 -1
  319. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.cjs.map +1 -1
  320. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.js.map +1 -1
  321. package/dist/development/src/resolvers/query/IDPQueryResolver.cjs.map +1 -1
  322. package/dist/development/src/resolvers/query/IDPQueryResolver.js.map +1 -1
  323. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.cjs.map +1 -1
  324. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.js.map +1 -1
  325. package/dist/development/src/resolvers/query/MeQueryResolver.cjs.map +1 -1
  326. package/dist/development/src/resolvers/query/MeQueryResolver.js.map +1 -1
  327. package/dist/development/src/resolvers/query/PersonQueryResolver.cjs.map +1 -1
  328. package/dist/development/src/resolvers/query/PersonQueryResolver.js.map +1 -1
  329. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.cjs.map +1 -1
  330. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.js.map +1 -1
  331. package/dist/development/src/resolvers/query/ProjectQueryResolver.cjs.map +1 -1
  332. package/dist/development/src/resolvers/query/ProjectQueryResolver.js.map +1 -1
  333. package/dist/development/src/resolvers/responseHelpers/PersonResponseFactory.cjs.map +1 -1
  334. package/dist/development/src/resolvers/responseHelpers/PersonResponseFactory.js.map +1 -1
  335. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.cjs.map +1 -1
  336. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.js.map +1 -1
  337. package/dist/development/src/resolvers/types/IdentityTypeResolver.cjs.map +1 -1
  338. package/dist/development/src/resolvers/types/IdentityTypeResolver.js.map +1 -1
  339. package/dist/development/src/resolvers/types/ProjectTypeResolver.cjs.map +1 -1
  340. package/dist/development/src/resolvers/types/ProjectTypeResolver.js.map +1 -1
  341. package/dist/development/src/schema/tenant.graphql.cjs.map +1 -1
  342. package/dist/development/src/utils/Mailer.cjs.map +1 -1
  343. package/dist/development/src/utils/Mailer.js.map +1 -1
  344. package/dist/development/src/utils/TemplateRenderer.cjs.map +1 -1
  345. package/dist/development/src/utils/TemplateRenderer.js.map +1 -1
  346. package/dist/development/src/utils/array.cjs.map +1 -1
  347. package/dist/development/src/utils/array.js.map +1 -1
  348. package/dist/development/src/utils/batchQuery.cjs.map +1 -1
  349. package/dist/development/src/utils/batchQuery.js.map +1 -1
  350. package/dist/production/src/TenantContainer.cjs.map +1 -1
  351. package/dist/production/src/TenantContainer.js.map +1 -1
  352. package/dist/production/src/bridges/system/IdentityFetcher.cjs.map +1 -1
  353. package/dist/production/src/bridges/system/IdentityFetcher.js.map +1 -1
  354. package/dist/production/src/exceptions.cjs.map +1 -1
  355. package/dist/production/src/exceptions.js.map +1 -1
  356. package/dist/production/src/migrations/runner.cjs.map +1 -1
  357. package/dist/production/src/migrations/runner.js.map +1 -1
  358. package/dist/production/src/migrations/tenantCredentials.cjs.map +1 -1
  359. package/dist/production/src/migrations/tenantCredentials.js.map +1 -1
  360. package/dist/production/src/model/authorization/AclSchemaAccessNodeFactory.cjs.map +1 -1
  361. package/dist/production/src/model/authorization/AclSchemaAccessNodeFactory.js.map +1 -1
  362. package/dist/production/src/model/authorization/DirectPermissionsAccessNode.cjs.map +1 -1
  363. package/dist/production/src/model/authorization/DirectPermissionsAccessNode.js.map +1 -1
  364. package/dist/production/src/model/authorization/Identity.cjs.map +1 -1
  365. package/dist/production/src/model/authorization/Identity.js.map +1 -1
  366. package/dist/production/src/model/authorization/IdentityFactory.cjs.map +1 -1
  367. package/dist/production/src/model/authorization/IdentityFactory.js.map +1 -1
  368. package/dist/production/src/model/authorization/IdentityScope.cjs.map +1 -1
  369. package/dist/production/src/model/authorization/IdentityScope.js.map +1 -1
  370. package/dist/production/src/model/authorization/MembershipMatcher.cjs.map +1 -1
  371. package/dist/production/src/model/authorization/MembershipMatcher.js.map +1 -1
  372. package/dist/production/src/model/authorization/PermissionActions.cjs.map +1 -1
  373. package/dist/production/src/model/authorization/PermissionActions.js.map +1 -1
  374. package/dist/production/src/model/authorization/PermissionContext.cjs.map +1 -1
  375. package/dist/production/src/model/authorization/PermissionContext.js.map +1 -1
  376. package/dist/production/src/model/authorization/PermissionContextFactory.cjs.map +1 -1
  377. package/dist/production/src/model/authorization/PermissionContextFactory.js.map +1 -1
  378. package/dist/production/src/model/authorization/PermissionsFactory.cjs.map +1 -1
  379. package/dist/production/src/model/authorization/PermissionsFactory.js.map +1 -1
  380. package/dist/production/src/model/authorization/ProjectScope.cjs.map +1 -1
  381. package/dist/production/src/model/authorization/ProjectScope.js.map +1 -1
  382. package/dist/production/src/model/authorization/ProjectScopeFactory.cjs.map +1 -1
  383. package/dist/production/src/model/authorization/ProjectScopeFactory.js.map +1 -1
  384. package/dist/production/src/model/commands/CommandBus.cjs.map +1 -1
  385. package/dist/production/src/model/commands/CommandBus.js.map +1 -1
  386. package/dist/production/src/model/commands/apiKey/ApiKeyHelper.cjs.map +1 -1
  387. package/dist/production/src/model/commands/apiKey/ApiKeyHelper.js.map +1 -1
  388. package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.cjs.map +1 -1
  389. package/dist/production/src/model/commands/apiKey/CreateApiKeyCommand.js.map +1 -1
  390. package/dist/production/src/model/commands/apiKey/DisableApiKeyCommand.cjs.map +1 -1
  391. package/dist/production/src/model/commands/apiKey/DisableApiKeyCommand.js.map +1 -1
  392. package/dist/production/src/model/commands/apiKey/DisableIdentityApiKeysCommand.cjs.map +1 -1
  393. package/dist/production/src/model/commands/apiKey/DisableIdentityApiKeysCommand.js.map +1 -1
  394. package/dist/production/src/model/commands/apiKey/DisableOneOffApiKeyCommand.cjs.map +1 -1
  395. package/dist/production/src/model/commands/apiKey/DisableOneOffApiKeyCommand.js.map +1 -1
  396. package/dist/production/src/model/commands/apiKey/ProlongApiKeyCommand.cjs.map +1 -1
  397. package/dist/production/src/model/commands/apiKey/ProlongApiKeyCommand.js.map +1 -1
  398. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.cjs.map +1 -1
  399. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.js.map +1 -1
  400. package/dist/production/src/model/commands/identity/CreateIdentityCommand.cjs.map +1 -1
  401. package/dist/production/src/model/commands/identity/CreateIdentityCommand.js.map +1 -1
  402. package/dist/production/src/model/commands/identity/PatchIdentityGlobalRoles.cjs.map +1 -1
  403. package/dist/production/src/model/commands/identity/PatchIdentityGlobalRoles.js.map +1 -1
  404. package/dist/production/src/model/commands/idp/CreateIdpCommand.cjs.map +1 -1
  405. package/dist/production/src/model/commands/idp/CreateIdpCommand.js.map +1 -1
  406. package/dist/production/src/model/commands/idp/DisableIdpCommand.cjs.map +1 -1
  407. package/dist/production/src/model/commands/idp/DisableIdpCommand.js.map +1 -1
  408. package/dist/production/src/model/commands/idp/EnableIdpCommand.cjs.map +1 -1
  409. package/dist/production/src/model/commands/idp/EnableIdpCommand.js.map +1 -1
  410. package/dist/production/src/model/commands/idp/UpdateIdpCommand.cjs.map +1 -1
  411. package/dist/production/src/model/commands/idp/UpdateIdpCommand.js.map +1 -1
  412. package/dist/production/src/model/commands/mailTemplate/AddMailTemplateCommand.cjs.map +1 -1
  413. package/dist/production/src/model/commands/mailTemplate/AddMailTemplateCommand.js.map +1 -1
  414. package/dist/production/src/model/commands/mailTemplate/RemoveMailTemplateCommand.cjs.map +1 -1
  415. package/dist/production/src/model/commands/mailTemplate/RemoveMailTemplateCommand.js.map +1 -1
  416. package/dist/production/src/model/commands/membership/AddProjectMemberCommand.cjs.map +1 -1
  417. package/dist/production/src/model/commands/membership/AddProjectMemberCommand.js.map +1 -1
  418. package/dist/production/src/model/commands/membership/CreateOrUpdateProjectMembershipCommand.cjs.map +1 -1
  419. package/dist/production/src/model/commands/membership/CreateOrUpdateProjectMembershipCommand.js.map +1 -1
  420. package/dist/production/src/model/commands/membership/RemoveProjectMemberCommand.cjs.map +1 -1
  421. package/dist/production/src/model/commands/membership/RemoveProjectMemberCommand.js.map +1 -1
  422. package/dist/production/src/model/commands/membership/RemoveProjectMembershipsCommand.cjs.map +1 -1
  423. package/dist/production/src/model/commands/membership/RemoveProjectMembershipsCommand.js.map +1 -1
  424. package/dist/production/src/model/commands/membership/UpdateProjectMemberCommand.cjs.map +1 -1
  425. package/dist/production/src/model/commands/membership/UpdateProjectMemberCommand.js.map +1 -1
  426. package/dist/production/src/model/commands/membership/variables/PatchProjectMembershipVariableValuesCommand.cjs.map +1 -1
  427. package/dist/production/src/model/commands/membership/variables/PatchProjectMembershipVariableValuesCommand.js.map +1 -1
  428. package/dist/production/src/model/commands/membership/variables/PatchProjectMembershipVariablesCommand.cjs.map +1 -1
  429. package/dist/production/src/model/commands/membership/variables/PatchProjectMembershipVariablesCommand.js.map +1 -1
  430. package/dist/production/src/model/commands/membership/variables/SetProjectMembershipVariableValuesCommand.cjs.map +1 -1
  431. package/dist/production/src/model/commands/membership/variables/SetProjectMembershipVariableValuesCommand.js.map +1 -1
  432. package/dist/production/src/model/commands/otp/ConfirmOtpCommand.cjs.map +1 -1
  433. package/dist/production/src/model/commands/otp/ConfirmOtpCommand.js.map +1 -1
  434. package/dist/production/src/model/commands/otp/DisableOtpCommand.cjs.map +1 -1
  435. package/dist/production/src/model/commands/otp/DisableOtpCommand.js.map +1 -1
  436. package/dist/production/src/model/commands/otp/PrepareOtpCommand.cjs.map +1 -1
  437. package/dist/production/src/model/commands/otp/PrepareOtpCommand.js.map +1 -1
  438. package/dist/production/src/model/commands/person/ChangePasswordCommand.cjs.map +1 -1
  439. package/dist/production/src/model/commands/person/ChangePasswordCommand.js.map +1 -1
  440. package/dist/production/src/model/commands/person/ChangeProfileCommand.cjs.map +1 -1
  441. package/dist/production/src/model/commands/person/ChangeProfileCommand.js.map +1 -1
  442. package/dist/production/src/model/commands/person/CreatePersonCommand.cjs.map +1 -1
  443. package/dist/production/src/model/commands/person/CreatePersonCommand.js.map +1 -1
  444. package/dist/production/src/model/commands/person/CreatePersonIdentityProviderIdentifierCommand.cjs.map +1 -1
  445. package/dist/production/src/model/commands/person/CreatePersonIdentityProviderIdentifierCommand.js.map +1 -1
  446. package/dist/production/src/model/commands/person/DisablePersonCommand.cjs.map +1 -1
  447. package/dist/production/src/model/commands/person/DisablePersonCommand.js.map +1 -1
  448. package/dist/production/src/model/commands/person/TogglePersonPasswordlessCommand.cjs.map +1 -1
  449. package/dist/production/src/model/commands/person/TogglePersonPasswordlessCommand.js.map +1 -1
  450. package/dist/production/src/model/commands/personToken/ActivateOtpCommand.cjs.map +1 -1
  451. package/dist/production/src/model/commands/personToken/ActivateOtpCommand.js.map +1 -1
  452. package/dist/production/src/model/commands/personToken/CreatePersonTokenCommand.cjs.map +1 -1
  453. package/dist/production/src/model/commands/personToken/CreatePersonTokenCommand.js.map +1 -1
  454. package/dist/production/src/model/commands/personToken/IncreaseOtpAttemptCommand.cjs.map +1 -1
  455. package/dist/production/src/model/commands/personToken/IncreaseOtpAttemptCommand.js.map +1 -1
  456. package/dist/production/src/model/commands/personToken/InvalidateTokenCommand.cjs.map +1 -1
  457. package/dist/production/src/model/commands/personToken/InvalidateTokenCommand.js.map +1 -1
  458. package/dist/production/src/model/commands/personToken/ResetPasswordCommand.cjs.map +1 -1
  459. package/dist/production/src/model/commands/personToken/ResetPasswordCommand.js.map +1 -1
  460. package/dist/production/src/model/commands/personToken/SavePersonTokenCommand.cjs.map +1 -1
  461. package/dist/production/src/model/commands/personToken/SavePersonTokenCommand.js.map +1 -1
  462. package/dist/production/src/model/commands/project/CreateProjectCommand.cjs.map +1 -1
  463. package/dist/production/src/model/commands/project/CreateProjectCommand.js.map +1 -1
  464. package/dist/production/src/model/commands/project/SetProjectSecretCommand.cjs.map +1 -1
  465. package/dist/production/src/model/commands/project/SetProjectSecretCommand.js.map +1 -1
  466. package/dist/production/src/model/commands/project/UpdateProjectCommand.cjs.map +1 -1
  467. package/dist/production/src/model/commands/project/UpdateProjectCommand.js.map +1 -1
  468. package/dist/production/src/model/dtos/Password.cjs.map +1 -1
  469. package/dist/production/src/model/dtos/Password.js.map +1 -1
  470. package/dist/production/src/model/mailing/UserMailer.cjs.map +1 -1
  471. package/dist/production/src/model/mailing/UserMailer.js.map +1 -1
  472. package/dist/production/src/model/mailing/templates/ExistingUserInvited.mustache.cjs.map +1 -1
  473. package/dist/production/src/model/mailing/templates/ExistingUserInvited.mustache.js.map +1 -1
  474. package/dist/production/src/model/mailing/templates/NewUserInvited.mustache.cjs.map +1 -1
  475. package/dist/production/src/model/mailing/templates/NewUserInvited.mustache.js.map +1 -1
  476. package/dist/production/src/model/mailing/templates/PasswordReset.mustache.cjs.map +1 -1
  477. package/dist/production/src/model/mailing/templates/PasswordReset.mustache.js.map +1 -1
  478. package/dist/production/src/model/mailing/templates/PasswordlessSignIn.mustache.cjs.map +1 -1
  479. package/dist/production/src/model/mailing/templates/PasswordlessSignIn.mustache.js.map +1 -1
  480. package/dist/production/src/model/mailing/type.cjs.map +1 -1
  481. package/dist/production/src/model/mailing/type.js.map +1 -1
  482. package/dist/production/src/model/queries/apiKey/ApiKeyQuery.cjs.map +1 -1
  483. package/dist/production/src/model/queries/apiKey/ApiKeyQuery.js.map +1 -1
  484. package/dist/production/src/model/queries/configuration/ConfigurationQuery.cjs.map +1 -1
  485. package/dist/production/src/model/queries/configuration/ConfigurationQuery.js.map +1 -1
  486. package/dist/production/src/model/queries/identity/IdentityQuery.cjs.map +1 -1
  487. package/dist/production/src/model/queries/identity/IdentityQuery.js.map +1 -1
  488. package/dist/production/src/model/queries/idp/IdentityProviderBySlugQuery.cjs.map +1 -1
  489. package/dist/production/src/model/queries/idp/IdentityProviderBySlugQuery.js.map +1 -1
  490. package/dist/production/src/model/queries/idp/IdentityProvidersQuery.cjs.map +1 -1
  491. package/dist/production/src/model/queries/idp/IdentityProvidersQuery.js.map +1 -1
  492. package/dist/production/src/model/queries/idp/helpers.cjs.map +1 -1
  493. package/dist/production/src/model/queries/idp/helpers.js.map +1 -1
  494. package/dist/production/src/model/queries/mailTemplate/MailTemplateListQuery.cjs.map +1 -1
  495. package/dist/production/src/model/queries/mailTemplate/MailTemplateListQuery.js.map +1 -1
  496. package/dist/production/src/model/queries/mailTemplate/MailTemplateQuery.cjs.map +1 -1
  497. package/dist/production/src/model/queries/mailTemplate/MailTemplateQuery.js.map +1 -1
  498. package/dist/production/src/model/queries/membership/ProjectMembersQuery.cjs.map +1 -1
  499. package/dist/production/src/model/queries/membership/ProjectMembersQuery.js.map +1 -1
  500. package/dist/production/src/model/queries/membership/ProjectMembershipByIdentityQuery.cjs.map +1 -1
  501. package/dist/production/src/model/queries/membership/ProjectMembershipByIdentityQuery.js.map +1 -1
  502. package/dist/production/src/model/queries/membership/ProjectRolesByIdentityQuery.cjs.map +1 -1
  503. package/dist/production/src/model/queries/membership/ProjectRolesByIdentityQuery.js.map +1 -1
  504. package/dist/production/src/model/queries/membership/ProjectSlugSpecification.cjs.map +1 -1
  505. package/dist/production/src/model/queries/membership/ProjectSlugSpecification.js.map +1 -1
  506. package/dist/production/src/model/queries/person/PersonByIdPQuery.cjs.map +1 -1
  507. package/dist/production/src/model/queries/person/PersonByIdPQuery.js.map +1 -1
  508. package/dist/production/src/model/queries/person/PersonByIdentityBatchQuery.cjs.map +1 -1
  509. package/dist/production/src/model/queries/person/PersonByIdentityBatchQuery.js.map +1 -1
  510. package/dist/production/src/model/queries/person/PersonQuery.cjs.map +1 -1
  511. package/dist/production/src/model/queries/person/PersonQuery.js.map +1 -1
  512. package/dist/production/src/model/queries/person/PersonQueryBuilderFactory.cjs.map +1 -1
  513. package/dist/production/src/model/queries/person/PersonQueryBuilderFactory.js.map +1 -1
  514. package/dist/production/src/model/queries/personToken/PersonTokenQuery.cjs.map +1 -1
  515. package/dist/production/src/model/queries/personToken/PersonTokenQuery.js.map +1 -1
  516. package/dist/production/src/model/queries/project/ProjectBySlugQuery.cjs.map +1 -1
  517. package/dist/production/src/model/queries/project/ProjectBySlugQuery.js.map +1 -1
  518. package/dist/production/src/model/queries/project/ProjectSecretsQuery.cjs.map +1 -1
  519. package/dist/production/src/model/queries/project/ProjectSecretsQuery.js.map +1 -1
  520. package/dist/production/src/model/queries/project/ProjectUpdateTimestampQuery.cjs.map +1 -1
  521. package/dist/production/src/model/queries/project/ProjectUpdateTimestampQuery.js.map +1 -1
  522. package/dist/production/src/model/queries/project/ProjectsByIdentityQuery.cjs.map +1 -1
  523. package/dist/production/src/model/queries/project/ProjectsByIdentityQuery.js.map +1 -1
  524. package/dist/production/src/model/queries/project/ProjectsQuery.cjs.map +1 -1
  525. package/dist/production/src/model/queries/project/ProjectsQuery.js.map +1 -1
  526. package/dist/production/src/model/service/ConfigurationManager.cjs.map +1 -1
  527. package/dist/production/src/model/service/ConfigurationManager.js.map +1 -1
  528. package/dist/production/src/model/service/EmailValidator.cjs.map +1 -1
  529. package/dist/production/src/model/service/EmailValidator.js.map +1 -1
  530. package/dist/production/src/model/service/IDPSignInManager.cjs.map +1 -1
  531. package/dist/production/src/model/service/IDPSignInManager.js.map +1 -1
  532. package/dist/production/src/model/service/InviteManager.cjs.map +1 -1
  533. package/dist/production/src/model/service/InviteManager.js.map +1 -1
  534. package/dist/production/src/model/service/MailTemplateManager.cjs.map +1 -1
  535. package/dist/production/src/model/service/MailTemplateManager.js.map +1 -1
  536. package/dist/production/src/model/service/MembershipValidator.cjs.map +1 -1
  537. package/dist/production/src/model/service/MembershipValidator.js.map +1 -1
  538. package/dist/production/src/model/service/OtpAuthenticator.cjs.map +1 -1
  539. package/dist/production/src/model/service/OtpAuthenticator.js.map +1 -1
  540. package/dist/production/src/model/service/OtpManager.cjs.map +1 -1
  541. package/dist/production/src/model/service/OtpManager.js.map +1 -1
  542. package/dist/production/src/model/service/PasswordChangeManager.cjs.map +1 -1
  543. package/dist/production/src/model/service/PasswordChangeManager.js.map +1 -1
  544. package/dist/production/src/model/service/PasswordResetManager.cjs.map +1 -1
  545. package/dist/production/src/model/service/PasswordResetManager.js.map +1 -1
  546. package/dist/production/src/model/service/PasswordlessSignInManager.cjs.map +1 -1
  547. package/dist/production/src/model/service/PasswordlessSignInManager.js.map +1 -1
  548. package/dist/production/src/model/service/PersonAccessManager.cjs.map +1 -1
  549. package/dist/production/src/model/service/PersonAccessManager.js.map +1 -1
  550. package/dist/production/src/model/service/PersonManager.cjs.map +1 -1
  551. package/dist/production/src/model/service/PersonManager.js.map +1 -1
  552. package/dist/production/src/model/service/ProjectManager.cjs.map +1 -1
  553. package/dist/production/src/model/service/ProjectManager.js.map +1 -1
  554. package/dist/production/src/model/service/ProjectMemberManager.cjs.map +1 -1
  555. package/dist/production/src/model/service/ProjectMemberManager.js.map +1 -1
  556. package/dist/production/src/model/service/RolesManager.cjs.map +1 -1
  557. package/dist/production/src/model/service/RolesManager.js.map +1 -1
  558. package/dist/production/src/model/service/SecretsManager.cjs.map +1 -1
  559. package/dist/production/src/model/service/SecretsManager.js.map +1 -1
  560. package/dist/production/src/model/service/SignInManager.cjs.map +1 -1
  561. package/dist/production/src/model/service/SignInManager.js.map +1 -1
  562. package/dist/production/src/model/service/SignUpManager.cjs.map +1 -1
  563. package/dist/production/src/model/service/SignUpManager.js.map +1 -1
  564. package/dist/production/src/model/service/apiKey/ApiKeyManager.cjs.map +1 -1
  565. package/dist/production/src/model/service/apiKey/ApiKeyManager.js.map +1 -1
  566. package/dist/production/src/model/service/apiKey/ApiKeyService.cjs.map +1 -1
  567. package/dist/production/src/model/service/apiKey/ApiKeyService.js.map +1 -1
  568. package/dist/production/src/model/service/helpers/getPreferredProject.cjs.map +1 -1
  569. package/dist/production/src/model/service/helpers/getPreferredProject.js.map +1 -1
  570. package/dist/production/src/model/service/idp/IDPHandlerRegistry.cjs.map +1 -1
  571. package/dist/production/src/model/service/idp/IDPHandlerRegistry.js.map +1 -1
  572. package/dist/production/src/model/service/idp/IDPManager.cjs.map +1 -1
  573. package/dist/production/src/model/service/idp/IDPManager.js.map +1 -1
  574. package/dist/production/src/model/service/idp/IDPResponseError.cjs.map +1 -1
  575. package/dist/production/src/model/service/idp/IDPResponseError.js.map +1 -1
  576. package/dist/production/src/model/service/idp/IDPValidationError.cjs.map +1 -1
  577. package/dist/production/src/model/service/idp/IDPValidationError.js.map +1 -1
  578. package/dist/production/src/model/service/idp/IdentityProviderNotFoundError.cjs.map +1 -1
  579. package/dist/production/src/model/service/idp/IdentityProviderNotFoundError.js.map +1 -1
  580. package/dist/production/src/model/service/idp/InvalidIDPConfigurationError.cjs.map +1 -1
  581. package/dist/production/src/model/service/idp/InvalidIDPConfigurationError.js.map +1 -1
  582. package/dist/production/src/model/service/idp/providers/AppleProvider.cjs.map +1 -1
  583. package/dist/production/src/model/service/idp/providers/AppleProvider.js.map +1 -1
  584. package/dist/production/src/model/service/idp/providers/FacebookProvider.cjs.map +1 -1
  585. package/dist/production/src/model/service/idp/providers/FacebookProvider.js.map +1 -1
  586. package/dist/production/src/model/service/idp/providers/OIDCHelpers.cjs.map +1 -1
  587. package/dist/production/src/model/service/idp/providers/OIDCHelpers.js.map +1 -1
  588. package/dist/production/src/model/service/idp/providers/OIDCProvider.cjs.map +1 -1
  589. package/dist/production/src/model/service/idp/providers/OIDCProvider.js.map +1 -1
  590. package/dist/production/src/model/service/idp/providers/OIDCTypes.cjs.map +1 -1
  591. package/dist/production/src/model/service/idp/providers/OIDCTypes.js.map +1 -1
  592. package/dist/production/src/model/service/idp/providers/helpers.cjs.map +1 -1
  593. package/dist/production/src/model/service/idp/providers/helpers.js.map +1 -1
  594. package/dist/production/src/model/service/membershipUtils.cjs.map +1 -1
  595. package/dist/production/src/model/service/membershipUtils.js.map +1 -1
  596. package/dist/production/src/model/type/ApiKey.cjs.map +1 -1
  597. package/dist/production/src/model/type/ApiKey.js.map +1 -1
  598. package/dist/production/src/model/utils/DatabaseContext.cjs.map +1 -1
  599. package/dist/production/src/model/utils/DatabaseContext.js.map +1 -1
  600. package/dist/production/src/model/utils/Response.cjs.map +1 -1
  601. package/dist/production/src/model/utils/Response.js.map +1 -1
  602. package/dist/production/src/model/utils/password.cjs.map +1 -1
  603. package/dist/production/src/model/utils/password.js.map +1 -1
  604. package/dist/production/src/model/utils/tokenUtils.cjs.map +1 -1
  605. package/dist/production/src/model/utils/tokenUtils.js.map +1 -1
  606. package/dist/production/src/resolvers/ResolverFactory.cjs.map +1 -1
  607. package/dist/production/src/resolvers/ResolverFactory.js.map +1 -1
  608. package/dist/production/src/resolvers/TenantResolverContextFactory.cjs.map +1 -1
  609. package/dist/production/src/resolvers/TenantResolverContextFactory.js.map +1 -1
  610. package/dist/production/src/resolvers/errorUtils.cjs.map +1 -1
  611. package/dist/production/src/resolvers/errorUtils.js.map +1 -1
  612. package/dist/production/src/resolvers/membershipUtils.cjs.map +1 -1
  613. package/dist/production/src/resolvers/membershipUtils.js.map +1 -1
  614. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs.map +1 -1
  615. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js.map +1 -1
  616. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs.map +1 -1
  617. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js.map +1 -1
  618. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs.map +1 -1
  619. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js.map +1 -1
  620. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs.map +1 -1
  621. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js.map +1 -1
  622. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs.map +1 -1
  623. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.js.map +1 -1
  624. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs.map +1 -1
  625. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.js.map +1 -1
  626. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs.map +1 -1
  627. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.js.map +1 -1
  628. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs.map +1 -1
  629. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js.map +1 -1
  630. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs.map +1 -1
  631. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js.map +1 -1
  632. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs.map +1 -1
  633. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.js.map +1 -1
  634. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs.map +1 -1
  635. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.js.map +1 -1
  636. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs.map +1 -1
  637. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.js.map +1 -1
  638. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.cjs.map +1 -1
  639. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.js.map +1 -1
  640. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.cjs.map +1 -1
  641. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.js.map +1 -1
  642. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.cjs.map +1 -1
  643. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.js.map +1 -1
  644. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs.map +1 -1
  645. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.js.map +1 -1
  646. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs.map +1 -1
  647. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.js.map +1 -1
  648. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.cjs.map +1 -1
  649. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.js.map +1 -1
  650. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.cjs.map +1 -1
  651. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.js.map +1 -1
  652. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.cjs.map +1 -1
  653. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.js.map +1 -1
  654. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs.map +1 -1
  655. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js.map +1 -1
  656. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs.map +1 -1
  657. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.js.map +1 -1
  658. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs.map +1 -1
  659. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js.map +1 -1
  660. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs.map +1 -1
  661. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.js.map +1 -1
  662. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs.map +1 -1
  663. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js.map +1 -1
  664. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs.map +1 -1
  665. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js.map +1 -1
  666. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs.map +1 -1
  667. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js.map +1 -1
  668. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.cjs.map +1 -1
  669. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.js.map +1 -1
  670. package/dist/production/src/resolvers/query/IDPQueryResolver.cjs.map +1 -1
  671. package/dist/production/src/resolvers/query/IDPQueryResolver.js.map +1 -1
  672. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.cjs.map +1 -1
  673. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.js.map +1 -1
  674. package/dist/production/src/resolvers/query/MeQueryResolver.cjs.map +1 -1
  675. package/dist/production/src/resolvers/query/MeQueryResolver.js.map +1 -1
  676. package/dist/production/src/resolvers/query/PersonQueryResolver.cjs.map +1 -1
  677. package/dist/production/src/resolvers/query/PersonQueryResolver.js.map +1 -1
  678. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.cjs.map +1 -1
  679. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.js.map +1 -1
  680. package/dist/production/src/resolvers/query/ProjectQueryResolver.cjs.map +1 -1
  681. package/dist/production/src/resolvers/query/ProjectQueryResolver.js.map +1 -1
  682. package/dist/production/src/resolvers/responseHelpers/PersonResponseFactory.cjs.map +1 -1
  683. package/dist/production/src/resolvers/responseHelpers/PersonResponseFactory.js.map +1 -1
  684. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.cjs.map +1 -1
  685. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.js.map +1 -1
  686. package/dist/production/src/resolvers/types/IdentityTypeResolver.cjs.map +1 -1
  687. package/dist/production/src/resolvers/types/IdentityTypeResolver.js.map +1 -1
  688. package/dist/production/src/resolvers/types/ProjectTypeResolver.cjs.map +1 -1
  689. package/dist/production/src/resolvers/types/ProjectTypeResolver.js.map +1 -1
  690. package/dist/production/src/schema/tenant.graphql.cjs.map +1 -1
  691. package/dist/production/src/utils/Mailer.cjs.map +1 -1
  692. package/dist/production/src/utils/Mailer.js.map +1 -1
  693. package/dist/production/src/utils/TemplateRenderer.cjs.map +1 -1
  694. package/dist/production/src/utils/TemplateRenderer.js.map +1 -1
  695. package/dist/production/src/utils/array.cjs.map +1 -1
  696. package/dist/production/src/utils/array.js.map +1 -1
  697. package/dist/production/src/utils/batchQuery.cjs.map +1 -1
  698. package/dist/production/src/utils/batchQuery.js.map +1 -1
  699. package/dist/tests/src/mailer.d.ts.map +1 -1
  700. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  701. package/dist/types/tsconfig.tsbuildinfo +1 -1
  702. package/package.json +13 -13
  703. package/src/model/service/OtpAuthenticator.ts +1 -1
  704. package/tests/cases/integration/mocked/addProjectMemberMutation.test.ts +1 -1
  705. package/tests/cases/integration/mocked/changeMyPasswordMutation.test.ts +2 -2
  706. package/tests/cases/integration/mocked/changeMyProfileMutation.test.ts +2 -2
  707. package/tests/cases/integration/mocked/changePasswordMutation.test.ts +1 -1
  708. package/tests/cases/integration/mocked/changeProfileMutation.test.ts +2 -2
  709. package/tests/cases/integration/mocked/confirmOtpMutation.test.ts +1 -1
  710. package/tests/cases/integration/mocked/createApiKeyMutation.test.ts +1 -1
  711. package/tests/cases/integration/mocked/createSessionKeyMutation.test.ts +1 -1
  712. package/tests/cases/integration/mocked/disableApiKeyMutation.ts +1 -1
  713. package/tests/cases/integration/mocked/inviteMutations.test.ts +1 -1
  714. package/tests/cases/integration/mocked/listProjectMembersQuery.test.ts +1 -1
  715. package/tests/cases/integration/mocked/personByIdQuery.test.ts +1 -1
  716. package/tests/cases/integration/mocked/prepareOtpMutation.test.ts +3 -3
  717. package/tests/cases/integration/mocked/removeProjectMemberMutation.test.ts +1 -1
  718. package/tests/cases/integration/mocked/signInIdpMutation.test.ts +1 -1
  719. package/tests/cases/integration/mocked/signInMutation.test.ts +1 -1
  720. package/tests/cases/integration/mocked/signOutMutation.test.ts +1 -1
  721. package/tests/cases/integration/mocked/signUpMutation.test.ts +1 -1
  722. package/tests/cases/integration/mocked/updateProjectMemberMutation.test.ts +1 -1
  723. package/tests/cases/migrations/2020-06-08-134000-tenant-credentials.test.ts +5 -3
  724. package/tests/cases/unit/authorization/membershipAwareAccessNode.test.ts +9 -9
  725. package/tests/cases/unit/authorization/membershipMatcher.test.ts +10 -10
  726. package/tests/src/mailer.ts +3 -4
  727. package/tests/src/testGraphql.ts +2 -2
  728. package/dist/tests/src/testTenantDb.d.ts +0 -31
  729. package/dist/tests/src/testTenantDb.d.ts.map +0 -1
  730. package/tests/src/testTenantDb.ts +0 -202
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordChangeManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordChangeManager.ts"],"sourcesContent":["import { ChangeMyPasswordErrorCode, ChangePasswordErrorCode } from '../../schema'\nimport { ChangePasswordCommand } from '../commands'\nimport { getPasswordWeaknessMessage } from '../utils/password'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { PersonRow } from '../queries'\nimport { Providers } from '../providers'\nimport { DatabaseContext } from '../utils'\n\nclass PasswordChangeManager {\n\tconstructor(\n\t\tprivate readonly providers: Providers,\n\t) {}\n\n\tasync changePassword(dbContext: DatabaseContext, personId: string, password: string): Promise<PasswordChangeManager.PasswordChangeResponse<ChangePasswordErrorCode>> {\n\t\tconst weakPassword = getPasswordWeaknessMessage(password)\n\t\tif (weakPassword) {\n\t\t\treturn new ResponseError('TOO_WEAK', weakPassword)\n\t\t}\n\t\tawait dbContext.commandBus.execute(new ChangePasswordCommand(personId, password))\n\t\treturn new ResponseOk(null)\n\t}\n\n\tasync changeMyPassword(dbContext: DatabaseContext, person: PersonRow, currentPassword: string, password: string): Promise<PasswordChangeManager.PasswordChangeResponse<ChangeMyPasswordErrorCode>> {\n\t\tconst weakPassword = getPasswordWeaknessMessage(password)\n\t\tif (weakPassword) {\n\t\t\treturn new ResponseError('TOO_WEAK', weakPassword)\n\t\t}\n\t\tif (!person.password_hash) {\n\t\t\treturn new ResponseError('NO_PASSWORD_SET', 'No password set')\n\t\t}\n\t\tif (!(await this.providers.bcryptCompare(currentPassword, person.password_hash))) {\n\t\t\treturn new ResponseError('INVALID_PASSWORD', 'Password does not match')\n\t\t}\n\n\t\tawait dbContext.commandBus.execute(new ChangePasswordCommand(person.id, password))\n\t\treturn new ResponseOk(null)\n\t}\n}\n\nnamespace PasswordChangeManager {\n\texport type PasswordChangeResponse<T extends ChangePasswordErrorCode | ChangeMyPasswordErrorCode> = Response<null, T>\n}\n\nexport { PasswordChangeManager }\n"],"names":["password","getPasswordWeaknessMessage","ResponseError","ChangePasswordCommand","ResponseOk"],"mappings":";;;;;;;;AAQA,MAAM,sBAAsB;AAAA,EAC3B,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EACf;AAAA,EAEH,MAAM,eAAe,WAA4B,UAAkBA,YAAkG;AAC9J,UAAA,eAAeC,oCAA2BD,UAAQ;AACxD,QAAI,cAAc;AACV,aAAA,IAAIE,SAAc,cAAA,YAAY,YAAY;AAAA,IAClD;AACA,UAAM,UAAU,WAAW,QAAQ,IAAIC,sBAAAA,sBAAsB,UAAUH,UAAQ,CAAC;AACzE,WAAA,IAAII,SAAAA,WAAW,IAAI;AAAA,EAC3B;AAAA,EAEA,MAAM,iBAAiB,WAA4B,QAAmB,iBAAyBJ,YAAoG;AAC5L,UAAA,eAAeC,oCAA2BD,UAAQ;AACxD,QAAI,cAAc;AACV,aAAA,IAAIE,SAAc,cAAA,YAAY,YAAY;AAAA,IAClD;AACI,QAAA,CAAC,OAAO,eAAe;AACnB,aAAA,IAAIA,SAAc,cAAA,mBAAmB,iBAAiB;AAAA,IAC9D;AACI,QAAA,CAAE,MAAM,KAAK,UAAU,cAAc,iBAAiB,OAAO,aAAa,GAAI;AAC1E,aAAA,IAAIA,SAAc,cAAA,oBAAoB,yBAAyB;AAAA,IACvE;AAEM,UAAA,UAAU,WAAW,QAAQ,IAAIC,4CAAsB,OAAO,IAAIH,UAAQ,CAAC;AAC1E,WAAA,IAAII,SAAAA,WAAW,IAAI;AAAA,EAC3B;AACD;;"}
1
+ {"version":3,"file":"PasswordChangeManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordChangeManager.ts"],"sourcesContent":["import { ChangeMyPasswordErrorCode, ChangePasswordErrorCode } from '../../schema'\nimport { ChangePasswordCommand } from '../commands'\nimport { getPasswordWeaknessMessage } from '../utils/password'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { PersonRow } from '../queries'\nimport { Providers } from '../providers'\nimport { DatabaseContext } from '../utils'\n\nclass PasswordChangeManager {\n\tconstructor(\n\t\tprivate readonly providers: Providers,\n\t) {}\n\n\tasync changePassword(dbContext: DatabaseContext, personId: string, password: string): Promise<PasswordChangeManager.PasswordChangeResponse<ChangePasswordErrorCode>> {\n\t\tconst weakPassword = getPasswordWeaknessMessage(password)\n\t\tif (weakPassword) {\n\t\t\treturn new ResponseError('TOO_WEAK', weakPassword)\n\t\t}\n\t\tawait dbContext.commandBus.execute(new ChangePasswordCommand(personId, password))\n\t\treturn new ResponseOk(null)\n\t}\n\n\tasync changeMyPassword(dbContext: DatabaseContext, person: PersonRow, currentPassword: string, password: string): Promise<PasswordChangeManager.PasswordChangeResponse<ChangeMyPasswordErrorCode>> {\n\t\tconst weakPassword = getPasswordWeaknessMessage(password)\n\t\tif (weakPassword) {\n\t\t\treturn new ResponseError('TOO_WEAK', weakPassword)\n\t\t}\n\t\tif (!person.password_hash) {\n\t\t\treturn new ResponseError('NO_PASSWORD_SET', 'No password set')\n\t\t}\n\t\tif (!(await this.providers.bcryptCompare(currentPassword, person.password_hash))) {\n\t\t\treturn new ResponseError('INVALID_PASSWORD', 'Password does not match')\n\t\t}\n\n\t\tawait dbContext.commandBus.execute(new ChangePasswordCommand(person.id, password))\n\t\treturn new ResponseOk(null)\n\t}\n}\n\nnamespace PasswordChangeManager {\n\texport type PasswordChangeResponse<T extends ChangePasswordErrorCode | ChangeMyPasswordErrorCode> = Response<null, T>\n}\n\nexport { PasswordChangeManager }\n"],"names":["password","getPasswordWeaknessMessage","ResponseError","ChangePasswordCommand","ResponseOk"],"mappings":";;;;;;;;AAQA,MAAM,sBAAsB;AAAA,EAC3B,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EAAA;AAAA,EAGlB,MAAM,eAAe,WAA4B,UAAkBA,YAAkG;AAC9J,UAAA,eAAeC,oCAA2BD,UAAQ;AACxD,QAAI,cAAc;AACV,aAAA,IAAIE,SAAAA,cAAc,YAAY,YAAY;AAAA,IAAA;AAElD,UAAM,UAAU,WAAW,QAAQ,IAAIC,sBAAAA,sBAAsB,UAAUH,UAAQ,CAAC;AACzE,WAAA,IAAII,oBAAW,IAAI;AAAA,EAAA;AAAA,EAG3B,MAAM,iBAAiB,WAA4B,QAAmB,iBAAyBJ,YAAoG;AAC5L,UAAA,eAAeC,oCAA2BD,UAAQ;AACxD,QAAI,cAAc;AACV,aAAA,IAAIE,SAAAA,cAAc,YAAY,YAAY;AAAA,IAAA;AAE9C,QAAA,CAAC,OAAO,eAAe;AACnB,aAAA,IAAIA,SAAAA,cAAc,mBAAmB,iBAAiB;AAAA,IAAA;AAE1D,QAAA,CAAE,MAAM,KAAK,UAAU,cAAc,iBAAiB,OAAO,aAAa,GAAI;AAC1E,aAAA,IAAIA,SAAAA,cAAc,oBAAoB,yBAAyB;AAAA,IAAA;AAGjE,UAAA,UAAU,WAAW,QAAQ,IAAIC,4CAAsB,OAAO,IAAIH,UAAQ,CAAC;AAC1E,WAAA,IAAII,oBAAW,IAAI;AAAA,EAAA;AAE5B;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordChangeManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordChangeManager.ts"],"sourcesContent":["import { ChangeMyPasswordErrorCode, ChangePasswordErrorCode } from '../../schema'\nimport { ChangePasswordCommand } from '../commands'\nimport { getPasswordWeaknessMessage } from '../utils/password'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { PersonRow } from '../queries'\nimport { Providers } from '../providers'\nimport { DatabaseContext } from '../utils'\n\nclass PasswordChangeManager {\n\tconstructor(\n\t\tprivate readonly providers: Providers,\n\t) {}\n\n\tasync changePassword(dbContext: DatabaseContext, personId: string, password: string): Promise<PasswordChangeManager.PasswordChangeResponse<ChangePasswordErrorCode>> {\n\t\tconst weakPassword = getPasswordWeaknessMessage(password)\n\t\tif (weakPassword) {\n\t\t\treturn new ResponseError('TOO_WEAK', weakPassword)\n\t\t}\n\t\tawait dbContext.commandBus.execute(new ChangePasswordCommand(personId, password))\n\t\treturn new ResponseOk(null)\n\t}\n\n\tasync changeMyPassword(dbContext: DatabaseContext, person: PersonRow, currentPassword: string, password: string): Promise<PasswordChangeManager.PasswordChangeResponse<ChangeMyPasswordErrorCode>> {\n\t\tconst weakPassword = getPasswordWeaknessMessage(password)\n\t\tif (weakPassword) {\n\t\t\treturn new ResponseError('TOO_WEAK', weakPassword)\n\t\t}\n\t\tif (!person.password_hash) {\n\t\t\treturn new ResponseError('NO_PASSWORD_SET', 'No password set')\n\t\t}\n\t\tif (!(await this.providers.bcryptCompare(currentPassword, person.password_hash))) {\n\t\t\treturn new ResponseError('INVALID_PASSWORD', 'Password does not match')\n\t\t}\n\n\t\tawait dbContext.commandBus.execute(new ChangePasswordCommand(person.id, password))\n\t\treturn new ResponseOk(null)\n\t}\n}\n\nnamespace PasswordChangeManager {\n\texport type PasswordChangeResponse<T extends ChangePasswordErrorCode | ChangeMyPasswordErrorCode> = Response<null, T>\n}\n\nexport { PasswordChangeManager }\n"],"names":[],"mappings":";;;;;;AAQA,MAAM,sBAAsB;AAAA,EAC3B,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EACf;AAAA,EAEH,MAAM,eAAe,WAA4B,UAAkB,UAAkG;AAC9J,UAAA,eAAe,2BAA2B,QAAQ;AACxD,QAAI,cAAc;AACV,aAAA,IAAI,cAAc,YAAY,YAAY;AAAA,IAClD;AACA,UAAM,UAAU,WAAW,QAAQ,IAAI,sBAAsB,UAAU,QAAQ,CAAC;AACzE,WAAA,IAAI,WAAW,IAAI;AAAA,EAC3B;AAAA,EAEA,MAAM,iBAAiB,WAA4B,QAAmB,iBAAyB,UAAoG;AAC5L,UAAA,eAAe,2BAA2B,QAAQ;AACxD,QAAI,cAAc;AACV,aAAA,IAAI,cAAc,YAAY,YAAY;AAAA,IAClD;AACI,QAAA,CAAC,OAAO,eAAe;AACnB,aAAA,IAAI,cAAc,mBAAmB,iBAAiB;AAAA,IAC9D;AACI,QAAA,CAAE,MAAM,KAAK,UAAU,cAAc,iBAAiB,OAAO,aAAa,GAAI;AAC1E,aAAA,IAAI,cAAc,oBAAoB,yBAAyB;AAAA,IACvE;AAEM,UAAA,UAAU,WAAW,QAAQ,IAAI,sBAAsB,OAAO,IAAI,QAAQ,CAAC;AAC1E,WAAA,IAAI,WAAW,IAAI;AAAA,EAC3B;AACD;"}
1
+ {"version":3,"file":"PasswordChangeManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordChangeManager.ts"],"sourcesContent":["import { ChangeMyPasswordErrorCode, ChangePasswordErrorCode } from '../../schema'\nimport { ChangePasswordCommand } from '../commands'\nimport { getPasswordWeaknessMessage } from '../utils/password'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { PersonRow } from '../queries'\nimport { Providers } from '../providers'\nimport { DatabaseContext } from '../utils'\n\nclass PasswordChangeManager {\n\tconstructor(\n\t\tprivate readonly providers: Providers,\n\t) {}\n\n\tasync changePassword(dbContext: DatabaseContext, personId: string, password: string): Promise<PasswordChangeManager.PasswordChangeResponse<ChangePasswordErrorCode>> {\n\t\tconst weakPassword = getPasswordWeaknessMessage(password)\n\t\tif (weakPassword) {\n\t\t\treturn new ResponseError('TOO_WEAK', weakPassword)\n\t\t}\n\t\tawait dbContext.commandBus.execute(new ChangePasswordCommand(personId, password))\n\t\treturn new ResponseOk(null)\n\t}\n\n\tasync changeMyPassword(dbContext: DatabaseContext, person: PersonRow, currentPassword: string, password: string): Promise<PasswordChangeManager.PasswordChangeResponse<ChangeMyPasswordErrorCode>> {\n\t\tconst weakPassword = getPasswordWeaknessMessage(password)\n\t\tif (weakPassword) {\n\t\t\treturn new ResponseError('TOO_WEAK', weakPassword)\n\t\t}\n\t\tif (!person.password_hash) {\n\t\t\treturn new ResponseError('NO_PASSWORD_SET', 'No password set')\n\t\t}\n\t\tif (!(await this.providers.bcryptCompare(currentPassword, person.password_hash))) {\n\t\t\treturn new ResponseError('INVALID_PASSWORD', 'Password does not match')\n\t\t}\n\n\t\tawait dbContext.commandBus.execute(new ChangePasswordCommand(person.id, password))\n\t\treturn new ResponseOk(null)\n\t}\n}\n\nnamespace PasswordChangeManager {\n\texport type PasswordChangeResponse<T extends ChangePasswordErrorCode | ChangeMyPasswordErrorCode> = Response<null, T>\n}\n\nexport { PasswordChangeManager }\n"],"names":[],"mappings":";;;;;;AAQA,MAAM,sBAAsB;AAAA,EAC3B,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EAAA;AAAA,EAGlB,MAAM,eAAe,WAA4B,UAAkB,UAAkG;AAC9J,UAAA,eAAe,2BAA2B,QAAQ;AACxD,QAAI,cAAc;AACV,aAAA,IAAI,cAAc,YAAY,YAAY;AAAA,IAAA;AAElD,UAAM,UAAU,WAAW,QAAQ,IAAI,sBAAsB,UAAU,QAAQ,CAAC;AACzE,WAAA,IAAI,WAAW,IAAI;AAAA,EAAA;AAAA,EAG3B,MAAM,iBAAiB,WAA4B,QAAmB,iBAAyB,UAAoG;AAC5L,UAAA,eAAe,2BAA2B,QAAQ;AACxD,QAAI,cAAc;AACV,aAAA,IAAI,cAAc,YAAY,YAAY;AAAA,IAAA;AAE9C,QAAA,CAAC,OAAO,eAAe;AACnB,aAAA,IAAI,cAAc,mBAAmB,iBAAiB;AAAA,IAAA;AAE1D,QAAA,CAAE,MAAM,KAAK,UAAU,cAAc,iBAAiB,OAAO,aAAa,GAAI;AAC1E,aAAA,IAAI,cAAc,oBAAoB,yBAAyB;AAAA,IAAA;AAGjE,UAAA,UAAU,WAAW,QAAQ,IAAI,sBAAsB,OAAO,IAAI,QAAQ,CAAC;AAC1E,WAAA,IAAI,WAAW,IAAI;AAAA,EAAA;AAE5B;"}
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordResetManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordResetManager.ts"],"sourcesContent":["import { Response, ResponseError } from '../utils/Response'\nimport { getPasswordWeaknessMessage } from '../utils/password'\nimport { UserMailer } from '../mailing'\nimport { PersonRow } from '../queries'\nimport { PermissionContext } from '../authorization'\nimport { ProjectManager } from './ProjectManager'\nimport { DatabaseContext } from '../utils'\nimport { ImplementationException } from '../../exceptions'\nimport { getPreferredProject } from './helpers/getPreferredProject'\nimport { CreatePersonTokenCommand, ResetPasswordCommand, ResetPasswordCommandErrorCode } from '../commands/personToken'\n\ninterface MailOptions {\n\tproject?: string\n\tmailVariant?: string\n}\n\nexport class PasswordResetManager {\n\tconstructor(\n\t\tprivate readonly mailer: UserMailer,\n\t\tprivate readonly projectManager: ProjectManager,\n\t) { }\n\n\tpublic async createPasswordResetRequest(\n\t\tdbContext: DatabaseContext,\n\t\tpermissionContext: PermissionContext,\n\t\tperson: PersonRow,\n\t\tmailOptions: MailOptions = {},\n\t): Promise<void> {\n\t\tconst result = await dbContext.commandBus.execute(CreatePersonTokenCommand.createPasswordResetRequest(person.id))\n\t\tconst projects = await this.projectManager.getProjectsByIdentity(dbContext, person.identity_id, permissionContext)\n\t\tconst project = getPreferredProject(projects, mailOptions.project ?? null)\n\t\tif (!person.email) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\n\t\tawait this.mailer.sendPasswordResetEmail(\n\t\t\tdbContext,\n\t\t\t{\n\t\t\t\temail: person.email,\n\t\t\t\ttoken: result.token,\n\t\t\t\tproject: project?.name,\n\t\t\t\tprojectSlug: project?.slug,\n\t\t\t},\n\t\t\t{\n\t\t\t\tvariant: mailOptions.mailVariant || '',\n\t\t\t\tprojectId: project?.id ?? null,\n\t\t\t},\n\t\t)\n\t}\n\n\tpublic async resetPassword(dbContext: DatabaseContext, token: string, password: string): Promise<ResetPasswordResponse> {\n\t\tconst weakPassword = getPasswordWeaknessMessage(password)\n\t\tif (weakPassword) {\n\t\t\treturn new ResponseError('PASSWORD_TOO_WEAK', weakPassword)\n\t\t}\n\t\treturn await dbContext.commandBus.execute(new ResetPasswordCommand(token, password))\n\t}\n}\n\nexport type ResetPasswordErrorCode = 'PASSWORD_TOO_WEAK'\n\nexport type ResetPasswordResponse = Response<null, ResetPasswordErrorCode | ResetPasswordCommandErrorCode>\n"],"names":["CreatePersonTokenCommand","getPreferredProject","ImplementationException","password","getPasswordWeaknessMessage","ResponseError","ResetPasswordCommand"],"mappings":";;;;;;;;;AAgBO,MAAM,qBAAqB;AAAA,EACjC,YACkB,QACA,gBAChB;AAFgB,SAAA,SAAA;AACA,SAAA,iBAAA;AAAA,EACd;AAAA,EAEJ,MAAa,2BACZ,WACA,mBACA,QACA,cAA2B,CAAA,GACX;AACV,UAAA,SAAS,MAAM,UAAU,WAAW,QAAQA,yBAAyB,yBAAA,2BAA2B,OAAO,EAAE,CAAC;AAC1G,UAAA,WAAW,MAAM,KAAK,eAAe,sBAAsB,WAAW,OAAO,aAAa,iBAAiB;AACjH,UAAM,UAAUC,oBAAAA,oBAAoB,UAAU,YAAY,WAAW,IAAI;AACrE,QAAA,CAAC,OAAO,OAAO;AAClB,YAAM,IAAIC,WAAwB,wBAAA;AAAA,IACnC;AAEA,UAAM,KAAK,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,QACC,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,QACd,SAAS,SAAS;AAAA,QAClB,aAAa,SAAS;AAAA,MACvB;AAAA,MACA;AAAA,QACC,SAAS,YAAY,eAAe;AAAA,QACpC,WAAW,SAAS,MAAM;AAAA,MAC3B;AAAA,IAAA;AAAA,EAEF;AAAA,EAEA,MAAa,cAAc,WAA4B,OAAeC,YAAkD;AACjH,UAAA,eAAeC,oCAA2BD,UAAQ;AACxD,QAAI,cAAc;AACV,aAAA,IAAIE,SAAc,cAAA,qBAAqB,YAAY;AAAA,IAC3D;AACO,WAAA,MAAM,UAAU,WAAW,QAAQ,IAAIC,qBAAAA,qBAAqB,OAAOH,UAAQ,CAAC;AAAA,EACpF;AACD;;"}
1
+ {"version":3,"file":"PasswordResetManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordResetManager.ts"],"sourcesContent":["import { Response, ResponseError } from '../utils/Response'\nimport { getPasswordWeaknessMessage } from '../utils/password'\nimport { UserMailer } from '../mailing'\nimport { PersonRow } from '../queries'\nimport { PermissionContext } from '../authorization'\nimport { ProjectManager } from './ProjectManager'\nimport { DatabaseContext } from '../utils'\nimport { ImplementationException } from '../../exceptions'\nimport { getPreferredProject } from './helpers/getPreferredProject'\nimport { CreatePersonTokenCommand, ResetPasswordCommand, ResetPasswordCommandErrorCode } from '../commands/personToken'\n\ninterface MailOptions {\n\tproject?: string\n\tmailVariant?: string\n}\n\nexport class PasswordResetManager {\n\tconstructor(\n\t\tprivate readonly mailer: UserMailer,\n\t\tprivate readonly projectManager: ProjectManager,\n\t) { }\n\n\tpublic async createPasswordResetRequest(\n\t\tdbContext: DatabaseContext,\n\t\tpermissionContext: PermissionContext,\n\t\tperson: PersonRow,\n\t\tmailOptions: MailOptions = {},\n\t): Promise<void> {\n\t\tconst result = await dbContext.commandBus.execute(CreatePersonTokenCommand.createPasswordResetRequest(person.id))\n\t\tconst projects = await this.projectManager.getProjectsByIdentity(dbContext, person.identity_id, permissionContext)\n\t\tconst project = getPreferredProject(projects, mailOptions.project ?? null)\n\t\tif (!person.email) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\n\t\tawait this.mailer.sendPasswordResetEmail(\n\t\t\tdbContext,\n\t\t\t{\n\t\t\t\temail: person.email,\n\t\t\t\ttoken: result.token,\n\t\t\t\tproject: project?.name,\n\t\t\t\tprojectSlug: project?.slug,\n\t\t\t},\n\t\t\t{\n\t\t\t\tvariant: mailOptions.mailVariant || '',\n\t\t\t\tprojectId: project?.id ?? null,\n\t\t\t},\n\t\t)\n\t}\n\n\tpublic async resetPassword(dbContext: DatabaseContext, token: string, password: string): Promise<ResetPasswordResponse> {\n\t\tconst weakPassword = getPasswordWeaknessMessage(password)\n\t\tif (weakPassword) {\n\t\t\treturn new ResponseError('PASSWORD_TOO_WEAK', weakPassword)\n\t\t}\n\t\treturn await dbContext.commandBus.execute(new ResetPasswordCommand(token, password))\n\t}\n}\n\nexport type ResetPasswordErrorCode = 'PASSWORD_TOO_WEAK'\n\nexport type ResetPasswordResponse = Response<null, ResetPasswordErrorCode | ResetPasswordCommandErrorCode>\n"],"names":["CreatePersonTokenCommand","getPreferredProject","ImplementationException","password","getPasswordWeaknessMessage","ResponseError","ResetPasswordCommand"],"mappings":";;;;;;;;;AAgBO,MAAM,qBAAqB;AAAA,EACjC,YACkB,QACA,gBAChB;AAFgB,SAAA,SAAA;AACA,SAAA,iBAAA;AAAA,EAAA;AAAA,EAGlB,MAAa,2BACZ,WACA,mBACA,QACA,cAA2B,CAAA,GACX;AACV,UAAA,SAAS,MAAM,UAAU,WAAW,QAAQA,yBAAAA,yBAAyB,2BAA2B,OAAO,EAAE,CAAC;AAC1G,UAAA,WAAW,MAAM,KAAK,eAAe,sBAAsB,WAAW,OAAO,aAAa,iBAAiB;AACjH,UAAM,UAAUC,oBAAAA,oBAAoB,UAAU,YAAY,WAAW,IAAI;AACrE,QAAA,CAAC,OAAO,OAAO;AAClB,YAAM,IAAIC,WAAAA,wBAAwB;AAAA,IAAA;AAGnC,UAAM,KAAK,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,QACC,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,QACd,SAAS,SAAS;AAAA,QAClB,aAAa,SAAS;AAAA,MACvB;AAAA,MACA;AAAA,QACC,SAAS,YAAY,eAAe;AAAA,QACpC,WAAW,SAAS,MAAM;AAAA,MAAA;AAAA,IAE5B;AAAA,EAAA;AAAA,EAGD,MAAa,cAAc,WAA4B,OAAeC,YAAkD;AACjH,UAAA,eAAeC,oCAA2BD,UAAQ;AACxD,QAAI,cAAc;AACV,aAAA,IAAIE,SAAAA,cAAc,qBAAqB,YAAY;AAAA,IAAA;AAEpD,WAAA,MAAM,UAAU,WAAW,QAAQ,IAAIC,0CAAqB,OAAOH,UAAQ,CAAC;AAAA,EAAA;AAErF;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordResetManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordResetManager.ts"],"sourcesContent":["import { Response, ResponseError } from '../utils/Response'\nimport { getPasswordWeaknessMessage } from '../utils/password'\nimport { UserMailer } from '../mailing'\nimport { PersonRow } from '../queries'\nimport { PermissionContext } from '../authorization'\nimport { ProjectManager } from './ProjectManager'\nimport { DatabaseContext } from '../utils'\nimport { ImplementationException } from '../../exceptions'\nimport { getPreferredProject } from './helpers/getPreferredProject'\nimport { CreatePersonTokenCommand, ResetPasswordCommand, ResetPasswordCommandErrorCode } from '../commands/personToken'\n\ninterface MailOptions {\n\tproject?: string\n\tmailVariant?: string\n}\n\nexport class PasswordResetManager {\n\tconstructor(\n\t\tprivate readonly mailer: UserMailer,\n\t\tprivate readonly projectManager: ProjectManager,\n\t) { }\n\n\tpublic async createPasswordResetRequest(\n\t\tdbContext: DatabaseContext,\n\t\tpermissionContext: PermissionContext,\n\t\tperson: PersonRow,\n\t\tmailOptions: MailOptions = {},\n\t): Promise<void> {\n\t\tconst result = await dbContext.commandBus.execute(CreatePersonTokenCommand.createPasswordResetRequest(person.id))\n\t\tconst projects = await this.projectManager.getProjectsByIdentity(dbContext, person.identity_id, permissionContext)\n\t\tconst project = getPreferredProject(projects, mailOptions.project ?? null)\n\t\tif (!person.email) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\n\t\tawait this.mailer.sendPasswordResetEmail(\n\t\t\tdbContext,\n\t\t\t{\n\t\t\t\temail: person.email,\n\t\t\t\ttoken: result.token,\n\t\t\t\tproject: project?.name,\n\t\t\t\tprojectSlug: project?.slug,\n\t\t\t},\n\t\t\t{\n\t\t\t\tvariant: mailOptions.mailVariant || '',\n\t\t\t\tprojectId: project?.id ?? null,\n\t\t\t},\n\t\t)\n\t}\n\n\tpublic async resetPassword(dbContext: DatabaseContext, token: string, password: string): Promise<ResetPasswordResponse> {\n\t\tconst weakPassword = getPasswordWeaknessMessage(password)\n\t\tif (weakPassword) {\n\t\t\treturn new ResponseError('PASSWORD_TOO_WEAK', weakPassword)\n\t\t}\n\t\treturn await dbContext.commandBus.execute(new ResetPasswordCommand(token, password))\n\t}\n}\n\nexport type ResetPasswordErrorCode = 'PASSWORD_TOO_WEAK'\n\nexport type ResetPasswordResponse = Response<null, ResetPasswordErrorCode | ResetPasswordCommandErrorCode>\n"],"names":[],"mappings":";;;;;;;AAgBO,MAAM,qBAAqB;AAAA,EACjC,YACkB,QACA,gBAChB;AAFgB,SAAA,SAAA;AACA,SAAA,iBAAA;AAAA,EACd;AAAA,EAEJ,MAAa,2BACZ,WACA,mBACA,QACA,cAA2B,CAAA,GACX;AACV,UAAA,SAAS,MAAM,UAAU,WAAW,QAAQ,yBAAyB,2BAA2B,OAAO,EAAE,CAAC;AAC1G,UAAA,WAAW,MAAM,KAAK,eAAe,sBAAsB,WAAW,OAAO,aAAa,iBAAiB;AACjH,UAAM,UAAU,oBAAoB,UAAU,YAAY,WAAW,IAAI;AACrE,QAAA,CAAC,OAAO,OAAO;AAClB,YAAM,IAAI,wBAAwB;AAAA,IACnC;AAEA,UAAM,KAAK,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,QACC,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,QACd,SAAS,SAAS;AAAA,QAClB,aAAa,SAAS;AAAA,MACvB;AAAA,MACA;AAAA,QACC,SAAS,YAAY,eAAe;AAAA,QACpC,WAAW,SAAS,MAAM;AAAA,MAC3B;AAAA,IAAA;AAAA,EAEF;AAAA,EAEA,MAAa,cAAc,WAA4B,OAAe,UAAkD;AACjH,UAAA,eAAe,2BAA2B,QAAQ;AACxD,QAAI,cAAc;AACV,aAAA,IAAI,cAAc,qBAAqB,YAAY;AAAA,IAC3D;AACO,WAAA,MAAM,UAAU,WAAW,QAAQ,IAAI,qBAAqB,OAAO,QAAQ,CAAC;AAAA,EACpF;AACD;"}
1
+ {"version":3,"file":"PasswordResetManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordResetManager.ts"],"sourcesContent":["import { Response, ResponseError } from '../utils/Response'\nimport { getPasswordWeaknessMessage } from '../utils/password'\nimport { UserMailer } from '../mailing'\nimport { PersonRow } from '../queries'\nimport { PermissionContext } from '../authorization'\nimport { ProjectManager } from './ProjectManager'\nimport { DatabaseContext } from '../utils'\nimport { ImplementationException } from '../../exceptions'\nimport { getPreferredProject } from './helpers/getPreferredProject'\nimport { CreatePersonTokenCommand, ResetPasswordCommand, ResetPasswordCommandErrorCode } from '../commands/personToken'\n\ninterface MailOptions {\n\tproject?: string\n\tmailVariant?: string\n}\n\nexport class PasswordResetManager {\n\tconstructor(\n\t\tprivate readonly mailer: UserMailer,\n\t\tprivate readonly projectManager: ProjectManager,\n\t) { }\n\n\tpublic async createPasswordResetRequest(\n\t\tdbContext: DatabaseContext,\n\t\tpermissionContext: PermissionContext,\n\t\tperson: PersonRow,\n\t\tmailOptions: MailOptions = {},\n\t): Promise<void> {\n\t\tconst result = await dbContext.commandBus.execute(CreatePersonTokenCommand.createPasswordResetRequest(person.id))\n\t\tconst projects = await this.projectManager.getProjectsByIdentity(dbContext, person.identity_id, permissionContext)\n\t\tconst project = getPreferredProject(projects, mailOptions.project ?? null)\n\t\tif (!person.email) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\n\t\tawait this.mailer.sendPasswordResetEmail(\n\t\t\tdbContext,\n\t\t\t{\n\t\t\t\temail: person.email,\n\t\t\t\ttoken: result.token,\n\t\t\t\tproject: project?.name,\n\t\t\t\tprojectSlug: project?.slug,\n\t\t\t},\n\t\t\t{\n\t\t\t\tvariant: mailOptions.mailVariant || '',\n\t\t\t\tprojectId: project?.id ?? null,\n\t\t\t},\n\t\t)\n\t}\n\n\tpublic async resetPassword(dbContext: DatabaseContext, token: string, password: string): Promise<ResetPasswordResponse> {\n\t\tconst weakPassword = getPasswordWeaknessMessage(password)\n\t\tif (weakPassword) {\n\t\t\treturn new ResponseError('PASSWORD_TOO_WEAK', weakPassword)\n\t\t}\n\t\treturn await dbContext.commandBus.execute(new ResetPasswordCommand(token, password))\n\t}\n}\n\nexport type ResetPasswordErrorCode = 'PASSWORD_TOO_WEAK'\n\nexport type ResetPasswordResponse = Response<null, ResetPasswordErrorCode | ResetPasswordCommandErrorCode>\n"],"names":[],"mappings":";;;;;;;AAgBO,MAAM,qBAAqB;AAAA,EACjC,YACkB,QACA,gBAChB;AAFgB,SAAA,SAAA;AACA,SAAA,iBAAA;AAAA,EAAA;AAAA,EAGlB,MAAa,2BACZ,WACA,mBACA,QACA,cAA2B,CAAA,GACX;AACV,UAAA,SAAS,MAAM,UAAU,WAAW,QAAQ,yBAAyB,2BAA2B,OAAO,EAAE,CAAC;AAC1G,UAAA,WAAW,MAAM,KAAK,eAAe,sBAAsB,WAAW,OAAO,aAAa,iBAAiB;AACjH,UAAM,UAAU,oBAAoB,UAAU,YAAY,WAAW,IAAI;AACrE,QAAA,CAAC,OAAO,OAAO;AAClB,YAAM,IAAI,wBAAwB;AAAA,IAAA;AAGnC,UAAM,KAAK,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,QACC,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,QACd,SAAS,SAAS;AAAA,QAClB,aAAa,SAAS;AAAA,MACvB;AAAA,MACA;AAAA,QACC,SAAS,YAAY,eAAe;AAAA,QACpC,WAAW,SAAS,MAAM;AAAA,MAAA;AAAA,IAE5B;AAAA,EAAA;AAAA,EAGD,MAAa,cAAc,WAA4B,OAAe,UAAkD;AACjH,UAAA,eAAe,2BAA2B,QAAQ;AACxD,QAAI,cAAc;AACV,aAAA,IAAI,cAAc,qBAAqB,YAAY;AAAA,IAAA;AAEpD,WAAA,MAAM,UAAU,WAAW,QAAQ,IAAI,qBAAqB,OAAO,QAAQ,CAAC;AAAA,EAAA;AAErF;"}
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordlessSignInManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordlessSignInManager.ts"],"sourcesContent":["import { ApiKeyManager } from './apiKey'\nimport { PersonQuery, PersonRow } from '../queries'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport {\n\tActivatePasswordlessOtpErrorCode,\n\tConfigPolicy,\n\tInitSignInPasswordlessErrorCode,\n\tInitSignInPasswordlessResult,\n\tSignInPasswordlessErrorCode,\n} from '../../schema'\nimport { DatabaseContext, validateToken } from '../utils'\nimport { ConfigurationManager } from './ConfigurationManager'\nimport { UserMailer } from '../mailing'\nimport { ActivateOtpCommand, CreatePersonTokenCommand, IncreaseOtpAttemptCommand } from '../commands'\nimport { getPreferredProject } from './helpers/getPreferredProject'\nimport { ProjectManager } from './ProjectManager'\nimport { PermissionContext } from '../authorization'\nimport { PersonTokenQuery } from '../queries/personToken/PersonTokenQuery'\nimport { ImplementationException } from '../../exceptions'\nimport { OtpAuthenticator } from './OtpAuthenticator'\nimport { InvalidateTokenCommand } from '../commands/personToken/InvalidateTokenCommand'\nimport { PersonToken } from '../type'\n\nclass PasswordlessSignInManager {\n\tconstructor(\n\t\tprivate readonly apiKeyManager: ApiKeyManager,\n\t\tprivate readonly configurationManager: ConfigurationManager,\n\t\tprivate readonly mailer: UserMailer,\n\t\tprivate readonly projectManager: ProjectManager,\n\t\tprivate readonly otpAuthenticator: OtpAuthenticator,\n\n\t) {}\n\n\tasync initSignInPasswordless({ db, permissionContext, mailVariant, mailProject, email }: {\n\t\tdb: DatabaseContext\n\t\tpermissionContext: PermissionContext\n\t\temail: string\n\t\tmailVariant?: string\n\t\tmailProject?: string\n\t}): Promise<PasswordlessSignInManager.InitSignInPasswordlessResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.InitSignInPasswordlessResponse> => {\n\t\t\tconst configuration = await this.configurationManager.fetchConfiguration(db)\n\t\t\tif (configuration.passwordless.enabled === 'never') {\n\t\t\t\treturn new ResponseError('PASSWORDLESS_DISABLED', 'Passwordless sign-in is disabled')\n\t\t\t}\n\n\t\t\tconst person = await db.queryHandler.fetch(PersonQuery.byEmail(email))\n\t\t\tif (!person) {\n\t\t\t\treturn new ResponseError('PERSON_NOT_FOUND', `Person ${email} not found`)\n\t\t\t}\n\t\t\tif (!this.isEnabled(configuration.passwordless.enabled, person.passwordless_enabled)) {\n\t\t\t\treturn new ResponseError('PASSWORDLESS_DISABLED', 'Passwordless sign-in is disabled for this person')\n\t\t\t}\n\n\t\t\tconst createTokenCommand = CreatePersonTokenCommand.createPasswordlessRequest(person.id, configuration.passwordless.expirationMinutes)\n\t\t\tconst result = await db.commandBus.execute(createTokenCommand)\n\n\n\t\t\tconst url = this.formatUrl(configuration.passwordless.url ?? null, result.token, result.id, email) ?? undefined\n\n\t\t\tconst projects = await this.projectManager.getProjectsByIdentity(db, person.identity_id, permissionContext)\n\t\t\tconst project = getPreferredProject(projects, mailProject ?? null)\n\n\t\t\tawait this.mailer.sendPasswordlessEmail(db, {\n\t\t\t\temail,\n\t\t\t\ttoken: result.token,\n\t\t\t\turl,\n\t\t\t\tproject: project?.name,\n\t\t\t\tprojectSlug: project?.slug,\n\t\t\t}, {\n\t\t\t\tvariant: mailVariant || '',\n\t\t\t\tprojectId: project?.id ?? null,\n\t\t\t})\n\n\t\t\treturn new ResponseOk({ requestId: result.id, expiresAt: result.expiresAt })\n\t\t})\n\t}\n\n\tprivate formatUrl(url: string | null, token: string, requestId: string, email: string): string | null {\n\t\tif (!url) {\n\t\t\treturn null\n\t\t}\n\t\tconst urlObj = new URL(url)\n\t\turlObj.searchParams.set('token', token)\n\t\turlObj.searchParams.set('request_id', requestId)\n\t\turlObj.searchParams.set('email', email)\n\t\treturn urlObj.toString()\n\t}\n\n\tasync signInPasswordless({ db, expiration, token, requestId, mfaOtp, validationType }: {\n\t\tdb: DatabaseContext\n\t\tvalidationType: PersonToken.ValidationType\n\t\trequestId: string\n\t\ttoken: string\n\t\tmfaOtp?: string\n\t\texpiration?: number\n\t}): Promise<PasswordlessSignInManager.SignInPasswordlessResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.SignInPasswordlessResponse> => {\n\n\t\t\tconst tokenResult = await db.queryHandler.fetch(PersonTokenQuery.byId(requestId, 'passwordless'))\n\t\t\tconst tokenValidationResult = validateToken({\n\t\t\t\tentry: tokenResult,\n\t\t\t\ttoken,\n\t\t\t\tnow: db.providers.now(),\n\t\t\t\tvalidationType,\n\t\t\t})\n\t\t\tif (!tokenValidationResult.ok) {\n\t\t\t\tif (tokenValidationResult.error === 'TOKEN_INVALID' && validationType === 'otp') {\n\t\t\t\t\tawait db.commandBus.execute(new IncreaseOtpAttemptCommand(tokenResult!.id))\n\t\t\t\t}\n\t\t\t\treturn tokenValidationResult\n\t\t\t}\n\t\t\tconst personRow = await db.queryHandler.fetch(PersonQuery.byId(tokenValidationResult.result.person_id))\n\t\t\tif (!personRow) {\n\t\t\t\tthrow new ImplementationException()\n\t\t\t}\n\t\t\tif (personRow.disabled_at !== null) {\n\t\t\t\treturn new ResponseError('PERSON_DISABLED', `Person is disabled`)\n\t\t\t}\n\n\t\t\tif (personRow.otp_uri && personRow.otp_activated_at) {\n\t\t\t\tif (!mfaOtp) {\n\t\t\t\t\treturn new ResponseError('OTP_REQUIRED', `2FA is enabled. OTP token is required`)\n\t\t\t\t}\n\n\t\t\t\tif (!this.otpAuthenticator.validate({ uri: personRow.otp_uri }, mfaOtp)) {\n\t\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait db.commandBus.execute(new InvalidateTokenCommand(tokenValidationResult.result.id))\n\t\t\tconst sessionToken = await this.apiKeyManager.createSessionApiKey(db, personRow.identity_id, expiration)\n\n\t\t\treturn new ResponseOk({ person: personRow, token: sessionToken })\n\t\t})\n\t}\n\n\tasync activatePasswordlessOtp({ db, token, requestId, otpHash }: {\n\t\tdb: DatabaseContext\n\t\trequestId: string\n\t\ttoken: string\n\t\totpHash: string\n\t}): Promise<PasswordlessSignInManager.ActivatePasswordlessOtpResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.ActivatePasswordlessOtpResponse> => {\n\n\t\t\tconst tokenResult = await db.queryHandler.fetch(PersonTokenQuery.byId(requestId, 'passwordless'))\n\t\t\tconst tokenValidationResult = validateToken({\n\t\t\t\tentry: tokenResult,\n\t\t\t\ttoken,\n\t\t\t\tnow: db.providers.now(),\n\t\t\t\tvalidationType: 'token',\n\t\t\t})\n\t\t\tif (!tokenValidationResult.ok) {\n\t\t\t\treturn tokenValidationResult\n\t\t\t}\n\n\t\t\tawait db.commandBus.execute(new ActivateOtpCommand(tokenValidationResult.result.id, otpHash))\n\n\t\t\treturn new ResponseOk(null)\n\t\t})\n\t}\n\n\tprivate isEnabled(globalValue: ConfigPolicy, personValue: boolean | null): boolean {\n\t\tswitch (globalValue) {\n\t\t\tcase 'always':\n\t\t\t\treturn true\n\t\t\tcase 'never':\n\t\t\t\treturn false\n\t\t\tcase 'optIn':\n\t\t\t\treturn personValue === true\n\t\t\tcase 'optOut':\n\t\t\t\treturn personValue !== false\n\t\t}\n\t}\n}\n\nnamespace PasswordlessSignInManager {\n\texport type InitSignInPasswordlessResponse = Response<InitSignInPasswordlessResult, InitSignInPasswordlessErrorCode>\n\n\n\tinterface SignInPasswordlessResult {\n\t\treadonly person: PersonRow\n\t\treadonly token: string\n\t}\n\texport type SignInPasswordlessResponse = Response<SignInPasswordlessResult, SignInPasswordlessErrorCode>\n\n\texport type ActivatePasswordlessOtpResponse = Response<null, ActivatePasswordlessOtpErrorCode>\n}\n\nexport { PasswordlessSignInManager }\n"],"names":["db","ResponseError","PersonQuery","CreatePersonTokenCommand","getPreferredProject","ResponseOk","PersonTokenQuery","validateToken","IncreaseOtpAttemptCommand","ImplementationException","InvalidateTokenCommand","ActivateOtpCommand"],"mappings":"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"}
1
+ {"version":3,"file":"PasswordlessSignInManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordlessSignInManager.ts"],"sourcesContent":["import { ApiKeyManager } from './apiKey'\nimport { PersonQuery, PersonRow } from '../queries'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport {\n\tActivatePasswordlessOtpErrorCode,\n\tConfigPolicy,\n\tInitSignInPasswordlessErrorCode,\n\tInitSignInPasswordlessResult,\n\tSignInPasswordlessErrorCode,\n} from '../../schema'\nimport { DatabaseContext, validateToken } from '../utils'\nimport { ConfigurationManager } from './ConfigurationManager'\nimport { UserMailer } from '../mailing'\nimport { ActivateOtpCommand, CreatePersonTokenCommand, IncreaseOtpAttemptCommand } from '../commands'\nimport { getPreferredProject } from './helpers/getPreferredProject'\nimport { ProjectManager } from './ProjectManager'\nimport { PermissionContext } from '../authorization'\nimport { PersonTokenQuery } from '../queries/personToken/PersonTokenQuery'\nimport { ImplementationException } from '../../exceptions'\nimport { OtpAuthenticator } from './OtpAuthenticator'\nimport { InvalidateTokenCommand } from '../commands/personToken/InvalidateTokenCommand'\nimport { PersonToken } from '../type'\n\nclass PasswordlessSignInManager {\n\tconstructor(\n\t\tprivate readonly apiKeyManager: ApiKeyManager,\n\t\tprivate readonly configurationManager: ConfigurationManager,\n\t\tprivate readonly mailer: UserMailer,\n\t\tprivate readonly projectManager: ProjectManager,\n\t\tprivate readonly otpAuthenticator: OtpAuthenticator,\n\n\t) {}\n\n\tasync initSignInPasswordless({ db, permissionContext, mailVariant, mailProject, email }: {\n\t\tdb: DatabaseContext\n\t\tpermissionContext: PermissionContext\n\t\temail: string\n\t\tmailVariant?: string\n\t\tmailProject?: string\n\t}): Promise<PasswordlessSignInManager.InitSignInPasswordlessResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.InitSignInPasswordlessResponse> => {\n\t\t\tconst configuration = await this.configurationManager.fetchConfiguration(db)\n\t\t\tif (configuration.passwordless.enabled === 'never') {\n\t\t\t\treturn new ResponseError('PASSWORDLESS_DISABLED', 'Passwordless sign-in is disabled')\n\t\t\t}\n\n\t\t\tconst person = await db.queryHandler.fetch(PersonQuery.byEmail(email))\n\t\t\tif (!person) {\n\t\t\t\treturn new ResponseError('PERSON_NOT_FOUND', `Person ${email} not found`)\n\t\t\t}\n\t\t\tif (!this.isEnabled(configuration.passwordless.enabled, person.passwordless_enabled)) {\n\t\t\t\treturn new ResponseError('PASSWORDLESS_DISABLED', 'Passwordless sign-in is disabled for this person')\n\t\t\t}\n\n\t\t\tconst createTokenCommand = CreatePersonTokenCommand.createPasswordlessRequest(person.id, configuration.passwordless.expirationMinutes)\n\t\t\tconst result = await db.commandBus.execute(createTokenCommand)\n\n\n\t\t\tconst url = this.formatUrl(configuration.passwordless.url ?? null, result.token, result.id, email) ?? undefined\n\n\t\t\tconst projects = await this.projectManager.getProjectsByIdentity(db, person.identity_id, permissionContext)\n\t\t\tconst project = getPreferredProject(projects, mailProject ?? null)\n\n\t\t\tawait this.mailer.sendPasswordlessEmail(db, {\n\t\t\t\temail,\n\t\t\t\ttoken: result.token,\n\t\t\t\turl,\n\t\t\t\tproject: project?.name,\n\t\t\t\tprojectSlug: project?.slug,\n\t\t\t}, {\n\t\t\t\tvariant: mailVariant || '',\n\t\t\t\tprojectId: project?.id ?? null,\n\t\t\t})\n\n\t\t\treturn new ResponseOk({ requestId: result.id, expiresAt: result.expiresAt })\n\t\t})\n\t}\n\n\tprivate formatUrl(url: string | null, token: string, requestId: string, email: string): string | null {\n\t\tif (!url) {\n\t\t\treturn null\n\t\t}\n\t\tconst urlObj = new URL(url)\n\t\turlObj.searchParams.set('token', token)\n\t\turlObj.searchParams.set('request_id', requestId)\n\t\turlObj.searchParams.set('email', email)\n\t\treturn urlObj.toString()\n\t}\n\n\tasync signInPasswordless({ db, expiration, token, requestId, mfaOtp, validationType }: {\n\t\tdb: DatabaseContext\n\t\tvalidationType: PersonToken.ValidationType\n\t\trequestId: string\n\t\ttoken: string\n\t\tmfaOtp?: string\n\t\texpiration?: number\n\t}): Promise<PasswordlessSignInManager.SignInPasswordlessResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.SignInPasswordlessResponse> => {\n\n\t\t\tconst tokenResult = await db.queryHandler.fetch(PersonTokenQuery.byId(requestId, 'passwordless'))\n\t\t\tconst tokenValidationResult = validateToken({\n\t\t\t\tentry: tokenResult,\n\t\t\t\ttoken,\n\t\t\t\tnow: db.providers.now(),\n\t\t\t\tvalidationType,\n\t\t\t})\n\t\t\tif (!tokenValidationResult.ok) {\n\t\t\t\tif (tokenValidationResult.error === 'TOKEN_INVALID' && validationType === 'otp') {\n\t\t\t\t\tawait db.commandBus.execute(new IncreaseOtpAttemptCommand(tokenResult!.id))\n\t\t\t\t}\n\t\t\t\treturn tokenValidationResult\n\t\t\t}\n\t\t\tconst personRow = await db.queryHandler.fetch(PersonQuery.byId(tokenValidationResult.result.person_id))\n\t\t\tif (!personRow) {\n\t\t\t\tthrow new ImplementationException()\n\t\t\t}\n\t\t\tif (personRow.disabled_at !== null) {\n\t\t\t\treturn new ResponseError('PERSON_DISABLED', `Person is disabled`)\n\t\t\t}\n\n\t\t\tif (personRow.otp_uri && personRow.otp_activated_at) {\n\t\t\t\tif (!mfaOtp) {\n\t\t\t\t\treturn new ResponseError('OTP_REQUIRED', `2FA is enabled. OTP token is required`)\n\t\t\t\t}\n\n\t\t\t\tif (!this.otpAuthenticator.validate({ uri: personRow.otp_uri }, mfaOtp)) {\n\t\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait db.commandBus.execute(new InvalidateTokenCommand(tokenValidationResult.result.id))\n\t\t\tconst sessionToken = await this.apiKeyManager.createSessionApiKey(db, personRow.identity_id, expiration)\n\n\t\t\treturn new ResponseOk({ person: personRow, token: sessionToken })\n\t\t})\n\t}\n\n\tasync activatePasswordlessOtp({ db, token, requestId, otpHash }: {\n\t\tdb: DatabaseContext\n\t\trequestId: string\n\t\ttoken: string\n\t\totpHash: string\n\t}): Promise<PasswordlessSignInManager.ActivatePasswordlessOtpResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.ActivatePasswordlessOtpResponse> => {\n\n\t\t\tconst tokenResult = await db.queryHandler.fetch(PersonTokenQuery.byId(requestId, 'passwordless'))\n\t\t\tconst tokenValidationResult = validateToken({\n\t\t\t\tentry: tokenResult,\n\t\t\t\ttoken,\n\t\t\t\tnow: db.providers.now(),\n\t\t\t\tvalidationType: 'token',\n\t\t\t})\n\t\t\tif (!tokenValidationResult.ok) {\n\t\t\t\treturn tokenValidationResult\n\t\t\t}\n\n\t\t\tawait db.commandBus.execute(new ActivateOtpCommand(tokenValidationResult.result.id, otpHash))\n\n\t\t\treturn new ResponseOk(null)\n\t\t})\n\t}\n\n\tprivate isEnabled(globalValue: ConfigPolicy, personValue: boolean | null): boolean {\n\t\tswitch (globalValue) {\n\t\t\tcase 'always':\n\t\t\t\treturn true\n\t\t\tcase 'never':\n\t\t\t\treturn false\n\t\t\tcase 'optIn':\n\t\t\t\treturn personValue === true\n\t\t\tcase 'optOut':\n\t\t\t\treturn personValue !== false\n\t\t}\n\t}\n}\n\nnamespace PasswordlessSignInManager {\n\texport type InitSignInPasswordlessResponse = Response<InitSignInPasswordlessResult, InitSignInPasswordlessErrorCode>\n\n\n\tinterface SignInPasswordlessResult {\n\t\treadonly person: PersonRow\n\t\treadonly token: string\n\t}\n\texport type SignInPasswordlessResponse = Response<SignInPasswordlessResult, SignInPasswordlessErrorCode>\n\n\texport type ActivatePasswordlessOtpResponse = Response<null, ActivatePasswordlessOtpErrorCode>\n}\n\nexport { PasswordlessSignInManager }\n"],"names":["db","ResponseError","PersonQuery","CreatePersonTokenCommand","getPreferredProject","ResponseOk","PersonTokenQuery","validateToken","IncreaseOtpAttemptCommand","ImplementationException","InvalidateTokenCommand","ActivateOtpCommand"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordlessSignInManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordlessSignInManager.ts"],"sourcesContent":["import { ApiKeyManager } from './apiKey'\nimport { PersonQuery, PersonRow } from '../queries'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport {\n\tActivatePasswordlessOtpErrorCode,\n\tConfigPolicy,\n\tInitSignInPasswordlessErrorCode,\n\tInitSignInPasswordlessResult,\n\tSignInPasswordlessErrorCode,\n} from '../../schema'\nimport { DatabaseContext, validateToken } from '../utils'\nimport { ConfigurationManager } from './ConfigurationManager'\nimport { UserMailer } from '../mailing'\nimport { ActivateOtpCommand, CreatePersonTokenCommand, IncreaseOtpAttemptCommand } from '../commands'\nimport { getPreferredProject } from './helpers/getPreferredProject'\nimport { ProjectManager } from './ProjectManager'\nimport { PermissionContext } from '../authorization'\nimport { PersonTokenQuery } from '../queries/personToken/PersonTokenQuery'\nimport { ImplementationException } from '../../exceptions'\nimport { OtpAuthenticator } from './OtpAuthenticator'\nimport { InvalidateTokenCommand } from '../commands/personToken/InvalidateTokenCommand'\nimport { PersonToken } from '../type'\n\nclass PasswordlessSignInManager {\n\tconstructor(\n\t\tprivate readonly apiKeyManager: ApiKeyManager,\n\t\tprivate readonly configurationManager: ConfigurationManager,\n\t\tprivate readonly mailer: UserMailer,\n\t\tprivate readonly projectManager: ProjectManager,\n\t\tprivate readonly otpAuthenticator: OtpAuthenticator,\n\n\t) {}\n\n\tasync initSignInPasswordless({ db, permissionContext, mailVariant, mailProject, email }: {\n\t\tdb: DatabaseContext\n\t\tpermissionContext: PermissionContext\n\t\temail: string\n\t\tmailVariant?: string\n\t\tmailProject?: string\n\t}): Promise<PasswordlessSignInManager.InitSignInPasswordlessResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.InitSignInPasswordlessResponse> => {\n\t\t\tconst configuration = await this.configurationManager.fetchConfiguration(db)\n\t\t\tif (configuration.passwordless.enabled === 'never') {\n\t\t\t\treturn new ResponseError('PASSWORDLESS_DISABLED', 'Passwordless sign-in is disabled')\n\t\t\t}\n\n\t\t\tconst person = await db.queryHandler.fetch(PersonQuery.byEmail(email))\n\t\t\tif (!person) {\n\t\t\t\treturn new ResponseError('PERSON_NOT_FOUND', `Person ${email} not found`)\n\t\t\t}\n\t\t\tif (!this.isEnabled(configuration.passwordless.enabled, person.passwordless_enabled)) {\n\t\t\t\treturn new ResponseError('PASSWORDLESS_DISABLED', 'Passwordless sign-in is disabled for this person')\n\t\t\t}\n\n\t\t\tconst createTokenCommand = CreatePersonTokenCommand.createPasswordlessRequest(person.id, configuration.passwordless.expirationMinutes)\n\t\t\tconst result = await db.commandBus.execute(createTokenCommand)\n\n\n\t\t\tconst url = this.formatUrl(configuration.passwordless.url ?? null, result.token, result.id, email) ?? undefined\n\n\t\t\tconst projects = await this.projectManager.getProjectsByIdentity(db, person.identity_id, permissionContext)\n\t\t\tconst project = getPreferredProject(projects, mailProject ?? null)\n\n\t\t\tawait this.mailer.sendPasswordlessEmail(db, {\n\t\t\t\temail,\n\t\t\t\ttoken: result.token,\n\t\t\t\turl,\n\t\t\t\tproject: project?.name,\n\t\t\t\tprojectSlug: project?.slug,\n\t\t\t}, {\n\t\t\t\tvariant: mailVariant || '',\n\t\t\t\tprojectId: project?.id ?? null,\n\t\t\t})\n\n\t\t\treturn new ResponseOk({ requestId: result.id, expiresAt: result.expiresAt })\n\t\t})\n\t}\n\n\tprivate formatUrl(url: string | null, token: string, requestId: string, email: string): string | null {\n\t\tif (!url) {\n\t\t\treturn null\n\t\t}\n\t\tconst urlObj = new URL(url)\n\t\turlObj.searchParams.set('token', token)\n\t\turlObj.searchParams.set('request_id', requestId)\n\t\turlObj.searchParams.set('email', email)\n\t\treturn urlObj.toString()\n\t}\n\n\tasync signInPasswordless({ db, expiration, token, requestId, mfaOtp, validationType }: {\n\t\tdb: DatabaseContext\n\t\tvalidationType: PersonToken.ValidationType\n\t\trequestId: string\n\t\ttoken: string\n\t\tmfaOtp?: string\n\t\texpiration?: number\n\t}): Promise<PasswordlessSignInManager.SignInPasswordlessResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.SignInPasswordlessResponse> => {\n\n\t\t\tconst tokenResult = await db.queryHandler.fetch(PersonTokenQuery.byId(requestId, 'passwordless'))\n\t\t\tconst tokenValidationResult = validateToken({\n\t\t\t\tentry: tokenResult,\n\t\t\t\ttoken,\n\t\t\t\tnow: db.providers.now(),\n\t\t\t\tvalidationType,\n\t\t\t})\n\t\t\tif (!tokenValidationResult.ok) {\n\t\t\t\tif (tokenValidationResult.error === 'TOKEN_INVALID' && validationType === 'otp') {\n\t\t\t\t\tawait db.commandBus.execute(new IncreaseOtpAttemptCommand(tokenResult!.id))\n\t\t\t\t}\n\t\t\t\treturn tokenValidationResult\n\t\t\t}\n\t\t\tconst personRow = await db.queryHandler.fetch(PersonQuery.byId(tokenValidationResult.result.person_id))\n\t\t\tif (!personRow) {\n\t\t\t\tthrow new ImplementationException()\n\t\t\t}\n\t\t\tif (personRow.disabled_at !== null) {\n\t\t\t\treturn new ResponseError('PERSON_DISABLED', `Person is disabled`)\n\t\t\t}\n\n\t\t\tif (personRow.otp_uri && personRow.otp_activated_at) {\n\t\t\t\tif (!mfaOtp) {\n\t\t\t\t\treturn new ResponseError('OTP_REQUIRED', `2FA is enabled. OTP token is required`)\n\t\t\t\t}\n\n\t\t\t\tif (!this.otpAuthenticator.validate({ uri: personRow.otp_uri }, mfaOtp)) {\n\t\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait db.commandBus.execute(new InvalidateTokenCommand(tokenValidationResult.result.id))\n\t\t\tconst sessionToken = await this.apiKeyManager.createSessionApiKey(db, personRow.identity_id, expiration)\n\n\t\t\treturn new ResponseOk({ person: personRow, token: sessionToken })\n\t\t})\n\t}\n\n\tasync activatePasswordlessOtp({ db, token, requestId, otpHash }: {\n\t\tdb: DatabaseContext\n\t\trequestId: string\n\t\ttoken: string\n\t\totpHash: string\n\t}): Promise<PasswordlessSignInManager.ActivatePasswordlessOtpResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.ActivatePasswordlessOtpResponse> => {\n\n\t\t\tconst tokenResult = await db.queryHandler.fetch(PersonTokenQuery.byId(requestId, 'passwordless'))\n\t\t\tconst tokenValidationResult = validateToken({\n\t\t\t\tentry: tokenResult,\n\t\t\t\ttoken,\n\t\t\t\tnow: db.providers.now(),\n\t\t\t\tvalidationType: 'token',\n\t\t\t})\n\t\t\tif (!tokenValidationResult.ok) {\n\t\t\t\treturn tokenValidationResult\n\t\t\t}\n\n\t\t\tawait db.commandBus.execute(new ActivateOtpCommand(tokenValidationResult.result.id, otpHash))\n\n\t\t\treturn new ResponseOk(null)\n\t\t})\n\t}\n\n\tprivate isEnabled(globalValue: ConfigPolicy, personValue: boolean | null): boolean {\n\t\tswitch (globalValue) {\n\t\t\tcase 'always':\n\t\t\t\treturn true\n\t\t\tcase 'never':\n\t\t\t\treturn false\n\t\t\tcase 'optIn':\n\t\t\t\treturn personValue === true\n\t\t\tcase 'optOut':\n\t\t\t\treturn personValue !== false\n\t\t}\n\t}\n}\n\nnamespace PasswordlessSignInManager {\n\texport type InitSignInPasswordlessResponse = Response<InitSignInPasswordlessResult, InitSignInPasswordlessErrorCode>\n\n\n\tinterface SignInPasswordlessResult {\n\t\treadonly person: PersonRow\n\t\treadonly token: string\n\t}\n\texport type SignInPasswordlessResponse = Response<SignInPasswordlessResult, SignInPasswordlessErrorCode>\n\n\texport type ActivatePasswordlessOtpResponse = Response<null, ActivatePasswordlessOtpErrorCode>\n}\n\nexport { PasswordlessSignInManager }\n"],"names":["db"],"mappings":"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"}
1
+ {"version":3,"file":"PasswordlessSignInManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PasswordlessSignInManager.ts"],"sourcesContent":["import { ApiKeyManager } from './apiKey'\nimport { PersonQuery, PersonRow } from '../queries'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport {\n\tActivatePasswordlessOtpErrorCode,\n\tConfigPolicy,\n\tInitSignInPasswordlessErrorCode,\n\tInitSignInPasswordlessResult,\n\tSignInPasswordlessErrorCode,\n} from '../../schema'\nimport { DatabaseContext, validateToken } from '../utils'\nimport { ConfigurationManager } from './ConfigurationManager'\nimport { UserMailer } from '../mailing'\nimport { ActivateOtpCommand, CreatePersonTokenCommand, IncreaseOtpAttemptCommand } from '../commands'\nimport { getPreferredProject } from './helpers/getPreferredProject'\nimport { ProjectManager } from './ProjectManager'\nimport { PermissionContext } from '../authorization'\nimport { PersonTokenQuery } from '../queries/personToken/PersonTokenQuery'\nimport { ImplementationException } from '../../exceptions'\nimport { OtpAuthenticator } from './OtpAuthenticator'\nimport { InvalidateTokenCommand } from '../commands/personToken/InvalidateTokenCommand'\nimport { PersonToken } from '../type'\n\nclass PasswordlessSignInManager {\n\tconstructor(\n\t\tprivate readonly apiKeyManager: ApiKeyManager,\n\t\tprivate readonly configurationManager: ConfigurationManager,\n\t\tprivate readonly mailer: UserMailer,\n\t\tprivate readonly projectManager: ProjectManager,\n\t\tprivate readonly otpAuthenticator: OtpAuthenticator,\n\n\t) {}\n\n\tasync initSignInPasswordless({ db, permissionContext, mailVariant, mailProject, email }: {\n\t\tdb: DatabaseContext\n\t\tpermissionContext: PermissionContext\n\t\temail: string\n\t\tmailVariant?: string\n\t\tmailProject?: string\n\t}): Promise<PasswordlessSignInManager.InitSignInPasswordlessResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.InitSignInPasswordlessResponse> => {\n\t\t\tconst configuration = await this.configurationManager.fetchConfiguration(db)\n\t\t\tif (configuration.passwordless.enabled === 'never') {\n\t\t\t\treturn new ResponseError('PASSWORDLESS_DISABLED', 'Passwordless sign-in is disabled')\n\t\t\t}\n\n\t\t\tconst person = await db.queryHandler.fetch(PersonQuery.byEmail(email))\n\t\t\tif (!person) {\n\t\t\t\treturn new ResponseError('PERSON_NOT_FOUND', `Person ${email} not found`)\n\t\t\t}\n\t\t\tif (!this.isEnabled(configuration.passwordless.enabled, person.passwordless_enabled)) {\n\t\t\t\treturn new ResponseError('PASSWORDLESS_DISABLED', 'Passwordless sign-in is disabled for this person')\n\t\t\t}\n\n\t\t\tconst createTokenCommand = CreatePersonTokenCommand.createPasswordlessRequest(person.id, configuration.passwordless.expirationMinutes)\n\t\t\tconst result = await db.commandBus.execute(createTokenCommand)\n\n\n\t\t\tconst url = this.formatUrl(configuration.passwordless.url ?? null, result.token, result.id, email) ?? undefined\n\n\t\t\tconst projects = await this.projectManager.getProjectsByIdentity(db, person.identity_id, permissionContext)\n\t\t\tconst project = getPreferredProject(projects, mailProject ?? null)\n\n\t\t\tawait this.mailer.sendPasswordlessEmail(db, {\n\t\t\t\temail,\n\t\t\t\ttoken: result.token,\n\t\t\t\turl,\n\t\t\t\tproject: project?.name,\n\t\t\t\tprojectSlug: project?.slug,\n\t\t\t}, {\n\t\t\t\tvariant: mailVariant || '',\n\t\t\t\tprojectId: project?.id ?? null,\n\t\t\t})\n\n\t\t\treturn new ResponseOk({ requestId: result.id, expiresAt: result.expiresAt })\n\t\t})\n\t}\n\n\tprivate formatUrl(url: string | null, token: string, requestId: string, email: string): string | null {\n\t\tif (!url) {\n\t\t\treturn null\n\t\t}\n\t\tconst urlObj = new URL(url)\n\t\turlObj.searchParams.set('token', token)\n\t\turlObj.searchParams.set('request_id', requestId)\n\t\turlObj.searchParams.set('email', email)\n\t\treturn urlObj.toString()\n\t}\n\n\tasync signInPasswordless({ db, expiration, token, requestId, mfaOtp, validationType }: {\n\t\tdb: DatabaseContext\n\t\tvalidationType: PersonToken.ValidationType\n\t\trequestId: string\n\t\ttoken: string\n\t\tmfaOtp?: string\n\t\texpiration?: number\n\t}): Promise<PasswordlessSignInManager.SignInPasswordlessResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.SignInPasswordlessResponse> => {\n\n\t\t\tconst tokenResult = await db.queryHandler.fetch(PersonTokenQuery.byId(requestId, 'passwordless'))\n\t\t\tconst tokenValidationResult = validateToken({\n\t\t\t\tentry: tokenResult,\n\t\t\t\ttoken,\n\t\t\t\tnow: db.providers.now(),\n\t\t\t\tvalidationType,\n\t\t\t})\n\t\t\tif (!tokenValidationResult.ok) {\n\t\t\t\tif (tokenValidationResult.error === 'TOKEN_INVALID' && validationType === 'otp') {\n\t\t\t\t\tawait db.commandBus.execute(new IncreaseOtpAttemptCommand(tokenResult!.id))\n\t\t\t\t}\n\t\t\t\treturn tokenValidationResult\n\t\t\t}\n\t\t\tconst personRow = await db.queryHandler.fetch(PersonQuery.byId(tokenValidationResult.result.person_id))\n\t\t\tif (!personRow) {\n\t\t\t\tthrow new ImplementationException()\n\t\t\t}\n\t\t\tif (personRow.disabled_at !== null) {\n\t\t\t\treturn new ResponseError('PERSON_DISABLED', `Person is disabled`)\n\t\t\t}\n\n\t\t\tif (personRow.otp_uri && personRow.otp_activated_at) {\n\t\t\t\tif (!mfaOtp) {\n\t\t\t\t\treturn new ResponseError('OTP_REQUIRED', `2FA is enabled. OTP token is required`)\n\t\t\t\t}\n\n\t\t\t\tif (!this.otpAuthenticator.validate({ uri: personRow.otp_uri }, mfaOtp)) {\n\t\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait db.commandBus.execute(new InvalidateTokenCommand(tokenValidationResult.result.id))\n\t\t\tconst sessionToken = await this.apiKeyManager.createSessionApiKey(db, personRow.identity_id, expiration)\n\n\t\t\treturn new ResponseOk({ person: personRow, token: sessionToken })\n\t\t})\n\t}\n\n\tasync activatePasswordlessOtp({ db, token, requestId, otpHash }: {\n\t\tdb: DatabaseContext\n\t\trequestId: string\n\t\ttoken: string\n\t\totpHash: string\n\t}): Promise<PasswordlessSignInManager.ActivatePasswordlessOtpResponse> {\n\t\treturn db.transaction(async (db): Promise<PasswordlessSignInManager.ActivatePasswordlessOtpResponse> => {\n\n\t\t\tconst tokenResult = await db.queryHandler.fetch(PersonTokenQuery.byId(requestId, 'passwordless'))\n\t\t\tconst tokenValidationResult = validateToken({\n\t\t\t\tentry: tokenResult,\n\t\t\t\ttoken,\n\t\t\t\tnow: db.providers.now(),\n\t\t\t\tvalidationType: 'token',\n\t\t\t})\n\t\t\tif (!tokenValidationResult.ok) {\n\t\t\t\treturn tokenValidationResult\n\t\t\t}\n\n\t\t\tawait db.commandBus.execute(new ActivateOtpCommand(tokenValidationResult.result.id, otpHash))\n\n\t\t\treturn new ResponseOk(null)\n\t\t})\n\t}\n\n\tprivate isEnabled(globalValue: ConfigPolicy, personValue: boolean | null): boolean {\n\t\tswitch (globalValue) {\n\t\t\tcase 'always':\n\t\t\t\treturn true\n\t\t\tcase 'never':\n\t\t\t\treturn false\n\t\t\tcase 'optIn':\n\t\t\t\treturn personValue === true\n\t\t\tcase 'optOut':\n\t\t\t\treturn personValue !== false\n\t\t}\n\t}\n}\n\nnamespace PasswordlessSignInManager {\n\texport type InitSignInPasswordlessResponse = Response<InitSignInPasswordlessResult, InitSignInPasswordlessErrorCode>\n\n\n\tinterface SignInPasswordlessResult {\n\t\treadonly person: PersonRow\n\t\treadonly token: string\n\t}\n\texport type SignInPasswordlessResponse = Response<SignInPasswordlessResult, SignInPasswordlessErrorCode>\n\n\texport type ActivatePasswordlessOtpResponse = Response<null, ActivatePasswordlessOtpErrorCode>\n}\n\nexport { PasswordlessSignInManager }\n"],"names":["db"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PersonAccessManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PersonAccessManager.ts"],"sourcesContent":["import { PersonQuery } from '../queries'\nimport { DatabaseContext } from '../utils'\nimport { DisablePersonCommand } from '../commands/person/DisablePersonCommand'\nimport { ApiKeyManager } from './apiKey'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { DisablePersonErrorCode } from '../../schema'\n\nclass PersonAccessManager {\n\n\tconstructor(private readonly apiKeyManager: ApiKeyManager) {}\n\n\tasync disablePerson(dbContext: DatabaseContext, personId: string): Promise<PersonDisableAccessResponse> {\n\t\tconst result = await dbContext.transaction(async trx => {\n\t\t\tconst personRow = await trx.queryHandler.fetch(\n\t\t\t\tPersonQuery.byId(personId),\n\t\t\t)\n\n\t\t\tif (personRow === null) {\n\t\t\t\treturn 'PERSON_NOT_FOUND'\n\t\t\t}\n\n\t\t\tif (personRow.disabled_at !== null) {\n\t\t\t\treturn 'PERSON_ALREADY_DISABLED'\n\t\t\t}\n\n\t\t\t// Deactivate person & invalidate all api keys associated with person identity\n\t\t\tawait this.disablePersonAccount(trx, personRow.id)\n\t\t\tawait this.disableIdentityApiKeys(trx, personRow.identity_id)\n\n\t\t\treturn null\n\t\t})\n\n\t\tswitch (result) {\n\t\t\tcase null:\n\t\t\t\treturn new ResponseOk(null)\n\n\t\t\tcase 'PERSON_ALREADY_DISABLED':\n\t\t\t\treturn new ResponseError(result, 'Person is already disable')\n\n\t\t\tcase 'PERSON_NOT_FOUND':\n\t\t\t\treturn new ResponseError(result, 'Person not found')\n\t\t}\n\t}\n\n\tprivate async disablePersonAccount(dbContext: DatabaseContext, personId: string) {\n\t\tawait dbContext.commandBus.execute(new DisablePersonCommand(personId))\n\t}\n\n\tprivate async disableIdentityApiKeys(dbContext: DatabaseContext, personIdentityId: string) {\n\t\tawait this.apiKeyManager.disableIdentityApiKeys(dbContext, personIdentityId)\n\t}\n}\n\nexport type PersonDisableAccessResponse = Response<null, DisablePersonErrorCode>\n\nexport { PersonAccessManager }\n"],"names":["PersonQuery","ResponseOk","ResponseError","DisablePersonCommand"],"mappings":";;;;;;;;;;;;AAOA,MAAM,oBAAoB;AAAA,EAEzB,YAA6B,eAA8B;AAA9B,SAAA,gBAAA;AAAA,EAA+B;AAAA,EAE5D,MAAM,cAAc,WAA4B,UAAwD;AACvG,UAAM,SAAS,MAAM,UAAU,YAAY,OAAM,QAAO;AACjD,YAAA,YAAY,MAAM,IAAI,aAAa;AAAA,QACxCA,YAAA,YAAY,KAAK,QAAQ;AAAA,MAAA;AAG1B,UAAI,cAAc,MAAM;AAChB,eAAA;AAAA,MACR;AAEI,UAAA,UAAU,gBAAgB,MAAM;AAC5B,eAAA;AAAA,MACR;AAGA,YAAM,KAAK,qBAAqB,KAAK,UAAU,EAAE;AACjD,YAAM,KAAK,uBAAuB,KAAK,UAAU,WAAW;AAErD,aAAA;AAAA,IAAA,CACP;AAED,YAAQ,QAAQ;AAAA,MACf,KAAK;AACG,eAAA,IAAIC,SAAAA,WAAW,IAAI;AAAA,MAE3B,KAAK;AACG,eAAA,IAAIC,SAAc,cAAA,QAAQ,2BAA2B;AAAA,MAE7D,KAAK;AACG,eAAA,IAAIA,SAAc,cAAA,QAAQ,kBAAkB;AAAA,IACrD;AAAA,EACD;AAAA,EAEA,MAAc,qBAAqB,WAA4B,UAAkB;AAChF,UAAM,UAAU,WAAW,QAAQ,IAAIC,qBAAA,qBAAqB,QAAQ,CAAC;AAAA,EACtE;AAAA,EAEA,MAAc,uBAAuB,WAA4B,kBAA0B;AAC1F,UAAM,KAAK,cAAc,uBAAuB,WAAW,gBAAgB;AAAA,EAC5E;AACD;;"}
1
+ {"version":3,"file":"PersonAccessManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PersonAccessManager.ts"],"sourcesContent":["import { PersonQuery } from '../queries'\nimport { DatabaseContext } from '../utils'\nimport { DisablePersonCommand } from '../commands/person/DisablePersonCommand'\nimport { ApiKeyManager } from './apiKey'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { DisablePersonErrorCode } from '../../schema'\n\nclass PersonAccessManager {\n\n\tconstructor(private readonly apiKeyManager: ApiKeyManager) {}\n\n\tasync disablePerson(dbContext: DatabaseContext, personId: string): Promise<PersonDisableAccessResponse> {\n\t\tconst result = await dbContext.transaction(async trx => {\n\t\t\tconst personRow = await trx.queryHandler.fetch(\n\t\t\t\tPersonQuery.byId(personId),\n\t\t\t)\n\n\t\t\tif (personRow === null) {\n\t\t\t\treturn 'PERSON_NOT_FOUND'\n\t\t\t}\n\n\t\t\tif (personRow.disabled_at !== null) {\n\t\t\t\treturn 'PERSON_ALREADY_DISABLED'\n\t\t\t}\n\n\t\t\t// Deactivate person & invalidate all api keys associated with person identity\n\t\t\tawait this.disablePersonAccount(trx, personRow.id)\n\t\t\tawait this.disableIdentityApiKeys(trx, personRow.identity_id)\n\n\t\t\treturn null\n\t\t})\n\n\t\tswitch (result) {\n\t\t\tcase null:\n\t\t\t\treturn new ResponseOk(null)\n\n\t\t\tcase 'PERSON_ALREADY_DISABLED':\n\t\t\t\treturn new ResponseError(result, 'Person is already disable')\n\n\t\t\tcase 'PERSON_NOT_FOUND':\n\t\t\t\treturn new ResponseError(result, 'Person not found')\n\t\t}\n\t}\n\n\tprivate async disablePersonAccount(dbContext: DatabaseContext, personId: string) {\n\t\tawait dbContext.commandBus.execute(new DisablePersonCommand(personId))\n\t}\n\n\tprivate async disableIdentityApiKeys(dbContext: DatabaseContext, personIdentityId: string) {\n\t\tawait this.apiKeyManager.disableIdentityApiKeys(dbContext, personIdentityId)\n\t}\n}\n\nexport type PersonDisableAccessResponse = Response<null, DisablePersonErrorCode>\n\nexport { PersonAccessManager }\n"],"names":["PersonQuery","ResponseOk","ResponseError","DisablePersonCommand"],"mappings":";;;;;;;;;;;;AAOA,MAAM,oBAAoB;AAAA,EAEzB,YAA6B,eAA8B;AAA9B,SAAA,gBAAA;AAAA,EAAA;AAAA,EAE7B,MAAM,cAAc,WAA4B,UAAwD;AACvG,UAAM,SAAS,MAAM,UAAU,YAAY,OAAM,QAAO;AACjD,YAAA,YAAY,MAAM,IAAI,aAAa;AAAA,QACxCA,YAAA,YAAY,KAAK,QAAQ;AAAA,MAC1B;AAEA,UAAI,cAAc,MAAM;AAChB,eAAA;AAAA,MAAA;AAGJ,UAAA,UAAU,gBAAgB,MAAM;AAC5B,eAAA;AAAA,MAAA;AAIR,YAAM,KAAK,qBAAqB,KAAK,UAAU,EAAE;AACjD,YAAM,KAAK,uBAAuB,KAAK,UAAU,WAAW;AAErD,aAAA;AAAA,IAAA,CACP;AAED,YAAQ,QAAQ;AAAA,MACf,KAAK;AACG,eAAA,IAAIC,oBAAW,IAAI;AAAA,MAE3B,KAAK;AACG,eAAA,IAAIC,SAAAA,cAAc,QAAQ,2BAA2B;AAAA,MAE7D,KAAK;AACG,eAAA,IAAIA,SAAAA,cAAc,QAAQ,kBAAkB;AAAA,IAAA;AAAA,EACrD;AAAA,EAGD,MAAc,qBAAqB,WAA4B,UAAkB;AAChF,UAAM,UAAU,WAAW,QAAQ,IAAIC,qBAAA,qBAAqB,QAAQ,CAAC;AAAA,EAAA;AAAA,EAGtE,MAAc,uBAAuB,WAA4B,kBAA0B;AAC1F,UAAM,KAAK,cAAc,uBAAuB,WAAW,gBAAgB;AAAA,EAAA;AAE7E;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"PersonAccessManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PersonAccessManager.ts"],"sourcesContent":["import { PersonQuery } from '../queries'\nimport { DatabaseContext } from '../utils'\nimport { DisablePersonCommand } from '../commands/person/DisablePersonCommand'\nimport { ApiKeyManager } from './apiKey'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { DisablePersonErrorCode } from '../../schema'\n\nclass PersonAccessManager {\n\n\tconstructor(private readonly apiKeyManager: ApiKeyManager) {}\n\n\tasync disablePerson(dbContext: DatabaseContext, personId: string): Promise<PersonDisableAccessResponse> {\n\t\tconst result = await dbContext.transaction(async trx => {\n\t\t\tconst personRow = await trx.queryHandler.fetch(\n\t\t\t\tPersonQuery.byId(personId),\n\t\t\t)\n\n\t\t\tif (personRow === null) {\n\t\t\t\treturn 'PERSON_NOT_FOUND'\n\t\t\t}\n\n\t\t\tif (personRow.disabled_at !== null) {\n\t\t\t\treturn 'PERSON_ALREADY_DISABLED'\n\t\t\t}\n\n\t\t\t// Deactivate person & invalidate all api keys associated with person identity\n\t\t\tawait this.disablePersonAccount(trx, personRow.id)\n\t\t\tawait this.disableIdentityApiKeys(trx, personRow.identity_id)\n\n\t\t\treturn null\n\t\t})\n\n\t\tswitch (result) {\n\t\t\tcase null:\n\t\t\t\treturn new ResponseOk(null)\n\n\t\t\tcase 'PERSON_ALREADY_DISABLED':\n\t\t\t\treturn new ResponseError(result, 'Person is already disable')\n\n\t\t\tcase 'PERSON_NOT_FOUND':\n\t\t\t\treturn new ResponseError(result, 'Person not found')\n\t\t}\n\t}\n\n\tprivate async disablePersonAccount(dbContext: DatabaseContext, personId: string) {\n\t\tawait dbContext.commandBus.execute(new DisablePersonCommand(personId))\n\t}\n\n\tprivate async disableIdentityApiKeys(dbContext: DatabaseContext, personIdentityId: string) {\n\t\tawait this.apiKeyManager.disableIdentityApiKeys(dbContext, personIdentityId)\n\t}\n}\n\nexport type PersonDisableAccessResponse = Response<null, DisablePersonErrorCode>\n\nexport { PersonAccessManager }\n"],"names":[],"mappings":";;;;;;;;;;AAOA,MAAM,oBAAoB;AAAA,EAEzB,YAA6B,eAA8B;AAA9B,SAAA,gBAAA;AAAA,EAA+B;AAAA,EAE5D,MAAM,cAAc,WAA4B,UAAwD;AACvG,UAAM,SAAS,MAAM,UAAU,YAAY,OAAM,QAAO;AACjD,YAAA,YAAY,MAAM,IAAI,aAAa;AAAA,QACxC,YAAY,KAAK,QAAQ;AAAA,MAAA;AAG1B,UAAI,cAAc,MAAM;AAChB,eAAA;AAAA,MACR;AAEI,UAAA,UAAU,gBAAgB,MAAM;AAC5B,eAAA;AAAA,MACR;AAGA,YAAM,KAAK,qBAAqB,KAAK,UAAU,EAAE;AACjD,YAAM,KAAK,uBAAuB,KAAK,UAAU,WAAW;AAErD,aAAA;AAAA,IAAA,CACP;AAED,YAAQ,QAAQ;AAAA,MACf,KAAK;AACG,eAAA,IAAI,WAAW,IAAI;AAAA,MAE3B,KAAK;AACG,eAAA,IAAI,cAAc,QAAQ,2BAA2B;AAAA,MAE7D,KAAK;AACG,eAAA,IAAI,cAAc,QAAQ,kBAAkB;AAAA,IACrD;AAAA,EACD;AAAA,EAEA,MAAc,qBAAqB,WAA4B,UAAkB;AAChF,UAAM,UAAU,WAAW,QAAQ,IAAI,qBAAqB,QAAQ,CAAC;AAAA,EACtE;AAAA,EAEA,MAAc,uBAAuB,WAA4B,kBAA0B;AAC1F,UAAM,KAAK,cAAc,uBAAuB,WAAW,gBAAgB;AAAA,EAC5E;AACD;"}
1
+ {"version":3,"file":"PersonAccessManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PersonAccessManager.ts"],"sourcesContent":["import { PersonQuery } from '../queries'\nimport { DatabaseContext } from '../utils'\nimport { DisablePersonCommand } from '../commands/person/DisablePersonCommand'\nimport { ApiKeyManager } from './apiKey'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { DisablePersonErrorCode } from '../../schema'\n\nclass PersonAccessManager {\n\n\tconstructor(private readonly apiKeyManager: ApiKeyManager) {}\n\n\tasync disablePerson(dbContext: DatabaseContext, personId: string): Promise<PersonDisableAccessResponse> {\n\t\tconst result = await dbContext.transaction(async trx => {\n\t\t\tconst personRow = await trx.queryHandler.fetch(\n\t\t\t\tPersonQuery.byId(personId),\n\t\t\t)\n\n\t\t\tif (personRow === null) {\n\t\t\t\treturn 'PERSON_NOT_FOUND'\n\t\t\t}\n\n\t\t\tif (personRow.disabled_at !== null) {\n\t\t\t\treturn 'PERSON_ALREADY_DISABLED'\n\t\t\t}\n\n\t\t\t// Deactivate person & invalidate all api keys associated with person identity\n\t\t\tawait this.disablePersonAccount(trx, personRow.id)\n\t\t\tawait this.disableIdentityApiKeys(trx, personRow.identity_id)\n\n\t\t\treturn null\n\t\t})\n\n\t\tswitch (result) {\n\t\t\tcase null:\n\t\t\t\treturn new ResponseOk(null)\n\n\t\t\tcase 'PERSON_ALREADY_DISABLED':\n\t\t\t\treturn new ResponseError(result, 'Person is already disable')\n\n\t\t\tcase 'PERSON_NOT_FOUND':\n\t\t\t\treturn new ResponseError(result, 'Person not found')\n\t\t}\n\t}\n\n\tprivate async disablePersonAccount(dbContext: DatabaseContext, personId: string) {\n\t\tawait dbContext.commandBus.execute(new DisablePersonCommand(personId))\n\t}\n\n\tprivate async disableIdentityApiKeys(dbContext: DatabaseContext, personIdentityId: string) {\n\t\tawait this.apiKeyManager.disableIdentityApiKeys(dbContext, personIdentityId)\n\t}\n}\n\nexport type PersonDisableAccessResponse = Response<null, DisablePersonErrorCode>\n\nexport { PersonAccessManager }\n"],"names":[],"mappings":";;;;;;;;;;AAOA,MAAM,oBAAoB;AAAA,EAEzB,YAA6B,eAA8B;AAA9B,SAAA,gBAAA;AAAA,EAAA;AAAA,EAE7B,MAAM,cAAc,WAA4B,UAAwD;AACvG,UAAM,SAAS,MAAM,UAAU,YAAY,OAAM,QAAO;AACjD,YAAA,YAAY,MAAM,IAAI,aAAa;AAAA,QACxC,YAAY,KAAK,QAAQ;AAAA,MAC1B;AAEA,UAAI,cAAc,MAAM;AAChB,eAAA;AAAA,MAAA;AAGJ,UAAA,UAAU,gBAAgB,MAAM;AAC5B,eAAA;AAAA,MAAA;AAIR,YAAM,KAAK,qBAAqB,KAAK,UAAU,EAAE;AACjD,YAAM,KAAK,uBAAuB,KAAK,UAAU,WAAW;AAErD,aAAA;AAAA,IAAA,CACP;AAED,YAAQ,QAAQ;AAAA,MACf,KAAK;AACG,eAAA,IAAI,WAAW,IAAI;AAAA,MAE3B,KAAK;AACG,eAAA,IAAI,cAAc,QAAQ,2BAA2B;AAAA,MAE7D,KAAK;AACG,eAAA,IAAI,cAAc,QAAQ,kBAAkB;AAAA,IAAA;AAAA,EACrD;AAAA,EAGD,MAAc,qBAAqB,WAA4B,UAAkB;AAChF,UAAM,UAAU,WAAW,QAAQ,IAAI,qBAAqB,QAAQ,CAAC;AAAA,EAAA;AAAA,EAGtE,MAAc,uBAAuB,WAA4B,kBAA0B;AAC1F,UAAM,KAAK,cAAc,uBAAuB,WAAW,gBAAgB;AAAA,EAAA;AAE7E;"}
@@ -1 +1 @@
1
- {"version":3,"file":"PersonManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PersonManager.ts"],"sourcesContent":["import { ChangeProfileCommand, ChangeProfileData } from '../commands/person/ChangeProfileCommand'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { PersonQuery, PersonRow } from '../queries'\nimport { DatabaseContext } from '../utils'\nimport { EmailValidator, EmailValidatorError } from './EmailValidator'\nimport { TogglePersonPasswordlessCommand } from '../commands'\n\nclass PersonManager {\n\tconstructor(\n\t\tprivate readonly emailValidator: EmailValidator,\n\t) {\n\t}\n\n\tasync findPersonById(dbContext: DatabaseContext, personId: string): Promise<PersonRow | null> {\n\t\treturn await dbContext.queryHandler.fetch(\n\t\t\tPersonQuery.byId(personId),\n\t\t)\n\t}\n\n\tasync changeProfile(dbContext: DatabaseContext, person: PersonRow, data: ChangeProfileData): Promise<PersonManager.ProfileChangeResponse> {\n\t\tif (data.email !== undefined && person.email !== data.email) {\n\t\t\tconst validationError = await this.emailValidator.validateEmail(dbContext, data.email)\n\t\t\tif (validationError !== null) {\n\t\t\t\treturn new ResponseError(validationError.error, validationError.errorMessage)\n\t\t\t}\n\t\t}\n\t\tawait dbContext.commandBus.execute(new ChangeProfileCommand(person.id, data))\n\t\treturn new ResponseOk(null)\n\t}\n\n\tasync togglePasswordless(dbContext: DatabaseContext, person: PersonRow, value: boolean): Promise<Response<null, never>> {\n\t\tawait dbContext.commandBus.execute(new TogglePersonPasswordlessCommand(person.id, value))\n\t\treturn new ResponseOk(null)\n\t}\n\n}\n\nnamespace PersonManager {\n\texport type ProfileChangeResponse = Response<null, EmailValidatorError>\n}\n\nexport { PersonManager }\n"],"names":["PersonQuery","ResponseError","ChangeProfileCommand","ResponseOk","TogglePersonPasswordlessCommand"],"mappings":";;;;;;;;;;;;;;;AAOA,MAAM,cAAc;AAAA,EACnB,YACkB,gBAChB;AADgB,SAAA,iBAAA;AAAA,EAElB;AAAA,EAEA,MAAM,eAAe,WAA4B,UAA6C;AACtF,WAAA,MAAM,UAAU,aAAa;AAAA,MACnCA,YAAA,YAAY,KAAK,QAAQ;AAAA,IAAA;AAAA,EAE3B;AAAA,EAEA,MAAM,cAAc,WAA4B,QAAmB,MAAuE;AACzI,QAAI,KAAK,UAAU,UAAa,OAAO,UAAU,KAAK,OAAO;AAC5D,YAAM,kBAAkB,MAAM,KAAK,eAAe,cAAc,WAAW,KAAK,KAAK;AACrF,UAAI,oBAAoB,MAAM;AAC7B,eAAO,IAAIC,SAAA,cAAc,gBAAgB,OAAO,gBAAgB,YAAY;AAAA,MAC7E;AAAA,IACD;AACM,UAAA,UAAU,WAAW,QAAQ,IAAIC,0CAAqB,OAAO,IAAI,IAAI,CAAC;AACrE,WAAA,IAAIC,SAAAA,WAAW,IAAI;AAAA,EAC3B;AAAA,EAEA,MAAM,mBAAmB,WAA4B,QAAmB,OAAgD;AACjH,UAAA,UAAU,WAAW,QAAQ,IAAIC,gEAAgC,OAAO,IAAI,KAAK,CAAC;AACjF,WAAA,IAAID,SAAAA,WAAW,IAAI;AAAA,EAC3B;AAED;;"}
1
+ {"version":3,"file":"PersonManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PersonManager.ts"],"sourcesContent":["import { ChangeProfileCommand, ChangeProfileData } from '../commands/person/ChangeProfileCommand'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { PersonQuery, PersonRow } from '../queries'\nimport { DatabaseContext } from '../utils'\nimport { EmailValidator, EmailValidatorError } from './EmailValidator'\nimport { TogglePersonPasswordlessCommand } from '../commands'\n\nclass PersonManager {\n\tconstructor(\n\t\tprivate readonly emailValidator: EmailValidator,\n\t) {\n\t}\n\n\tasync findPersonById(dbContext: DatabaseContext, personId: string): Promise<PersonRow | null> {\n\t\treturn await dbContext.queryHandler.fetch(\n\t\t\tPersonQuery.byId(personId),\n\t\t)\n\t}\n\n\tasync changeProfile(dbContext: DatabaseContext, person: PersonRow, data: ChangeProfileData): Promise<PersonManager.ProfileChangeResponse> {\n\t\tif (data.email !== undefined && person.email !== data.email) {\n\t\t\tconst validationError = await this.emailValidator.validateEmail(dbContext, data.email)\n\t\t\tif (validationError !== null) {\n\t\t\t\treturn new ResponseError(validationError.error, validationError.errorMessage)\n\t\t\t}\n\t\t}\n\t\tawait dbContext.commandBus.execute(new ChangeProfileCommand(person.id, data))\n\t\treturn new ResponseOk(null)\n\t}\n\n\tasync togglePasswordless(dbContext: DatabaseContext, person: PersonRow, value: boolean): Promise<Response<null, never>> {\n\t\tawait dbContext.commandBus.execute(new TogglePersonPasswordlessCommand(person.id, value))\n\t\treturn new ResponseOk(null)\n\t}\n\n}\n\nnamespace PersonManager {\n\texport type ProfileChangeResponse = Response<null, EmailValidatorError>\n}\n\nexport { PersonManager }\n"],"names":["PersonQuery","ResponseError","ChangeProfileCommand","ResponseOk","TogglePersonPasswordlessCommand"],"mappings":";;;;;;;;;;;;;;;AAOA,MAAM,cAAc;AAAA,EACnB,YACkB,gBAChB;AADgB,SAAA,iBAAA;AAAA,EAAA;AAAA,EAIlB,MAAM,eAAe,WAA4B,UAA6C;AACtF,WAAA,MAAM,UAAU,aAAa;AAAA,MACnCA,YAAA,YAAY,KAAK,QAAQ;AAAA,IAC1B;AAAA,EAAA;AAAA,EAGD,MAAM,cAAc,WAA4B,QAAmB,MAAuE;AACzI,QAAI,KAAK,UAAU,UAAa,OAAO,UAAU,KAAK,OAAO;AAC5D,YAAM,kBAAkB,MAAM,KAAK,eAAe,cAAc,WAAW,KAAK,KAAK;AACrF,UAAI,oBAAoB,MAAM;AAC7B,eAAO,IAAIC,SAAAA,cAAc,gBAAgB,OAAO,gBAAgB,YAAY;AAAA,MAAA;AAAA,IAC7E;AAEK,UAAA,UAAU,WAAW,QAAQ,IAAIC,0CAAqB,OAAO,IAAI,IAAI,CAAC;AACrE,WAAA,IAAIC,oBAAW,IAAI;AAAA,EAAA;AAAA,EAG3B,MAAM,mBAAmB,WAA4B,QAAmB,OAAgD;AACjH,UAAA,UAAU,WAAW,QAAQ,IAAIC,gEAAgC,OAAO,IAAI,KAAK,CAAC;AACjF,WAAA,IAAID,oBAAW,IAAI;AAAA,EAAA;AAG5B;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"PersonManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PersonManager.ts"],"sourcesContent":["import { ChangeProfileCommand, ChangeProfileData } from '../commands/person/ChangeProfileCommand'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { PersonQuery, PersonRow } from '../queries'\nimport { DatabaseContext } from '../utils'\nimport { EmailValidator, EmailValidatorError } from './EmailValidator'\nimport { TogglePersonPasswordlessCommand } from '../commands'\n\nclass PersonManager {\n\tconstructor(\n\t\tprivate readonly emailValidator: EmailValidator,\n\t) {\n\t}\n\n\tasync findPersonById(dbContext: DatabaseContext, personId: string): Promise<PersonRow | null> {\n\t\treturn await dbContext.queryHandler.fetch(\n\t\t\tPersonQuery.byId(personId),\n\t\t)\n\t}\n\n\tasync changeProfile(dbContext: DatabaseContext, person: PersonRow, data: ChangeProfileData): Promise<PersonManager.ProfileChangeResponse> {\n\t\tif (data.email !== undefined && person.email !== data.email) {\n\t\t\tconst validationError = await this.emailValidator.validateEmail(dbContext, data.email)\n\t\t\tif (validationError !== null) {\n\t\t\t\treturn new ResponseError(validationError.error, validationError.errorMessage)\n\t\t\t}\n\t\t}\n\t\tawait dbContext.commandBus.execute(new ChangeProfileCommand(person.id, data))\n\t\treturn new ResponseOk(null)\n\t}\n\n\tasync togglePasswordless(dbContext: DatabaseContext, person: PersonRow, value: boolean): Promise<Response<null, never>> {\n\t\tawait dbContext.commandBus.execute(new TogglePersonPasswordlessCommand(person.id, value))\n\t\treturn new ResponseOk(null)\n\t}\n\n}\n\nnamespace PersonManager {\n\texport type ProfileChangeResponse = Response<null, EmailValidatorError>\n}\n\nexport { PersonManager }\n"],"names":[],"mappings":";;;;;;;;;;;;;AAOA,MAAM,cAAc;AAAA,EACnB,YACkB,gBAChB;AADgB,SAAA,iBAAA;AAAA,EAElB;AAAA,EAEA,MAAM,eAAe,WAA4B,UAA6C;AACtF,WAAA,MAAM,UAAU,aAAa;AAAA,MACnC,YAAY,KAAK,QAAQ;AAAA,IAAA;AAAA,EAE3B;AAAA,EAEA,MAAM,cAAc,WAA4B,QAAmB,MAAuE;AACzI,QAAI,KAAK,UAAU,UAAa,OAAO,UAAU,KAAK,OAAO;AAC5D,YAAM,kBAAkB,MAAM,KAAK,eAAe,cAAc,WAAW,KAAK,KAAK;AACrF,UAAI,oBAAoB,MAAM;AAC7B,eAAO,IAAI,cAAc,gBAAgB,OAAO,gBAAgB,YAAY;AAAA,MAC7E;AAAA,IACD;AACM,UAAA,UAAU,WAAW,QAAQ,IAAI,qBAAqB,OAAO,IAAI,IAAI,CAAC;AACrE,WAAA,IAAI,WAAW,IAAI;AAAA,EAC3B;AAAA,EAEA,MAAM,mBAAmB,WAA4B,QAAmB,OAAgD;AACjH,UAAA,UAAU,WAAW,QAAQ,IAAI,gCAAgC,OAAO,IAAI,KAAK,CAAC;AACjF,WAAA,IAAI,WAAW,IAAI;AAAA,EAC3B;AAED;"}
1
+ {"version":3,"file":"PersonManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/PersonManager.ts"],"sourcesContent":["import { ChangeProfileCommand, ChangeProfileData } from '../commands/person/ChangeProfileCommand'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { PersonQuery, PersonRow } from '../queries'\nimport { DatabaseContext } from '../utils'\nimport { EmailValidator, EmailValidatorError } from './EmailValidator'\nimport { TogglePersonPasswordlessCommand } from '../commands'\n\nclass PersonManager {\n\tconstructor(\n\t\tprivate readonly emailValidator: EmailValidator,\n\t) {\n\t}\n\n\tasync findPersonById(dbContext: DatabaseContext, personId: string): Promise<PersonRow | null> {\n\t\treturn await dbContext.queryHandler.fetch(\n\t\t\tPersonQuery.byId(personId),\n\t\t)\n\t}\n\n\tasync changeProfile(dbContext: DatabaseContext, person: PersonRow, data: ChangeProfileData): Promise<PersonManager.ProfileChangeResponse> {\n\t\tif (data.email !== undefined && person.email !== data.email) {\n\t\t\tconst validationError = await this.emailValidator.validateEmail(dbContext, data.email)\n\t\t\tif (validationError !== null) {\n\t\t\t\treturn new ResponseError(validationError.error, validationError.errorMessage)\n\t\t\t}\n\t\t}\n\t\tawait dbContext.commandBus.execute(new ChangeProfileCommand(person.id, data))\n\t\treturn new ResponseOk(null)\n\t}\n\n\tasync togglePasswordless(dbContext: DatabaseContext, person: PersonRow, value: boolean): Promise<Response<null, never>> {\n\t\tawait dbContext.commandBus.execute(new TogglePersonPasswordlessCommand(person.id, value))\n\t\treturn new ResponseOk(null)\n\t}\n\n}\n\nnamespace PersonManager {\n\texport type ProfileChangeResponse = Response<null, EmailValidatorError>\n}\n\nexport { PersonManager }\n"],"names":[],"mappings":";;;;;;;;;;;;;AAOA,MAAM,cAAc;AAAA,EACnB,YACkB,gBAChB;AADgB,SAAA,iBAAA;AAAA,EAAA;AAAA,EAIlB,MAAM,eAAe,WAA4B,UAA6C;AACtF,WAAA,MAAM,UAAU,aAAa;AAAA,MACnC,YAAY,KAAK,QAAQ;AAAA,IAC1B;AAAA,EAAA;AAAA,EAGD,MAAM,cAAc,WAA4B,QAAmB,MAAuE;AACzI,QAAI,KAAK,UAAU,UAAa,OAAO,UAAU,KAAK,OAAO;AAC5D,YAAM,kBAAkB,MAAM,KAAK,eAAe,cAAc,WAAW,KAAK,KAAK;AACrF,UAAI,oBAAoB,MAAM;AAC7B,eAAO,IAAI,cAAc,gBAAgB,OAAO,gBAAgB,YAAY;AAAA,MAAA;AAAA,IAC7E;AAEK,UAAA,UAAU,WAAW,QAAQ,IAAI,qBAAqB,OAAO,IAAI,IAAI,CAAC;AACrE,WAAA,IAAI,WAAW,IAAI;AAAA,EAAA;AAAA,EAG3B,MAAM,mBAAmB,WAA4B,QAAmB,OAAgD;AACjH,UAAA,UAAU,WAAW,QAAQ,IAAI,gCAAgC,OAAO,IAAI,KAAK,CAAC;AACjF,WAAA,IAAI,WAAW,IAAI;AAAA,EAAA;AAG5B;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/ProjectManager.ts"],"sourcesContent":["import {\n\tAddProjectMemberCommand,\n\tCreateProjectCommand,\n\tSetProjectSecretCommand,\n\tUpdateProjectCommand,\n} from '../commands'\nimport { PermissionContext } from '../authorization'\nimport { Project, ProjectInitializer, ProjectWithSecrets } from '../type'\nimport { ProjectBySlugQuery, ProjectsByIdentityQuery, ProjectsQuery, ProjectUpdateTimestampQuery } from '../queries'\nimport { SecretsManager } from './SecretsManager'\nimport { DatabaseContext, TokenHash } from '../utils'\nimport { createSetMembershipVariables } from './membershipUtils'\nimport { ImplementationException } from '../../exceptions'\nimport { ProjectRole } from '@contember/schema'\nimport { ApiKeyService, CreateApiKeyResult } from './apiKey'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { CreateProjectResponseErrorCode } from '../../schema'\nimport { Logger } from '@contember/logger'\n\nexport class ProjectManager {\n\tconstructor(\n\t\tprivate readonly secretManager: SecretsManager,\n\t\tprivate readonly projectIntializer: ProjectInitializer,\n\t\tprivate readonly apiKeyService: ApiKeyService,\n\t) {}\n\n\tpublic async createProject(\n\t\tdbContext: DatabaseContext,\n\t\tlogger: Logger,\n\t\tproject: Pick<ProjectWithSecrets, 'name' | 'slug' | 'config' | 'secrets'>,\n\t\toptions: {\n\t\t\townerIdentityId?: string\n\t\t\tdeployTokenHash?: TokenHash\n\t\t\tnoDeployToken?: boolean\n\t\t},\n\t): Promise<CreateProjectResponse> {\n\t\treturn await dbContext.transaction(async (db): Promise<CreateProjectResponse> => {\n\t\t\tconst bus = db.commandBus\n\n\t\t\tconst now = db.providers.now()\n\t\t\tconst projectId = await bus.execute(new CreateProjectCommand(project, now))\n\t\t\tif (!projectId) {\n\t\t\t\treturn new ResponseError('ALREADY_EXISTS', `Project ${project.slug} already exists`)\n\t\t\t}\n\t\t\tfor (const [key, value] of Object.entries(project.secrets)) {\n\t\t\t\tawait bus.execute(new SetProjectSecretCommand(projectId, key, Buffer.from(value)))\n\t\t\t}\n\t\t\tif (options.ownerIdentityId) {\n\t\t\t\tconst memberships = createSetMembershipVariables([{ role: ProjectRole.ADMIN, variables: [] }])\n\t\t\t\tconst addProjectMemberCommand = new AddProjectMemberCommand(projectId, options.ownerIdentityId, memberships)\n\t\t\t\tconst addMemberResult = await db.commandBus.execute(addProjectMemberCommand)\n\t\t\t\tif (!addMemberResult.ok) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst deployMembership = [{ role: ProjectRole.DEPLOYER, variables: [] }]\n\t\t\tconst deployKeyDescription = `Deploy key for ${project.slug}`\n\t\t\tconst deployResult = options.noDeployToken === true\n\t\t\t\t? undefined\n\t\t\t\t: await this.apiKeyService.createProjectPermanentApiKey(db, projectId, deployMembership, deployKeyDescription, options.deployTokenHash)\n\n\t\t\ttry {\n\t\t\t\tawait this.projectIntializer.initializeProject({\n\t\t\t\t\tid: projectId,\n\t\t\t\t\t...project,\n\t\t\t\t\tupdatedAt: now,\n\t\t\t\t}, logger)\n\t\t\t} catch (e) {\n\t\t\t\tlogger.error(e, { message: 'Project initialization failed' })\n\t\t\t\tawait db.client.connection.rollback()\n\t\t\t\treturn new ResponseError(\n\t\t\t\t\t'INIT_ERROR',\n\t\t\t\t\t`Project initialization error: ${e instanceof Error && 'message' in e ? e.message : 'unknown'}`,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn new ResponseOk(new CreateProjectResult(deployResult?.result))\n\t\t})\n\t}\n\n\tpublic async updateProject(dbContext: DatabaseContext, id: string, data: Partial<Pick<Project, 'name' | 'config'>>): Promise<void> {\n\t\tawait dbContext.commandBus.execute(new UpdateProjectCommand(id, data))\n\t}\n\n\tpublic async getProjectBySlug(dbContext: DatabaseContext, slug: string): Promise<Project | null> {\n\t\treturn await dbContext.queryHandler.fetch(new ProjectBySlugQuery(slug))\n\t}\n\n\tpublic async getProjectState(dbContext: DatabaseContext, slug: string, updatedAt: Date): Promise<'valid' | 'updated' | 'not_found'> {\n\t\tconst updatedNew = await dbContext.queryHandler.fetch(new ProjectUpdateTimestampQuery(slug))\n\t\tif (!updatedNew) {\n\t\t\treturn 'not_found'\n\t\t}\n\t\treturn updatedNew > updatedAt ? 'updated' : 'valid'\n\t}\n\n\tpublic async getProjectWithSecretsBySlug(dbContext: DatabaseContext, slug: string, alias: boolean): Promise<ProjectWithSecrets | null> {\n\t\tconst project = await dbContext.queryHandler.fetch(new ProjectBySlugQuery(slug, alias))\n\t\tif (!project) {\n\t\t\treturn null\n\t\t}\n\t\tconst secrets = await this.secretManager.readSecrets(dbContext, project.id)\n\t\treturn { ...project, secrets }\n\t}\n\n\tpublic async getProjects(dbContext: DatabaseContext): Promise<Project[]> {\n\t\treturn await dbContext.queryHandler.fetch(new ProjectsQuery())\n\t}\n\n\tpublic async getProjectsByIdentity(dbContext: DatabaseContext, identityId: string, permissionContext: PermissionContext): Promise<Project[]> {\n\t\treturn await dbContext.queryHandler.fetch(new ProjectsByIdentityQuery(identityId, permissionContext))\n\t}\n}\n\nexport class ProjectInitError extends Error {}\n\n\nexport type CreateProjectResponse = Response<CreateProjectResult, CreateProjectResponseErrorCode>\n\nexport class CreateProjectResult {\n\tconstructor(public readonly deployerApiKey?: CreateApiKeyResult) {\n\t}\n}\n"],"names":["CreateProjectCommand","ResponseError","SetProjectSecretCommand","createSetMembershipVariables","ProjectRole","AddProjectMemberCommand","ImplementationException","ResponseOk","UpdateProjectCommand","ProjectBySlugQuery","ProjectUpdateTimestampQuery","ProjectsQuery","ProjectsByIdentityQuery"],"mappings":"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"}
1
+ {"version":3,"file":"ProjectManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/ProjectManager.ts"],"sourcesContent":["import {\n\tAddProjectMemberCommand,\n\tCreateProjectCommand,\n\tSetProjectSecretCommand,\n\tUpdateProjectCommand,\n} from '../commands'\nimport { PermissionContext } from '../authorization'\nimport { Project, ProjectInitializer, ProjectWithSecrets } from '../type'\nimport { ProjectBySlugQuery, ProjectsByIdentityQuery, ProjectsQuery, ProjectUpdateTimestampQuery } from '../queries'\nimport { SecretsManager } from './SecretsManager'\nimport { DatabaseContext, TokenHash } from '../utils'\nimport { createSetMembershipVariables } from './membershipUtils'\nimport { ImplementationException } from '../../exceptions'\nimport { ProjectRole } from '@contember/schema'\nimport { ApiKeyService, CreateApiKeyResult } from './apiKey'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { CreateProjectResponseErrorCode } from '../../schema'\nimport { Logger } from '@contember/logger'\n\nexport class ProjectManager {\n\tconstructor(\n\t\tprivate readonly secretManager: SecretsManager,\n\t\tprivate readonly projectIntializer: ProjectInitializer,\n\t\tprivate readonly apiKeyService: ApiKeyService,\n\t) {}\n\n\tpublic async createProject(\n\t\tdbContext: DatabaseContext,\n\t\tlogger: Logger,\n\t\tproject: Pick<ProjectWithSecrets, 'name' | 'slug' | 'config' | 'secrets'>,\n\t\toptions: {\n\t\t\townerIdentityId?: string\n\t\t\tdeployTokenHash?: TokenHash\n\t\t\tnoDeployToken?: boolean\n\t\t},\n\t): Promise<CreateProjectResponse> {\n\t\treturn await dbContext.transaction(async (db): Promise<CreateProjectResponse> => {\n\t\t\tconst bus = db.commandBus\n\n\t\t\tconst now = db.providers.now()\n\t\t\tconst projectId = await bus.execute(new CreateProjectCommand(project, now))\n\t\t\tif (!projectId) {\n\t\t\t\treturn new ResponseError('ALREADY_EXISTS', `Project ${project.slug} already exists`)\n\t\t\t}\n\t\t\tfor (const [key, value] of Object.entries(project.secrets)) {\n\t\t\t\tawait bus.execute(new SetProjectSecretCommand(projectId, key, Buffer.from(value)))\n\t\t\t}\n\t\t\tif (options.ownerIdentityId) {\n\t\t\t\tconst memberships = createSetMembershipVariables([{ role: ProjectRole.ADMIN, variables: [] }])\n\t\t\t\tconst addProjectMemberCommand = new AddProjectMemberCommand(projectId, options.ownerIdentityId, memberships)\n\t\t\t\tconst addMemberResult = await db.commandBus.execute(addProjectMemberCommand)\n\t\t\t\tif (!addMemberResult.ok) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst deployMembership = [{ role: ProjectRole.DEPLOYER, variables: [] }]\n\t\t\tconst deployKeyDescription = `Deploy key for ${project.slug}`\n\t\t\tconst deployResult = options.noDeployToken === true\n\t\t\t\t? undefined\n\t\t\t\t: await this.apiKeyService.createProjectPermanentApiKey(db, projectId, deployMembership, deployKeyDescription, options.deployTokenHash)\n\n\t\t\ttry {\n\t\t\t\tawait this.projectIntializer.initializeProject({\n\t\t\t\t\tid: projectId,\n\t\t\t\t\t...project,\n\t\t\t\t\tupdatedAt: now,\n\t\t\t\t}, logger)\n\t\t\t} catch (e) {\n\t\t\t\tlogger.error(e, { message: 'Project initialization failed' })\n\t\t\t\tawait db.client.connection.rollback()\n\t\t\t\treturn new ResponseError(\n\t\t\t\t\t'INIT_ERROR',\n\t\t\t\t\t`Project initialization error: ${e instanceof Error && 'message' in e ? e.message : 'unknown'}`,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn new ResponseOk(new CreateProjectResult(deployResult?.result))\n\t\t})\n\t}\n\n\tpublic async updateProject(dbContext: DatabaseContext, id: string, data: Partial<Pick<Project, 'name' | 'config'>>): Promise<void> {\n\t\tawait dbContext.commandBus.execute(new UpdateProjectCommand(id, data))\n\t}\n\n\tpublic async getProjectBySlug(dbContext: DatabaseContext, slug: string): Promise<Project | null> {\n\t\treturn await dbContext.queryHandler.fetch(new ProjectBySlugQuery(slug))\n\t}\n\n\tpublic async getProjectState(dbContext: DatabaseContext, slug: string, updatedAt: Date): Promise<'valid' | 'updated' | 'not_found'> {\n\t\tconst updatedNew = await dbContext.queryHandler.fetch(new ProjectUpdateTimestampQuery(slug))\n\t\tif (!updatedNew) {\n\t\t\treturn 'not_found'\n\t\t}\n\t\treturn updatedNew > updatedAt ? 'updated' : 'valid'\n\t}\n\n\tpublic async getProjectWithSecretsBySlug(dbContext: DatabaseContext, slug: string, alias: boolean): Promise<ProjectWithSecrets | null> {\n\t\tconst project = await dbContext.queryHandler.fetch(new ProjectBySlugQuery(slug, alias))\n\t\tif (!project) {\n\t\t\treturn null\n\t\t}\n\t\tconst secrets = await this.secretManager.readSecrets(dbContext, project.id)\n\t\treturn { ...project, secrets }\n\t}\n\n\tpublic async getProjects(dbContext: DatabaseContext): Promise<Project[]> {\n\t\treturn await dbContext.queryHandler.fetch(new ProjectsQuery())\n\t}\n\n\tpublic async getProjectsByIdentity(dbContext: DatabaseContext, identityId: string, permissionContext: PermissionContext): Promise<Project[]> {\n\t\treturn await dbContext.queryHandler.fetch(new ProjectsByIdentityQuery(identityId, permissionContext))\n\t}\n}\n\nexport class ProjectInitError extends Error {}\n\n\nexport type CreateProjectResponse = Response<CreateProjectResult, CreateProjectResponseErrorCode>\n\nexport class CreateProjectResult {\n\tconstructor(public readonly deployerApiKey?: CreateApiKeyResult) {\n\t}\n}\n"],"names":["CreateProjectCommand","ResponseError","SetProjectSecretCommand","createSetMembershipVariables","ProjectRole","AddProjectMemberCommand","ImplementationException","ResponseOk","UpdateProjectCommand","ProjectBySlugQuery","ProjectUpdateTimestampQuery","ProjectsQuery","ProjectsByIdentityQuery"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/ProjectManager.ts"],"sourcesContent":["import {\n\tAddProjectMemberCommand,\n\tCreateProjectCommand,\n\tSetProjectSecretCommand,\n\tUpdateProjectCommand,\n} from '../commands'\nimport { PermissionContext } from '../authorization'\nimport { Project, ProjectInitializer, ProjectWithSecrets } from '../type'\nimport { ProjectBySlugQuery, ProjectsByIdentityQuery, ProjectsQuery, ProjectUpdateTimestampQuery } from '../queries'\nimport { SecretsManager } from './SecretsManager'\nimport { DatabaseContext, TokenHash } from '../utils'\nimport { createSetMembershipVariables } from './membershipUtils'\nimport { ImplementationException } from '../../exceptions'\nimport { ProjectRole } from '@contember/schema'\nimport { ApiKeyService, CreateApiKeyResult } from './apiKey'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { CreateProjectResponseErrorCode } from '../../schema'\nimport { Logger } from '@contember/logger'\n\nexport class ProjectManager {\n\tconstructor(\n\t\tprivate readonly secretManager: SecretsManager,\n\t\tprivate readonly projectIntializer: ProjectInitializer,\n\t\tprivate readonly apiKeyService: ApiKeyService,\n\t) {}\n\n\tpublic async createProject(\n\t\tdbContext: DatabaseContext,\n\t\tlogger: Logger,\n\t\tproject: Pick<ProjectWithSecrets, 'name' | 'slug' | 'config' | 'secrets'>,\n\t\toptions: {\n\t\t\townerIdentityId?: string\n\t\t\tdeployTokenHash?: TokenHash\n\t\t\tnoDeployToken?: boolean\n\t\t},\n\t): Promise<CreateProjectResponse> {\n\t\treturn await dbContext.transaction(async (db): Promise<CreateProjectResponse> => {\n\t\t\tconst bus = db.commandBus\n\n\t\t\tconst now = db.providers.now()\n\t\t\tconst projectId = await bus.execute(new CreateProjectCommand(project, now))\n\t\t\tif (!projectId) {\n\t\t\t\treturn new ResponseError('ALREADY_EXISTS', `Project ${project.slug} already exists`)\n\t\t\t}\n\t\t\tfor (const [key, value] of Object.entries(project.secrets)) {\n\t\t\t\tawait bus.execute(new SetProjectSecretCommand(projectId, key, Buffer.from(value)))\n\t\t\t}\n\t\t\tif (options.ownerIdentityId) {\n\t\t\t\tconst memberships = createSetMembershipVariables([{ role: ProjectRole.ADMIN, variables: [] }])\n\t\t\t\tconst addProjectMemberCommand = new AddProjectMemberCommand(projectId, options.ownerIdentityId, memberships)\n\t\t\t\tconst addMemberResult = await db.commandBus.execute(addProjectMemberCommand)\n\t\t\t\tif (!addMemberResult.ok) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst deployMembership = [{ role: ProjectRole.DEPLOYER, variables: [] }]\n\t\t\tconst deployKeyDescription = `Deploy key for ${project.slug}`\n\t\t\tconst deployResult = options.noDeployToken === true\n\t\t\t\t? undefined\n\t\t\t\t: await this.apiKeyService.createProjectPermanentApiKey(db, projectId, deployMembership, deployKeyDescription, options.deployTokenHash)\n\n\t\t\ttry {\n\t\t\t\tawait this.projectIntializer.initializeProject({\n\t\t\t\t\tid: projectId,\n\t\t\t\t\t...project,\n\t\t\t\t\tupdatedAt: now,\n\t\t\t\t}, logger)\n\t\t\t} catch (e) {\n\t\t\t\tlogger.error(e, { message: 'Project initialization failed' })\n\t\t\t\tawait db.client.connection.rollback()\n\t\t\t\treturn new ResponseError(\n\t\t\t\t\t'INIT_ERROR',\n\t\t\t\t\t`Project initialization error: ${e instanceof Error && 'message' in e ? e.message : 'unknown'}`,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn new ResponseOk(new CreateProjectResult(deployResult?.result))\n\t\t})\n\t}\n\n\tpublic async updateProject(dbContext: DatabaseContext, id: string, data: Partial<Pick<Project, 'name' | 'config'>>): Promise<void> {\n\t\tawait dbContext.commandBus.execute(new UpdateProjectCommand(id, data))\n\t}\n\n\tpublic async getProjectBySlug(dbContext: DatabaseContext, slug: string): Promise<Project | null> {\n\t\treturn await dbContext.queryHandler.fetch(new ProjectBySlugQuery(slug))\n\t}\n\n\tpublic async getProjectState(dbContext: DatabaseContext, slug: string, updatedAt: Date): Promise<'valid' | 'updated' | 'not_found'> {\n\t\tconst updatedNew = await dbContext.queryHandler.fetch(new ProjectUpdateTimestampQuery(slug))\n\t\tif (!updatedNew) {\n\t\t\treturn 'not_found'\n\t\t}\n\t\treturn updatedNew > updatedAt ? 'updated' : 'valid'\n\t}\n\n\tpublic async getProjectWithSecretsBySlug(dbContext: DatabaseContext, slug: string, alias: boolean): Promise<ProjectWithSecrets | null> {\n\t\tconst project = await dbContext.queryHandler.fetch(new ProjectBySlugQuery(slug, alias))\n\t\tif (!project) {\n\t\t\treturn null\n\t\t}\n\t\tconst secrets = await this.secretManager.readSecrets(dbContext, project.id)\n\t\treturn { ...project, secrets }\n\t}\n\n\tpublic async getProjects(dbContext: DatabaseContext): Promise<Project[]> {\n\t\treturn await dbContext.queryHandler.fetch(new ProjectsQuery())\n\t}\n\n\tpublic async getProjectsByIdentity(dbContext: DatabaseContext, identityId: string, permissionContext: PermissionContext): Promise<Project[]> {\n\t\treturn await dbContext.queryHandler.fetch(new ProjectsByIdentityQuery(identityId, permissionContext))\n\t}\n}\n\nexport class ProjectInitError extends Error {}\n\n\nexport type CreateProjectResponse = Response<CreateProjectResult, CreateProjectResponseErrorCode>\n\nexport class CreateProjectResult {\n\tconstructor(public readonly deployerApiKey?: CreateApiKeyResult) {\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAmBO,MAAM,eAAe;AAAA,EAC3B,YACkB,eACA,mBACA,eAChB;AAHgB,SAAA,gBAAA;AACA,SAAA,oBAAA;AACA,SAAA,gBAAA;AAAA,EACf;AAAA,EAEH,MAAa,cACZ,WACA,QACA,SACA,SAKiC;AACjC,WAAO,MAAM,UAAU,YAAY,OAAO,OAAuC;AAChF,YAAM,MAAM,GAAG;AAET,YAAA,MAAM,GAAG,UAAU,IAAI;AACvB,YAAA,YAAY,MAAM,IAAI,QAAQ,IAAI,qBAAqB,SAAS,GAAG,CAAC;AAC1E,UAAI,CAAC,WAAW;AACf,eAAO,IAAI,cAAc,kBAAkB,WAAW,QAAQ,IAAI,iBAAiB;AAAA,MACpF;AACW,iBAAA,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,OAAO,GAAG;AACrD,cAAA,IAAI,QAAQ,IAAI,wBAAwB,WAAW,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC;AAAA,MAClF;AACA,UAAI,QAAQ,iBAAiB;AACtB,cAAA,cAAc,6BAA6B,CAAC,EAAE,MAAM,YAAY,OAAO,WAAW,GAAI,CAAA,CAAC;AAC7F,cAAM,0BAA0B,IAAI,wBAAwB,WAAW,QAAQ,iBAAiB,WAAW;AAC3G,cAAM,kBAAkB,MAAM,GAAG,WAAW,QAAQ,uBAAuB;AACvE,YAAA,CAAC,gBAAgB,IAAI;AACxB,gBAAM,IAAI,wBAAwB;AAAA,QACnC;AAAA,MACD;AAEM,YAAA,mBAAmB,CAAC,EAAE,MAAM,YAAY,UAAU,WAAW,CAAC,EAAA,CAAG;AACjE,YAAA,uBAAuB,kBAAkB,QAAQ,IAAI;AAC3D,YAAM,eAAe,QAAQ,kBAAkB,OAC5C,SACA,MAAM,KAAK,cAAc,6BAA6B,IAAI,WAAW,kBAAkB,sBAAsB,QAAQ,eAAe;AAEnI,UAAA;AACG,cAAA,KAAK,kBAAkB,kBAAkB;AAAA,UAC9C,IAAI;AAAA,UACJ,GAAG;AAAA,UACH,WAAW;AAAA,WACT,MAAM;AAAA,eACD,GAAG;AACX,eAAO,MAAM,GAAG,EAAE,SAAS,gCAAiC,CAAA;AACtD,cAAA,GAAG,OAAO,WAAW,SAAS;AACpC,eAAO,IAAI;AAAA,UACV;AAAA,UACA,iCAAiC,aAAa,SAAS,aAAa,IAAI,EAAE,UAAU,SAAS;AAAA,QAAA;AAAA,MAE/F;AAEA,aAAO,IAAI,WAAW,IAAI,oBAAoB,cAAc,MAAM,CAAC;AAAA,IAAA,CACnE;AAAA,EACF;AAAA,EAEA,MAAa,cAAc,WAA4B,IAAY,MAAgE;AAClI,UAAM,UAAU,WAAW,QAAQ,IAAI,qBAAqB,IAAI,IAAI,CAAC;AAAA,EACtE;AAAA,EAEA,MAAa,iBAAiB,WAA4B,MAAuC;AAChG,WAAO,MAAM,UAAU,aAAa,MAAM,IAAI,mBAAmB,IAAI,CAAC;AAAA,EACvE;AAAA,EAEA,MAAa,gBAAgB,WAA4B,MAAc,WAA6D;AAC7H,UAAA,aAAa,MAAM,UAAU,aAAa,MAAM,IAAI,4BAA4B,IAAI,CAAC;AAC3F,QAAI,CAAC,YAAY;AACT,aAAA;AAAA,IACR;AACO,WAAA,aAAa,YAAY,YAAY;AAAA,EAC7C;AAAA,EAEA,MAAa,4BAA4B,WAA4B,MAAc,OAAoD;AAChI,UAAA,UAAU,MAAM,UAAU,aAAa,MAAM,IAAI,mBAAmB,MAAM,KAAK,CAAC;AACtF,QAAI,CAAC,SAAS;AACN,aAAA;AAAA,IACR;AACA,UAAM,UAAU,MAAM,KAAK,cAAc,YAAY,WAAW,QAAQ,EAAE;AACnE,WAAA,EAAE,GAAG,SAAS;EACtB;AAAA,EAEA,MAAa,YAAY,WAAgD;AACxE,WAAO,MAAM,UAAU,aAAa,MAAM,IAAI,cAAe,CAAA;AAAA,EAC9D;AAAA,EAEA,MAAa,sBAAsB,WAA4B,YAAoB,mBAA0D;AACrI,WAAA,MAAM,UAAU,aAAa,MAAM,IAAI,wBAAwB,YAAY,iBAAiB,CAAC;AAAA,EACrG;AACD;AAEO,MAAM,yBAAyB,MAAM;AAAC;AAKtC,MAAM,oBAAoB;AAAA,EAChC,YAA4B,gBAAqC;AAArC,SAAA,iBAAA;AAAA,EAC5B;AACD;"}
1
+ {"version":3,"file":"ProjectManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/ProjectManager.ts"],"sourcesContent":["import {\n\tAddProjectMemberCommand,\n\tCreateProjectCommand,\n\tSetProjectSecretCommand,\n\tUpdateProjectCommand,\n} from '../commands'\nimport { PermissionContext } from '../authorization'\nimport { Project, ProjectInitializer, ProjectWithSecrets } from '../type'\nimport { ProjectBySlugQuery, ProjectsByIdentityQuery, ProjectsQuery, ProjectUpdateTimestampQuery } from '../queries'\nimport { SecretsManager } from './SecretsManager'\nimport { DatabaseContext, TokenHash } from '../utils'\nimport { createSetMembershipVariables } from './membershipUtils'\nimport { ImplementationException } from '../../exceptions'\nimport { ProjectRole } from '@contember/schema'\nimport { ApiKeyService, CreateApiKeyResult } from './apiKey'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { CreateProjectResponseErrorCode } from '../../schema'\nimport { Logger } from '@contember/logger'\n\nexport class ProjectManager {\n\tconstructor(\n\t\tprivate readonly secretManager: SecretsManager,\n\t\tprivate readonly projectIntializer: ProjectInitializer,\n\t\tprivate readonly apiKeyService: ApiKeyService,\n\t) {}\n\n\tpublic async createProject(\n\t\tdbContext: DatabaseContext,\n\t\tlogger: Logger,\n\t\tproject: Pick<ProjectWithSecrets, 'name' | 'slug' | 'config' | 'secrets'>,\n\t\toptions: {\n\t\t\townerIdentityId?: string\n\t\t\tdeployTokenHash?: TokenHash\n\t\t\tnoDeployToken?: boolean\n\t\t},\n\t): Promise<CreateProjectResponse> {\n\t\treturn await dbContext.transaction(async (db): Promise<CreateProjectResponse> => {\n\t\t\tconst bus = db.commandBus\n\n\t\t\tconst now = db.providers.now()\n\t\t\tconst projectId = await bus.execute(new CreateProjectCommand(project, now))\n\t\t\tif (!projectId) {\n\t\t\t\treturn new ResponseError('ALREADY_EXISTS', `Project ${project.slug} already exists`)\n\t\t\t}\n\t\t\tfor (const [key, value] of Object.entries(project.secrets)) {\n\t\t\t\tawait bus.execute(new SetProjectSecretCommand(projectId, key, Buffer.from(value)))\n\t\t\t}\n\t\t\tif (options.ownerIdentityId) {\n\t\t\t\tconst memberships = createSetMembershipVariables([{ role: ProjectRole.ADMIN, variables: [] }])\n\t\t\t\tconst addProjectMemberCommand = new AddProjectMemberCommand(projectId, options.ownerIdentityId, memberships)\n\t\t\t\tconst addMemberResult = await db.commandBus.execute(addProjectMemberCommand)\n\t\t\t\tif (!addMemberResult.ok) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst deployMembership = [{ role: ProjectRole.DEPLOYER, variables: [] }]\n\t\t\tconst deployKeyDescription = `Deploy key for ${project.slug}`\n\t\t\tconst deployResult = options.noDeployToken === true\n\t\t\t\t? undefined\n\t\t\t\t: await this.apiKeyService.createProjectPermanentApiKey(db, projectId, deployMembership, deployKeyDescription, options.deployTokenHash)\n\n\t\t\ttry {\n\t\t\t\tawait this.projectIntializer.initializeProject({\n\t\t\t\t\tid: projectId,\n\t\t\t\t\t...project,\n\t\t\t\t\tupdatedAt: now,\n\t\t\t\t}, logger)\n\t\t\t} catch (e) {\n\t\t\t\tlogger.error(e, { message: 'Project initialization failed' })\n\t\t\t\tawait db.client.connection.rollback()\n\t\t\t\treturn new ResponseError(\n\t\t\t\t\t'INIT_ERROR',\n\t\t\t\t\t`Project initialization error: ${e instanceof Error && 'message' in e ? e.message : 'unknown'}`,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn new ResponseOk(new CreateProjectResult(deployResult?.result))\n\t\t})\n\t}\n\n\tpublic async updateProject(dbContext: DatabaseContext, id: string, data: Partial<Pick<Project, 'name' | 'config'>>): Promise<void> {\n\t\tawait dbContext.commandBus.execute(new UpdateProjectCommand(id, data))\n\t}\n\n\tpublic async getProjectBySlug(dbContext: DatabaseContext, slug: string): Promise<Project | null> {\n\t\treturn await dbContext.queryHandler.fetch(new ProjectBySlugQuery(slug))\n\t}\n\n\tpublic async getProjectState(dbContext: DatabaseContext, slug: string, updatedAt: Date): Promise<'valid' | 'updated' | 'not_found'> {\n\t\tconst updatedNew = await dbContext.queryHandler.fetch(new ProjectUpdateTimestampQuery(slug))\n\t\tif (!updatedNew) {\n\t\t\treturn 'not_found'\n\t\t}\n\t\treturn updatedNew > updatedAt ? 'updated' : 'valid'\n\t}\n\n\tpublic async getProjectWithSecretsBySlug(dbContext: DatabaseContext, slug: string, alias: boolean): Promise<ProjectWithSecrets | null> {\n\t\tconst project = await dbContext.queryHandler.fetch(new ProjectBySlugQuery(slug, alias))\n\t\tif (!project) {\n\t\t\treturn null\n\t\t}\n\t\tconst secrets = await this.secretManager.readSecrets(dbContext, project.id)\n\t\treturn { ...project, secrets }\n\t}\n\n\tpublic async getProjects(dbContext: DatabaseContext): Promise<Project[]> {\n\t\treturn await dbContext.queryHandler.fetch(new ProjectsQuery())\n\t}\n\n\tpublic async getProjectsByIdentity(dbContext: DatabaseContext, identityId: string, permissionContext: PermissionContext): Promise<Project[]> {\n\t\treturn await dbContext.queryHandler.fetch(new ProjectsByIdentityQuery(identityId, permissionContext))\n\t}\n}\n\nexport class ProjectInitError extends Error {}\n\n\nexport type CreateProjectResponse = Response<CreateProjectResult, CreateProjectResponseErrorCode>\n\nexport class CreateProjectResult {\n\tconstructor(public readonly deployerApiKey?: CreateApiKeyResult) {\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectMemberManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/ProjectMemberManager.ts"],"sourcesContent":["import {\n\tAddProjectMemberCommand,\n\tMembershipUpdateInput,\n\tRemoveProjectMemberCommand,\n\tRemoveProjectMemberResponse,\n\tUpdateProjectMemberCommand,\n\tUpdateProjectMemberResponse,\n} from '../commands'\nimport { ProjectMembershipByIdentityQuery, ProjectMembersQuery } from '../queries'\nimport { AddProjectMemberErrorCode, ProjectMembersInput } from '../../schema'\nimport { AccessVerifier, PermissionActions, TenantRole } from '../authorization'\nimport { indexListBy, notEmpty } from '../../utils/array'\nimport { createSetMembershipVariables } from './membershipUtils'\nimport { Acl, ProjectRole } from '@contember/schema'\nimport { Response } from '../utils/Response'\nimport { DatabaseContext } from '../utils'\n\nexport class ProjectMemberManager {\n\tasync addProjectMember(\n\t\tdbContext: DatabaseContext,\n\t\tprojectId: string,\n\t\tidentityId: string,\n\t\tmemberships: readonly Acl.Membership[],\n\t): Promise<AddProjectMemberResponse> {\n\t\treturn await dbContext.transaction(async db => {\n\t\t\treturn await db.commandBus.execute(\n\t\t\t\tnew AddProjectMemberCommand(projectId, identityId, createSetMembershipVariables(memberships)),\n\t\t\t)\n\t\t})\n\t}\n\n\tasync updateProjectMember(\n\t\tdbContext: DatabaseContext,\n\t\tprojectId: string,\n\t\tidentityId: string,\n\t\tmemberships: readonly MembershipUpdateInput[],\n\t): Promise<UpdateProjectMemberResponse> {\n\t\treturn await dbContext.transaction(\n\t\t\tasync db => await db.commandBus.execute(new UpdateProjectMemberCommand(projectId, identityId, memberships)),\n\t\t)\n\t}\n\n\tasync removeProjectMember(dbContext: DatabaseContext, projectId: string, identityId: string): Promise<RemoveProjectMemberResponse> {\n\t\treturn await dbContext.transaction(\n\t\t\tasync db => await db.commandBus.execute(new RemoveProjectMemberCommand(projectId, identityId)),\n\t\t)\n\t}\n\n\tasync getAllProjectMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string; roles?: readonly string[] },\n\t\tverifier: AccessVerifier | undefined,\n\t): Promise<readonly Acl.Membership[]> {\n\t\treturn [\n\t\t\t...this.getImplicitProjectMemberships(identity),\n\t\t\t...await this.getStoredProjectsMemberships(dbContext, project, identity, verifier),\n\t\t]\n\t}\n\n\tasync getEffectiveProjectMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string; roles?: readonly string[] },\n\t): Promise<readonly Acl.Membership[]> {\n\t\tconst implicit = this.getImplicitProjectMemberships(identity)\n\t\tif (implicit.length > 0) {\n\t\t\treturn implicit\n\t\t}\n\t\treturn await this.getStoredProjectsMemberships(dbContext, project, identity, undefined)\n\t}\n\n\tasync getStoredProjectsMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string },\n\t\tverifier: AccessVerifier | undefined,\n\t): Promise<readonly Acl.Membership[]> {\n\t\tconst memberships = await dbContext.queryHandler.fetch(\n\t\t\tnew ProjectMembershipByIdentityQuery(project, [identity.id]),\n\t\t)\n\t\tif (verifier === undefined) {\n\t\t\treturn memberships\n\t\t}\n\t\treturn await this.filterMemberships(memberships, verifier)\n\t}\n\n\tprivate getImplicitProjectMemberships(identity: { id: string; roles?: readonly string[] }): readonly Acl.Membership[] {\n\t\tif (identity.roles?.includes(TenantRole.SUPER_ADMIN) || identity.roles?.includes(TenantRole.PROJECT_ADMIN)) {\n\t\t\treturn [{ role: ProjectRole.ADMIN, variables: [] }]\n\t\t}\n\t\treturn []\n\t}\n\n\n\tasync getProjectMembers(dbContext: DatabaseContext, projectId: string, accessVerifier: AccessVerifier, input: ProjectMembersInput): Promise<GetProjectMembersResponse> {\n\t\treturn dbContext.transaction(async db => {\n\t\t\tconst members = await db.queryHandler.fetch(new ProjectMembersQuery(projectId, input))\n\t\t\tconst memberships = await db.queryHandler.fetch(\n\t\t\t\tnew ProjectMembershipByIdentityQuery(\n\t\t\t\t\t{ id: projectId },\n\t\t\t\t\tmembers.map(it => it.id),\n\t\t\t\t),\n\t\t\t)\n\t\t\tconst filteredMemberships = await this.filterMemberships(memberships, accessVerifier)\n\t\t\tconst byIdentity = indexListBy(filteredMemberships, 'identityId')\n\t\t\treturn members\n\t\t\t\t.map(it => (byIdentity[it.id] ? { identity: it, memberships: byIdentity[it.id] } : null))\n\t\t\t\t.filter(notEmpty)\n\t\t})\n\t}\n\n\tprivate async filterMemberships<T extends Acl.Membership>(\n\t\tmemberships: readonly T[],\n\t\tverifier: AccessVerifier,\n\t): Promise<T[]> {\n\t\tconst filteredMemberships: T[] = []\n\t\tnextMembership: for (const membership of memberships) {\n\t\t\tif (!(await verifier(PermissionActions.PROJECT_VIEW_MEMBER([{ role: membership.role, variables: [] }])))) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst variables: { values: Acl.MembershipVariable['values']; name: string }[] = []\n\t\t\tfor (const variable of membership.variables) {\n\t\t\t\tconst values = await this.filterProjectMembershipVariableValues(membership, variable, verifier)\n\t\t\t\tif (values.length === 0) {\n\t\t\t\t\tcontinue nextMembership\n\t\t\t\t}\n\t\t\t\tvariables.push({ name: variable.name, values })\n\t\t\t}\n\t\t\tfilteredMemberships.push({ ...membership, variables })\n\t\t}\n\n\t\treturn filteredMemberships\n\t}\n\n\tprivate async filterProjectMembershipVariableValues(\n\t\tmembership: Acl.Membership,\n\t\tvariable: Acl.MembershipVariable,\n\t\tverifier: AccessVerifier,\n\t): Promise<Acl.MembershipVariable['values']> {\n\t\tconst values = await Promise.all(\n\t\t\tvariable.values.map(async (value): Promise<string | null> => {\n\t\t\t\tconst subMembership = {\n\t\t\t\t\trole: membership.role,\n\t\t\t\t\tvariables: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: variable.name,\n\t\t\t\t\t\t\tvalues: [value],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t}\n\n\t\t\t\tif (!(await verifier(PermissionActions.PROJECT_VIEW_MEMBER([subMembership])))) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\treturn value\n\t\t\t}),\n\t\t)\n\t\treturn values.filter(notEmpty)\n\t}\n}\n\nexport type AddProjectMemberResponse = Response<null, AddProjectMemberErrorCode>\n\nexport type GetProjectMembersResponse = {\n\tidentity: { id: string }\n\tmemberships: readonly Acl.Membership[]\n}[]\n"],"names":["AddProjectMemberCommand","createSetMembershipVariables","UpdateProjectMemberCommand","RemoveProjectMemberCommand","ProjectMembershipByIdentityQuery","TenantRole","ProjectRole","ProjectMembersQuery","indexListBy","notEmpty","PermissionActions"],"mappings":"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"}
1
+ {"version":3,"file":"ProjectMemberManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/ProjectMemberManager.ts"],"sourcesContent":["import {\n\tAddProjectMemberCommand,\n\tMembershipUpdateInput,\n\tRemoveProjectMemberCommand,\n\tRemoveProjectMemberResponse,\n\tUpdateProjectMemberCommand,\n\tUpdateProjectMemberResponse,\n} from '../commands'\nimport { ProjectMembershipByIdentityQuery, ProjectMembersQuery } from '../queries'\nimport { AddProjectMemberErrorCode, ProjectMembersInput } from '../../schema'\nimport { AccessVerifier, PermissionActions, TenantRole } from '../authorization'\nimport { indexListBy, notEmpty } from '../../utils/array'\nimport { createSetMembershipVariables } from './membershipUtils'\nimport { Acl, ProjectRole } from '@contember/schema'\nimport { Response } from '../utils/Response'\nimport { DatabaseContext } from '../utils'\n\nexport class ProjectMemberManager {\n\tasync addProjectMember(\n\t\tdbContext: DatabaseContext,\n\t\tprojectId: string,\n\t\tidentityId: string,\n\t\tmemberships: readonly Acl.Membership[],\n\t): Promise<AddProjectMemberResponse> {\n\t\treturn await dbContext.transaction(async db => {\n\t\t\treturn await db.commandBus.execute(\n\t\t\t\tnew AddProjectMemberCommand(projectId, identityId, createSetMembershipVariables(memberships)),\n\t\t\t)\n\t\t})\n\t}\n\n\tasync updateProjectMember(\n\t\tdbContext: DatabaseContext,\n\t\tprojectId: string,\n\t\tidentityId: string,\n\t\tmemberships: readonly MembershipUpdateInput[],\n\t): Promise<UpdateProjectMemberResponse> {\n\t\treturn await dbContext.transaction(\n\t\t\tasync db => await db.commandBus.execute(new UpdateProjectMemberCommand(projectId, identityId, memberships)),\n\t\t)\n\t}\n\n\tasync removeProjectMember(dbContext: DatabaseContext, projectId: string, identityId: string): Promise<RemoveProjectMemberResponse> {\n\t\treturn await dbContext.transaction(\n\t\t\tasync db => await db.commandBus.execute(new RemoveProjectMemberCommand(projectId, identityId)),\n\t\t)\n\t}\n\n\tasync getAllProjectMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string; roles?: readonly string[] },\n\t\tverifier: AccessVerifier | undefined,\n\t): Promise<readonly Acl.Membership[]> {\n\t\treturn [\n\t\t\t...this.getImplicitProjectMemberships(identity),\n\t\t\t...await this.getStoredProjectsMemberships(dbContext, project, identity, verifier),\n\t\t]\n\t}\n\n\tasync getEffectiveProjectMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string; roles?: readonly string[] },\n\t): Promise<readonly Acl.Membership[]> {\n\t\tconst implicit = this.getImplicitProjectMemberships(identity)\n\t\tif (implicit.length > 0) {\n\t\t\treturn implicit\n\t\t}\n\t\treturn await this.getStoredProjectsMemberships(dbContext, project, identity, undefined)\n\t}\n\n\tasync getStoredProjectsMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string },\n\t\tverifier: AccessVerifier | undefined,\n\t): Promise<readonly Acl.Membership[]> {\n\t\tconst memberships = await dbContext.queryHandler.fetch(\n\t\t\tnew ProjectMembershipByIdentityQuery(project, [identity.id]),\n\t\t)\n\t\tif (verifier === undefined) {\n\t\t\treturn memberships\n\t\t}\n\t\treturn await this.filterMemberships(memberships, verifier)\n\t}\n\n\tprivate getImplicitProjectMemberships(identity: { id: string; roles?: readonly string[] }): readonly Acl.Membership[] {\n\t\tif (identity.roles?.includes(TenantRole.SUPER_ADMIN) || identity.roles?.includes(TenantRole.PROJECT_ADMIN)) {\n\t\t\treturn [{ role: ProjectRole.ADMIN, variables: [] }]\n\t\t}\n\t\treturn []\n\t}\n\n\n\tasync getProjectMembers(dbContext: DatabaseContext, projectId: string, accessVerifier: AccessVerifier, input: ProjectMembersInput): Promise<GetProjectMembersResponse> {\n\t\treturn dbContext.transaction(async db => {\n\t\t\tconst members = await db.queryHandler.fetch(new ProjectMembersQuery(projectId, input))\n\t\t\tconst memberships = await db.queryHandler.fetch(\n\t\t\t\tnew ProjectMembershipByIdentityQuery(\n\t\t\t\t\t{ id: projectId },\n\t\t\t\t\tmembers.map(it => it.id),\n\t\t\t\t),\n\t\t\t)\n\t\t\tconst filteredMemberships = await this.filterMemberships(memberships, accessVerifier)\n\t\t\tconst byIdentity = indexListBy(filteredMemberships, 'identityId')\n\t\t\treturn members\n\t\t\t\t.map(it => (byIdentity[it.id] ? { identity: it, memberships: byIdentity[it.id] } : null))\n\t\t\t\t.filter(notEmpty)\n\t\t})\n\t}\n\n\tprivate async filterMemberships<T extends Acl.Membership>(\n\t\tmemberships: readonly T[],\n\t\tverifier: AccessVerifier,\n\t): Promise<T[]> {\n\t\tconst filteredMemberships: T[] = []\n\t\tnextMembership: for (const membership of memberships) {\n\t\t\tif (!(await verifier(PermissionActions.PROJECT_VIEW_MEMBER([{ role: membership.role, variables: [] }])))) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst variables: { values: Acl.MembershipVariable['values']; name: string }[] = []\n\t\t\tfor (const variable of membership.variables) {\n\t\t\t\tconst values = await this.filterProjectMembershipVariableValues(membership, variable, verifier)\n\t\t\t\tif (values.length === 0) {\n\t\t\t\t\tcontinue nextMembership\n\t\t\t\t}\n\t\t\t\tvariables.push({ name: variable.name, values })\n\t\t\t}\n\t\t\tfilteredMemberships.push({ ...membership, variables })\n\t\t}\n\n\t\treturn filteredMemberships\n\t}\n\n\tprivate async filterProjectMembershipVariableValues(\n\t\tmembership: Acl.Membership,\n\t\tvariable: Acl.MembershipVariable,\n\t\tverifier: AccessVerifier,\n\t): Promise<Acl.MembershipVariable['values']> {\n\t\tconst values = await Promise.all(\n\t\t\tvariable.values.map(async (value): Promise<string | null> => {\n\t\t\t\tconst subMembership = {\n\t\t\t\t\trole: membership.role,\n\t\t\t\t\tvariables: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: variable.name,\n\t\t\t\t\t\t\tvalues: [value],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t}\n\n\t\t\t\tif (!(await verifier(PermissionActions.PROJECT_VIEW_MEMBER([subMembership])))) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\treturn value\n\t\t\t}),\n\t\t)\n\t\treturn values.filter(notEmpty)\n\t}\n}\n\nexport type AddProjectMemberResponse = Response<null, AddProjectMemberErrorCode>\n\nexport type GetProjectMembersResponse = {\n\tidentity: { id: string }\n\tmemberships: readonly Acl.Membership[]\n}[]\n"],"names":["AddProjectMemberCommand","createSetMembershipVariables","UpdateProjectMemberCommand","RemoveProjectMemberCommand","ProjectMembershipByIdentityQuery","TenantRole","ProjectRole","ProjectMembersQuery","indexListBy","notEmpty","PermissionActions"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectMemberManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/ProjectMemberManager.ts"],"sourcesContent":["import {\n\tAddProjectMemberCommand,\n\tMembershipUpdateInput,\n\tRemoveProjectMemberCommand,\n\tRemoveProjectMemberResponse,\n\tUpdateProjectMemberCommand,\n\tUpdateProjectMemberResponse,\n} from '../commands'\nimport { ProjectMembershipByIdentityQuery, ProjectMembersQuery } from '../queries'\nimport { AddProjectMemberErrorCode, ProjectMembersInput } from '../../schema'\nimport { AccessVerifier, PermissionActions, TenantRole } from '../authorization'\nimport { indexListBy, notEmpty } from '../../utils/array'\nimport { createSetMembershipVariables } from './membershipUtils'\nimport { Acl, ProjectRole } from '@contember/schema'\nimport { Response } from '../utils/Response'\nimport { DatabaseContext } from '../utils'\n\nexport class ProjectMemberManager {\n\tasync addProjectMember(\n\t\tdbContext: DatabaseContext,\n\t\tprojectId: string,\n\t\tidentityId: string,\n\t\tmemberships: readonly Acl.Membership[],\n\t): Promise<AddProjectMemberResponse> {\n\t\treturn await dbContext.transaction(async db => {\n\t\t\treturn await db.commandBus.execute(\n\t\t\t\tnew AddProjectMemberCommand(projectId, identityId, createSetMembershipVariables(memberships)),\n\t\t\t)\n\t\t})\n\t}\n\n\tasync updateProjectMember(\n\t\tdbContext: DatabaseContext,\n\t\tprojectId: string,\n\t\tidentityId: string,\n\t\tmemberships: readonly MembershipUpdateInput[],\n\t): Promise<UpdateProjectMemberResponse> {\n\t\treturn await dbContext.transaction(\n\t\t\tasync db => await db.commandBus.execute(new UpdateProjectMemberCommand(projectId, identityId, memberships)),\n\t\t)\n\t}\n\n\tasync removeProjectMember(dbContext: DatabaseContext, projectId: string, identityId: string): Promise<RemoveProjectMemberResponse> {\n\t\treturn await dbContext.transaction(\n\t\t\tasync db => await db.commandBus.execute(new RemoveProjectMemberCommand(projectId, identityId)),\n\t\t)\n\t}\n\n\tasync getAllProjectMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string; roles?: readonly string[] },\n\t\tverifier: AccessVerifier | undefined,\n\t): Promise<readonly Acl.Membership[]> {\n\t\treturn [\n\t\t\t...this.getImplicitProjectMemberships(identity),\n\t\t\t...await this.getStoredProjectsMemberships(dbContext, project, identity, verifier),\n\t\t]\n\t}\n\n\tasync getEffectiveProjectMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string; roles?: readonly string[] },\n\t): Promise<readonly Acl.Membership[]> {\n\t\tconst implicit = this.getImplicitProjectMemberships(identity)\n\t\tif (implicit.length > 0) {\n\t\t\treturn implicit\n\t\t}\n\t\treturn await this.getStoredProjectsMemberships(dbContext, project, identity, undefined)\n\t}\n\n\tasync getStoredProjectsMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string },\n\t\tverifier: AccessVerifier | undefined,\n\t): Promise<readonly Acl.Membership[]> {\n\t\tconst memberships = await dbContext.queryHandler.fetch(\n\t\t\tnew ProjectMembershipByIdentityQuery(project, [identity.id]),\n\t\t)\n\t\tif (verifier === undefined) {\n\t\t\treturn memberships\n\t\t}\n\t\treturn await this.filterMemberships(memberships, verifier)\n\t}\n\n\tprivate getImplicitProjectMemberships(identity: { id: string; roles?: readonly string[] }): readonly Acl.Membership[] {\n\t\tif (identity.roles?.includes(TenantRole.SUPER_ADMIN) || identity.roles?.includes(TenantRole.PROJECT_ADMIN)) {\n\t\t\treturn [{ role: ProjectRole.ADMIN, variables: [] }]\n\t\t}\n\t\treturn []\n\t}\n\n\n\tasync getProjectMembers(dbContext: DatabaseContext, projectId: string, accessVerifier: AccessVerifier, input: ProjectMembersInput): Promise<GetProjectMembersResponse> {\n\t\treturn dbContext.transaction(async db => {\n\t\t\tconst members = await db.queryHandler.fetch(new ProjectMembersQuery(projectId, input))\n\t\t\tconst memberships = await db.queryHandler.fetch(\n\t\t\t\tnew ProjectMembershipByIdentityQuery(\n\t\t\t\t\t{ id: projectId },\n\t\t\t\t\tmembers.map(it => it.id),\n\t\t\t\t),\n\t\t\t)\n\t\t\tconst filteredMemberships = await this.filterMemberships(memberships, accessVerifier)\n\t\t\tconst byIdentity = indexListBy(filteredMemberships, 'identityId')\n\t\t\treturn members\n\t\t\t\t.map(it => (byIdentity[it.id] ? { identity: it, memberships: byIdentity[it.id] } : null))\n\t\t\t\t.filter(notEmpty)\n\t\t})\n\t}\n\n\tprivate async filterMemberships<T extends Acl.Membership>(\n\t\tmemberships: readonly T[],\n\t\tverifier: AccessVerifier,\n\t): Promise<T[]> {\n\t\tconst filteredMemberships: T[] = []\n\t\tnextMembership: for (const membership of memberships) {\n\t\t\tif (!(await verifier(PermissionActions.PROJECT_VIEW_MEMBER([{ role: membership.role, variables: [] }])))) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst variables: { values: Acl.MembershipVariable['values']; name: string }[] = []\n\t\t\tfor (const variable of membership.variables) {\n\t\t\t\tconst values = await this.filterProjectMembershipVariableValues(membership, variable, verifier)\n\t\t\t\tif (values.length === 0) {\n\t\t\t\t\tcontinue nextMembership\n\t\t\t\t}\n\t\t\t\tvariables.push({ name: variable.name, values })\n\t\t\t}\n\t\t\tfilteredMemberships.push({ ...membership, variables })\n\t\t}\n\n\t\treturn filteredMemberships\n\t}\n\n\tprivate async filterProjectMembershipVariableValues(\n\t\tmembership: Acl.Membership,\n\t\tvariable: Acl.MembershipVariable,\n\t\tverifier: AccessVerifier,\n\t): Promise<Acl.MembershipVariable['values']> {\n\t\tconst values = await Promise.all(\n\t\t\tvariable.values.map(async (value): Promise<string | null> => {\n\t\t\t\tconst subMembership = {\n\t\t\t\t\trole: membership.role,\n\t\t\t\t\tvariables: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: variable.name,\n\t\t\t\t\t\t\tvalues: [value],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t}\n\n\t\t\t\tif (!(await verifier(PermissionActions.PROJECT_VIEW_MEMBER([subMembership])))) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\treturn value\n\t\t\t}),\n\t\t)\n\t\treturn values.filter(notEmpty)\n\t}\n}\n\nexport type AddProjectMemberResponse = Response<null, AddProjectMemberErrorCode>\n\nexport type GetProjectMembersResponse = {\n\tidentity: { id: string }\n\tmemberships: readonly Acl.Membership[]\n}[]\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProjectMemberManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/ProjectMemberManager.ts"],"sourcesContent":["import {\n\tAddProjectMemberCommand,\n\tMembershipUpdateInput,\n\tRemoveProjectMemberCommand,\n\tRemoveProjectMemberResponse,\n\tUpdateProjectMemberCommand,\n\tUpdateProjectMemberResponse,\n} from '../commands'\nimport { ProjectMembershipByIdentityQuery, ProjectMembersQuery } from '../queries'\nimport { AddProjectMemberErrorCode, ProjectMembersInput } from '../../schema'\nimport { AccessVerifier, PermissionActions, TenantRole } from '../authorization'\nimport { indexListBy, notEmpty } from '../../utils/array'\nimport { createSetMembershipVariables } from './membershipUtils'\nimport { Acl, ProjectRole } from '@contember/schema'\nimport { Response } from '../utils/Response'\nimport { DatabaseContext } from '../utils'\n\nexport class ProjectMemberManager {\n\tasync addProjectMember(\n\t\tdbContext: DatabaseContext,\n\t\tprojectId: string,\n\t\tidentityId: string,\n\t\tmemberships: readonly Acl.Membership[],\n\t): Promise<AddProjectMemberResponse> {\n\t\treturn await dbContext.transaction(async db => {\n\t\t\treturn await db.commandBus.execute(\n\t\t\t\tnew AddProjectMemberCommand(projectId, identityId, createSetMembershipVariables(memberships)),\n\t\t\t)\n\t\t})\n\t}\n\n\tasync updateProjectMember(\n\t\tdbContext: DatabaseContext,\n\t\tprojectId: string,\n\t\tidentityId: string,\n\t\tmemberships: readonly MembershipUpdateInput[],\n\t): Promise<UpdateProjectMemberResponse> {\n\t\treturn await dbContext.transaction(\n\t\t\tasync db => await db.commandBus.execute(new UpdateProjectMemberCommand(projectId, identityId, memberships)),\n\t\t)\n\t}\n\n\tasync removeProjectMember(dbContext: DatabaseContext, projectId: string, identityId: string): Promise<RemoveProjectMemberResponse> {\n\t\treturn await dbContext.transaction(\n\t\t\tasync db => await db.commandBus.execute(new RemoveProjectMemberCommand(projectId, identityId)),\n\t\t)\n\t}\n\n\tasync getAllProjectMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string; roles?: readonly string[] },\n\t\tverifier: AccessVerifier | undefined,\n\t): Promise<readonly Acl.Membership[]> {\n\t\treturn [\n\t\t\t...this.getImplicitProjectMemberships(identity),\n\t\t\t...await this.getStoredProjectsMemberships(dbContext, project, identity, verifier),\n\t\t]\n\t}\n\n\tasync getEffectiveProjectMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string; roles?: readonly string[] },\n\t): Promise<readonly Acl.Membership[]> {\n\t\tconst implicit = this.getImplicitProjectMemberships(identity)\n\t\tif (implicit.length > 0) {\n\t\t\treturn implicit\n\t\t}\n\t\treturn await this.getStoredProjectsMemberships(dbContext, project, identity, undefined)\n\t}\n\n\tasync getStoredProjectsMemberships(\n\t\tdbContext: DatabaseContext,\n\t\tproject: { id: string } | { slug: string },\n\t\tidentity: { id: string },\n\t\tverifier: AccessVerifier | undefined,\n\t): Promise<readonly Acl.Membership[]> {\n\t\tconst memberships = await dbContext.queryHandler.fetch(\n\t\t\tnew ProjectMembershipByIdentityQuery(project, [identity.id]),\n\t\t)\n\t\tif (verifier === undefined) {\n\t\t\treturn memberships\n\t\t}\n\t\treturn await this.filterMemberships(memberships, verifier)\n\t}\n\n\tprivate getImplicitProjectMemberships(identity: { id: string; roles?: readonly string[] }): readonly Acl.Membership[] {\n\t\tif (identity.roles?.includes(TenantRole.SUPER_ADMIN) || identity.roles?.includes(TenantRole.PROJECT_ADMIN)) {\n\t\t\treturn [{ role: ProjectRole.ADMIN, variables: [] }]\n\t\t}\n\t\treturn []\n\t}\n\n\n\tasync getProjectMembers(dbContext: DatabaseContext, projectId: string, accessVerifier: AccessVerifier, input: ProjectMembersInput): Promise<GetProjectMembersResponse> {\n\t\treturn dbContext.transaction(async db => {\n\t\t\tconst members = await db.queryHandler.fetch(new ProjectMembersQuery(projectId, input))\n\t\t\tconst memberships = await db.queryHandler.fetch(\n\t\t\t\tnew ProjectMembershipByIdentityQuery(\n\t\t\t\t\t{ id: projectId },\n\t\t\t\t\tmembers.map(it => it.id),\n\t\t\t\t),\n\t\t\t)\n\t\t\tconst filteredMemberships = await this.filterMemberships(memberships, accessVerifier)\n\t\t\tconst byIdentity = indexListBy(filteredMemberships, 'identityId')\n\t\t\treturn members\n\t\t\t\t.map(it => (byIdentity[it.id] ? { identity: it, memberships: byIdentity[it.id] } : null))\n\t\t\t\t.filter(notEmpty)\n\t\t})\n\t}\n\n\tprivate async filterMemberships<T extends Acl.Membership>(\n\t\tmemberships: readonly T[],\n\t\tverifier: AccessVerifier,\n\t): Promise<T[]> {\n\t\tconst filteredMemberships: T[] = []\n\t\tnextMembership: for (const membership of memberships) {\n\t\t\tif (!(await verifier(PermissionActions.PROJECT_VIEW_MEMBER([{ role: membership.role, variables: [] }])))) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst variables: { values: Acl.MembershipVariable['values']; name: string }[] = []\n\t\t\tfor (const variable of membership.variables) {\n\t\t\t\tconst values = await this.filterProjectMembershipVariableValues(membership, variable, verifier)\n\t\t\t\tif (values.length === 0) {\n\t\t\t\t\tcontinue nextMembership\n\t\t\t\t}\n\t\t\t\tvariables.push({ name: variable.name, values })\n\t\t\t}\n\t\t\tfilteredMemberships.push({ ...membership, variables })\n\t\t}\n\n\t\treturn filteredMemberships\n\t}\n\n\tprivate async filterProjectMembershipVariableValues(\n\t\tmembership: Acl.Membership,\n\t\tvariable: Acl.MembershipVariable,\n\t\tverifier: AccessVerifier,\n\t): Promise<Acl.MembershipVariable['values']> {\n\t\tconst values = await Promise.all(\n\t\t\tvariable.values.map(async (value): Promise<string | null> => {\n\t\t\t\tconst subMembership = {\n\t\t\t\t\trole: membership.role,\n\t\t\t\t\tvariables: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: variable.name,\n\t\t\t\t\t\t\tvalues: [value],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t}\n\n\t\t\t\tif (!(await verifier(PermissionActions.PROJECT_VIEW_MEMBER([subMembership])))) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\treturn value\n\t\t\t}),\n\t\t)\n\t\treturn values.filter(notEmpty)\n\t}\n}\n\nexport type AddProjectMemberResponse = Response<null, AddProjectMemberErrorCode>\n\nexport type GetProjectMembersResponse = {\n\tidentity: { id: string }\n\tmemberships: readonly Acl.Membership[]\n}[]\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAiBO,MAAM,qBAAqB;AAAA,EACjC,MAAM,iBACL,WACA,WACA,YACA,aACoC;AACpC,WAAO,MAAM,UAAU,YAAY,OAAM,OAAM;AACvC,aAAA,MAAM,GAAG,WAAW;AAAA,QAC1B,IAAI,wBAAwB,WAAW,YAAY,6BAA6B,WAAW,CAAC;AAAA,MAC7F;AAAA,IAAA,CACA;AAAA,EAAA;AAAA,EAGF,MAAM,oBACL,WACA,WACA,YACA,aACuC;AACvC,WAAO,MAAM,UAAU;AAAA,MACtB,OAAM,OAAM,MAAM,GAAG,WAAW,QAAQ,IAAI,2BAA2B,WAAW,YAAY,WAAW,CAAC;AAAA,IAC3G;AAAA,EAAA;AAAA,EAGD,MAAM,oBAAoB,WAA4B,WAAmB,YAA0D;AAClI,WAAO,MAAM,UAAU;AAAA,MACtB,OAAM,OAAM,MAAM,GAAG,WAAW,QAAQ,IAAI,2BAA2B,WAAW,UAAU,CAAC;AAAA,IAC9F;AAAA,EAAA;AAAA,EAGD,MAAM,yBACL,WACA,SACA,UACA,UACqC;AAC9B,WAAA;AAAA,MACN,GAAG,KAAK,8BAA8B,QAAQ;AAAA,MAC9C,GAAG,MAAM,KAAK,6BAA6B,WAAW,SAAS,UAAU,QAAQ;AAAA,IAClF;AAAA,EAAA;AAAA,EAGD,MAAM,+BACL,WACA,SACA,UACqC;AAC/B,UAAA,WAAW,KAAK,8BAA8B,QAAQ;AACxD,QAAA,SAAS,SAAS,GAAG;AACjB,aAAA;AAAA,IAAA;AAER,WAAO,MAAM,KAAK,6BAA6B,WAAW,SAAS,UAAU,MAAS;AAAA,EAAA;AAAA,EAGvF,MAAM,6BACL,WACA,SACA,UACA,UACqC;AAC/B,UAAA,cAAc,MAAM,UAAU,aAAa;AAAA,MAChD,IAAI,iCAAiC,SAAS,CAAC,SAAS,EAAE,CAAC;AAAA,IAC5D;AACA,QAAI,aAAa,QAAW;AACpB,aAAA;AAAA,IAAA;AAER,WAAO,MAAM,KAAK,kBAAkB,aAAa,QAAQ;AAAA,EAAA;AAAA,EAGlD,8BAA8B,UAAgF;AACjH,QAAA,SAAS,OAAO,SAAS,WAAW,WAAW,KAAK,SAAS,OAAO,SAAS,WAAW,aAAa,GAAG;AACpG,aAAA,CAAC,EAAE,MAAM,YAAY,OAAO,WAAW,CAAA,GAAI;AAAA,IAAA;AAEnD,WAAO,CAAC;AAAA,EAAA;AAAA,EAIT,MAAM,kBAAkB,WAA4B,WAAmB,gBAAgC,OAAgE;AAC/J,WAAA,UAAU,YAAY,OAAM,OAAM;AAClC,YAAA,UAAU,MAAM,GAAG,aAAa,MAAM,IAAI,oBAAoB,WAAW,KAAK,CAAC;AAC/E,YAAA,cAAc,MAAM,GAAG,aAAa;AAAA,QACzC,IAAI;AAAA,UACH,EAAE,IAAI,UAAU;AAAA,UAChB,QAAQ,IAAI,CAAM,OAAA,GAAG,EAAE;AAAA,QAAA;AAAA,MAEzB;AACA,YAAM,sBAAsB,MAAM,KAAK,kBAAkB,aAAa,cAAc;AAC9E,YAAA,aAAa,YAAY,qBAAqB,YAAY;AAChE,aAAO,QACL,IAAI,CAAA,OAAO,WAAW,GAAG,EAAE,IAAI,EAAE,UAAU,IAAI,aAAa,WAAW,GAAG,EAAE,MAAM,IAAK,EACvF,OAAO,QAAQ;AAAA,IAAA,CACjB;AAAA,EAAA;AAAA,EAGF,MAAc,kBACb,aACA,UACe;AACf,UAAM,sBAA2B,CAAC;AAClB,mBAAA,YAAW,cAAc,aAAa;AACrD,UAAI,CAAE,MAAM,SAAS,kBAAkB,oBAAoB,CAAC,EAAE,MAAM,WAAW,MAAM,WAAW,GAAI,CAAA,CAAC,CAAC,GAAI;AACzG;AAAA,MAAA;AAED,YAAM,YAA0E,CAAC;AACtE,iBAAA,YAAY,WAAW,WAAW;AAC5C,cAAM,SAAS,MAAM,KAAK,sCAAsC,YAAY,UAAU,QAAQ;AAC1F,YAAA,OAAO,WAAW,GAAG;AACf,mBAAA;AAAA,QAAA;AAEV,kBAAU,KAAK,EAAE,MAAM,SAAS,MAAM,QAAQ;AAAA,MAAA;AAE/C,0BAAoB,KAAK,EAAE,GAAG,YAAY,WAAW;AAAA,IAAA;AAG/C,WAAA;AAAA,EAAA;AAAA,EAGR,MAAc,sCACb,YACA,UACA,UAC4C;AACtC,UAAA,SAAS,MAAM,QAAQ;AAAA,MAC5B,SAAS,OAAO,IAAI,OAAO,UAAkC;AAC5D,cAAM,gBAAgB;AAAA,UACrB,MAAM,WAAW;AAAA,UACjB,WAAW;AAAA,YACV;AAAA,cACC,MAAM,SAAS;AAAA,cACf,QAAQ,CAAC,KAAK;AAAA,YAAA;AAAA,UACf;AAAA,QAEF;AAEI,YAAA,CAAE,MAAM,SAAS,kBAAkB,oBAAoB,CAAC,aAAa,CAAC,CAAC,GAAI;AACvE,iBAAA;AAAA,QAAA;AAED,eAAA;AAAA,MACP,CAAA;AAAA,IACF;AACO,WAAA,OAAO,OAAO,QAAQ;AAAA,EAAA;AAE/B;"}
@@ -1 +1 @@
1
- {"version":3,"file":"RolesManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/RolesManager.ts"],"sourcesContent":["import { DatabaseContext } from '../utils'\nimport { PatchIdentityGlobalRoles } from '../commands'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { TenantRole } from '../authorization'\n\nexport class RolesManager {\n\tasync addGlobalRoles(dbContext: DatabaseContext, identityId: string, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn this.patchGlobalRoles(dbContext, identityId, roles, [])\n\t}\n\n\tasync removeGlobalRoles(dbContext: DatabaseContext, identityId: string, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn this.patchGlobalRoles(dbContext, identityId, [], roles)\n\t}\n\n\tprivate async patchGlobalRoles(dbContext: DatabaseContext, identityId: string, addRoles: readonly string[], removeRoles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\tconst rolesValidationError = this.validateRoles([...addRoles, ...removeRoles])\n\t\tif (rolesValidationError) {\n\t\t\treturn rolesValidationError\n\t\t}\n\t\tconst result = await dbContext.commandBus.execute(new PatchIdentityGlobalRoles(identityId, addRoles, removeRoles))\n\t\tif (!result) {\n\t\t\treturn new ResponseError('IDENTITY_NOT_FOUND', `Identity ${identityId} not found`)\n\t\t}\n\t\treturn new ResponseOk(null)\n\t}\n\n\n\tprivate validateRoles(roles: string[]): Response<null, GlobalRolesErrorCode> | null {\n\t\tfor (const role of roles) {\n\t\t\tif (!Object.values(TenantRole).includes(role as TenantRole)) {\n\t\t\t\treturn new ResponseError('INVALID_ROLE', `Role ${role} is not valid`)\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n}\n\ntype GlobalRolesErrorCode =\n\t| 'IDENTITY_NOT_FOUND'\n\t| 'INVALID_ROLE'\n"],"names":["PatchIdentityGlobalRoles","ResponseError","ResponseOk","TenantRole"],"mappings":";;;;;;;;;;;;;AAKO,MAAM,aAAa;AAAA,EACzB,MAAM,eAAe,WAA4B,YAAoB,OAAyE;AAC7I,WAAO,KAAK,iBAAiB,WAAW,YAAY,OAAO,CAAA,CAAE;AAAA,EAC9D;AAAA,EAEA,MAAM,kBAAkB,WAA4B,YAAoB,OAAyE;AAChJ,WAAO,KAAK,iBAAiB,WAAW,YAAY,CAAA,GAAI,KAAK;AAAA,EAC9D;AAAA,EAEA,MAAc,iBAAiB,WAA4B,YAAoB,UAA6B,aAA+E;AACpL,UAAA,uBAAuB,KAAK,cAAc,CAAC,GAAG,UAAU,GAAG,WAAW,CAAC;AAC7E,QAAI,sBAAsB;AAClB,aAAA;AAAA,IACR;AACM,UAAA,SAAS,MAAM,UAAU,WAAW,QAAQ,IAAIA,yBAAyB,yBAAA,YAAY,UAAU,WAAW,CAAC;AACjH,QAAI,CAAC,QAAQ;AACZ,aAAO,IAAIC,SAAA,cAAc,sBAAsB,YAAY,UAAU,YAAY;AAAA,IAClF;AACO,WAAA,IAAIC,SAAAA,WAAW,IAAI;AAAA,EAC3B;AAAA,EAGQ,cAAc,OAA8D;AACnF,eAAW,QAAQ,OAAO;AACzB,UAAI,CAAC,OAAO,OAAOC,MAAU,UAAA,EAAE,SAAS,IAAkB,GAAG;AAC5D,eAAO,IAAIF,SAAA,cAAc,gBAAgB,QAAQ,IAAI,eAAe;AAAA,MACrE;AAAA,IACD;AACO,WAAA;AAAA,EACR;AACD;;"}
1
+ {"version":3,"file":"RolesManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/RolesManager.ts"],"sourcesContent":["import { DatabaseContext } from '../utils'\nimport { PatchIdentityGlobalRoles } from '../commands'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { TenantRole } from '../authorization'\n\nexport class RolesManager {\n\tasync addGlobalRoles(dbContext: DatabaseContext, identityId: string, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn this.patchGlobalRoles(dbContext, identityId, roles, [])\n\t}\n\n\tasync removeGlobalRoles(dbContext: DatabaseContext, identityId: string, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn this.patchGlobalRoles(dbContext, identityId, [], roles)\n\t}\n\n\tprivate async patchGlobalRoles(dbContext: DatabaseContext, identityId: string, addRoles: readonly string[], removeRoles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\tconst rolesValidationError = this.validateRoles([...addRoles, ...removeRoles])\n\t\tif (rolesValidationError) {\n\t\t\treturn rolesValidationError\n\t\t}\n\t\tconst result = await dbContext.commandBus.execute(new PatchIdentityGlobalRoles(identityId, addRoles, removeRoles))\n\t\tif (!result) {\n\t\t\treturn new ResponseError('IDENTITY_NOT_FOUND', `Identity ${identityId} not found`)\n\t\t}\n\t\treturn new ResponseOk(null)\n\t}\n\n\n\tprivate validateRoles(roles: string[]): Response<null, GlobalRolesErrorCode> | null {\n\t\tfor (const role of roles) {\n\t\t\tif (!Object.values(TenantRole).includes(role as TenantRole)) {\n\t\t\t\treturn new ResponseError('INVALID_ROLE', `Role ${role} is not valid`)\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n}\n\ntype GlobalRolesErrorCode =\n\t| 'IDENTITY_NOT_FOUND'\n\t| 'INVALID_ROLE'\n"],"names":["PatchIdentityGlobalRoles","ResponseError","ResponseOk","TenantRole"],"mappings":";;;;;;;;;;;;;AAKO,MAAM,aAAa;AAAA,EACzB,MAAM,eAAe,WAA4B,YAAoB,OAAyE;AAC7I,WAAO,KAAK,iBAAiB,WAAW,YAAY,OAAO,CAAA,CAAE;AAAA,EAAA;AAAA,EAG9D,MAAM,kBAAkB,WAA4B,YAAoB,OAAyE;AAChJ,WAAO,KAAK,iBAAiB,WAAW,YAAY,CAAA,GAAI,KAAK;AAAA,EAAA;AAAA,EAG9D,MAAc,iBAAiB,WAA4B,YAAoB,UAA6B,aAA+E;AACpL,UAAA,uBAAuB,KAAK,cAAc,CAAC,GAAG,UAAU,GAAG,WAAW,CAAC;AAC7E,QAAI,sBAAsB;AAClB,aAAA;AAAA,IAAA;AAEF,UAAA,SAAS,MAAM,UAAU,WAAW,QAAQ,IAAIA,yBAAAA,yBAAyB,YAAY,UAAU,WAAW,CAAC;AACjH,QAAI,CAAC,QAAQ;AACZ,aAAO,IAAIC,SAAA,cAAc,sBAAsB,YAAY,UAAU,YAAY;AAAA,IAAA;AAE3E,WAAA,IAAIC,oBAAW,IAAI;AAAA,EAAA;AAAA,EAInB,cAAc,OAA8D;AACnF,eAAW,QAAQ,OAAO;AACzB,UAAI,CAAC,OAAO,OAAOC,MAAU,UAAA,EAAE,SAAS,IAAkB,GAAG;AAC5D,eAAO,IAAIF,SAAA,cAAc,gBAAgB,QAAQ,IAAI,eAAe;AAAA,MAAA;AAAA,IACrE;AAEM,WAAA;AAAA,EAAA;AAET;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"RolesManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/RolesManager.ts"],"sourcesContent":["import { DatabaseContext } from '../utils'\nimport { PatchIdentityGlobalRoles } from '../commands'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { TenantRole } from '../authorization'\n\nexport class RolesManager {\n\tasync addGlobalRoles(dbContext: DatabaseContext, identityId: string, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn this.patchGlobalRoles(dbContext, identityId, roles, [])\n\t}\n\n\tasync removeGlobalRoles(dbContext: DatabaseContext, identityId: string, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn this.patchGlobalRoles(dbContext, identityId, [], roles)\n\t}\n\n\tprivate async patchGlobalRoles(dbContext: DatabaseContext, identityId: string, addRoles: readonly string[], removeRoles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\tconst rolesValidationError = this.validateRoles([...addRoles, ...removeRoles])\n\t\tif (rolesValidationError) {\n\t\t\treturn rolesValidationError\n\t\t}\n\t\tconst result = await dbContext.commandBus.execute(new PatchIdentityGlobalRoles(identityId, addRoles, removeRoles))\n\t\tif (!result) {\n\t\t\treturn new ResponseError('IDENTITY_NOT_FOUND', `Identity ${identityId} not found`)\n\t\t}\n\t\treturn new ResponseOk(null)\n\t}\n\n\n\tprivate validateRoles(roles: string[]): Response<null, GlobalRolesErrorCode> | null {\n\t\tfor (const role of roles) {\n\t\t\tif (!Object.values(TenantRole).includes(role as TenantRole)) {\n\t\t\t\treturn new ResponseError('INVALID_ROLE', `Role ${role} is not valid`)\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n}\n\ntype GlobalRolesErrorCode =\n\t| 'IDENTITY_NOT_FOUND'\n\t| 'INVALID_ROLE'\n"],"names":[],"mappings":";;;;;;;;;;;AAKO,MAAM,aAAa;AAAA,EACzB,MAAM,eAAe,WAA4B,YAAoB,OAAyE;AAC7I,WAAO,KAAK,iBAAiB,WAAW,YAAY,OAAO,CAAA,CAAE;AAAA,EAC9D;AAAA,EAEA,MAAM,kBAAkB,WAA4B,YAAoB,OAAyE;AAChJ,WAAO,KAAK,iBAAiB,WAAW,YAAY,CAAA,GAAI,KAAK;AAAA,EAC9D;AAAA,EAEA,MAAc,iBAAiB,WAA4B,YAAoB,UAA6B,aAA+E;AACpL,UAAA,uBAAuB,KAAK,cAAc,CAAC,GAAG,UAAU,GAAG,WAAW,CAAC;AAC7E,QAAI,sBAAsB;AAClB,aAAA;AAAA,IACR;AACM,UAAA,SAAS,MAAM,UAAU,WAAW,QAAQ,IAAI,yBAAyB,YAAY,UAAU,WAAW,CAAC;AACjH,QAAI,CAAC,QAAQ;AACZ,aAAO,IAAI,cAAc,sBAAsB,YAAY,UAAU,YAAY;AAAA,IAClF;AACO,WAAA,IAAI,WAAW,IAAI;AAAA,EAC3B;AAAA,EAGQ,cAAc,OAA8D;AACnF,eAAW,QAAQ,OAAO;AACzB,UAAI,CAAC,OAAO,OAAO,UAAU,EAAE,SAAS,IAAkB,GAAG;AAC5D,eAAO,IAAI,cAAc,gBAAgB,QAAQ,IAAI,eAAe;AAAA,MACrE;AAAA,IACD;AACO,WAAA;AAAA,EACR;AACD;"}
1
+ {"version":3,"file":"RolesManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/RolesManager.ts"],"sourcesContent":["import { DatabaseContext } from '../utils'\nimport { PatchIdentityGlobalRoles } from '../commands'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { TenantRole } from '../authorization'\n\nexport class RolesManager {\n\tasync addGlobalRoles(dbContext: DatabaseContext, identityId: string, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn this.patchGlobalRoles(dbContext, identityId, roles, [])\n\t}\n\n\tasync removeGlobalRoles(dbContext: DatabaseContext, identityId: string, roles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\treturn this.patchGlobalRoles(dbContext, identityId, [], roles)\n\t}\n\n\tprivate async patchGlobalRoles(dbContext: DatabaseContext, identityId: string, addRoles: readonly string[], removeRoles: readonly string[]): Promise<Response<null, GlobalRolesErrorCode>> {\n\t\tconst rolesValidationError = this.validateRoles([...addRoles, ...removeRoles])\n\t\tif (rolesValidationError) {\n\t\t\treturn rolesValidationError\n\t\t}\n\t\tconst result = await dbContext.commandBus.execute(new PatchIdentityGlobalRoles(identityId, addRoles, removeRoles))\n\t\tif (!result) {\n\t\t\treturn new ResponseError('IDENTITY_NOT_FOUND', `Identity ${identityId} not found`)\n\t\t}\n\t\treturn new ResponseOk(null)\n\t}\n\n\n\tprivate validateRoles(roles: string[]): Response<null, GlobalRolesErrorCode> | null {\n\t\tfor (const role of roles) {\n\t\t\tif (!Object.values(TenantRole).includes(role as TenantRole)) {\n\t\t\t\treturn new ResponseError('INVALID_ROLE', `Role ${role} is not valid`)\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n}\n\ntype GlobalRolesErrorCode =\n\t| 'IDENTITY_NOT_FOUND'\n\t| 'INVALID_ROLE'\n"],"names":[],"mappings":";;;;;;;;;;;AAKO,MAAM,aAAa;AAAA,EACzB,MAAM,eAAe,WAA4B,YAAoB,OAAyE;AAC7I,WAAO,KAAK,iBAAiB,WAAW,YAAY,OAAO,CAAA,CAAE;AAAA,EAAA;AAAA,EAG9D,MAAM,kBAAkB,WAA4B,YAAoB,OAAyE;AAChJ,WAAO,KAAK,iBAAiB,WAAW,YAAY,CAAA,GAAI,KAAK;AAAA,EAAA;AAAA,EAG9D,MAAc,iBAAiB,WAA4B,YAAoB,UAA6B,aAA+E;AACpL,UAAA,uBAAuB,KAAK,cAAc,CAAC,GAAG,UAAU,GAAG,WAAW,CAAC;AAC7E,QAAI,sBAAsB;AAClB,aAAA;AAAA,IAAA;AAEF,UAAA,SAAS,MAAM,UAAU,WAAW,QAAQ,IAAI,yBAAyB,YAAY,UAAU,WAAW,CAAC;AACjH,QAAI,CAAC,QAAQ;AACZ,aAAO,IAAI,cAAc,sBAAsB,YAAY,UAAU,YAAY;AAAA,IAAA;AAE3E,WAAA,IAAI,WAAW,IAAI;AAAA,EAAA;AAAA,EAInB,cAAc,OAA8D;AACnF,eAAW,QAAQ,OAAO;AACzB,UAAI,CAAC,OAAO,OAAO,UAAU,EAAE,SAAS,IAAkB,GAAG;AAC5D,eAAO,IAAI,cAAc,gBAAgB,QAAQ,IAAI,eAAe;AAAA,MAAA;AAAA,IACrE;AAEM,WAAA;AAAA,EAAA;AAET;"}
@@ -1 +1 @@
1
- {"version":3,"file":"SecretsManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/SecretsManager.ts"],"sourcesContent":["import { SetProjectSecretCommand, UpdateProjectCommand } from '../commands'\nimport { Providers } from '../providers'\nimport { ProjectSecretsQuery } from '../queries'\nimport { DatabaseContext } from '../utils'\n\nexport class SecretsManager {\n\tconstructor(private providers: Providers) {}\n\n\tpublic async setSecret(dbContext: DatabaseContext, projectId: string, key: string, value: string): Promise<void> {\n\t\tawait this.setSecrets(dbContext, projectId, [{ key, value: Buffer.from(value) }])\n\t}\n\n\tpublic async readSecrets(dbContext: DatabaseContext, projectId: string): Promise<Record<string, string>> {\n\t\tconst result = await dbContext.queryHandler.fetch(new ProjectSecretsQuery(projectId, this.providers))\n\t\tconst forUpdate = result.filter(it => it.needsReEncrypt)\n\t\tawait this.setSecrets(dbContext, projectId, forUpdate)\n\t\treturn Object.fromEntries(result.map(it => [it.key, it.value.toString()]))\n\t}\n\n\tprivate async setSecrets(dbContext: DatabaseContext, projectId: string, secrets: {key: string; value: Buffer}[]): Promise<void> {\n\t\tif (secrets.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tawait dbContext.transaction(async db => {\n\t\t\tfor (const { key, value } of secrets) {\n\t\t\t\tawait db.commandBus.execute(new SetProjectSecretCommand(projectId, key, Buffer.from(value)))\n\t\t\t}\n\t\t\tawait db.commandBus.execute(new UpdateProjectCommand(projectId, {}))\n\t\t})\n\t}\n}\n"],"names":["ProjectSecretsQuery","SetProjectSecretCommand","UpdateProjectCommand"],"mappings":";;;;;;;;;;;;;;AAKO,MAAM,eAAe;AAAA,EAC3B,YAAoB,WAAsB;AAAtB,SAAA,YAAA;AAAA,EAAuB;AAAA,EAE3C,MAAa,UAAU,WAA4B,WAAmB,KAAa,OAA8B;AAChH,UAAM,KAAK,WAAW,WAAW,WAAW,CAAC,EAAE,KAAK,OAAO,OAAO,KAAK,KAAK,EAAA,CAAG,CAAC;AAAA,EACjF;AAAA,EAEA,MAAa,YAAY,WAA4B,WAAoD;AAClG,UAAA,SAAS,MAAM,UAAU,aAAa,MAAM,IAAIA,oBAAoB,oBAAA,WAAW,KAAK,SAAS,CAAC;AACpG,UAAM,YAAY,OAAO,OAAO,CAAA,OAAM,GAAG,cAAc;AACvD,UAAM,KAAK,WAAW,WAAW,WAAW,SAAS;AACrD,WAAO,OAAO,YAAY,OAAO,IAAI,CAAM,OAAA,CAAC,GAAG,KAAK,GAAG,MAAM,SAAU,CAAA,CAAC,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAc,WAAW,WAA4B,WAAmB,SAAwD;AAC3H,QAAA,QAAQ,WAAW,GAAG;AACzB;AAAA,IACD;AACM,UAAA,UAAU,YAAY,OAAM,OAAM;AACvC,iBAAW,EAAE,KAAK,MAAM,KAAK,SAAS;AAC/B,cAAA,GAAG,WAAW,QAAQ,IAAIC,wBAAAA,wBAAwB,WAAW,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC;AAAA,MAC5F;AACM,YAAA,GAAG,WAAW,QAAQ,IAAIC,qBAAAA,qBAAqB,WAAW,CAAE,CAAA,CAAC;AAAA,IAAA,CACnE;AAAA,EACF;AACD;;"}
1
+ {"version":3,"file":"SecretsManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/SecretsManager.ts"],"sourcesContent":["import { SetProjectSecretCommand, UpdateProjectCommand } from '../commands'\nimport { Providers } from '../providers'\nimport { ProjectSecretsQuery } from '../queries'\nimport { DatabaseContext } from '../utils'\n\nexport class SecretsManager {\n\tconstructor(private providers: Providers) {}\n\n\tpublic async setSecret(dbContext: DatabaseContext, projectId: string, key: string, value: string): Promise<void> {\n\t\tawait this.setSecrets(dbContext, projectId, [{ key, value: Buffer.from(value) }])\n\t}\n\n\tpublic async readSecrets(dbContext: DatabaseContext, projectId: string): Promise<Record<string, string>> {\n\t\tconst result = await dbContext.queryHandler.fetch(new ProjectSecretsQuery(projectId, this.providers))\n\t\tconst forUpdate = result.filter(it => it.needsReEncrypt)\n\t\tawait this.setSecrets(dbContext, projectId, forUpdate)\n\t\treturn Object.fromEntries(result.map(it => [it.key, it.value.toString()]))\n\t}\n\n\tprivate async setSecrets(dbContext: DatabaseContext, projectId: string, secrets: {key: string; value: Buffer}[]): Promise<void> {\n\t\tif (secrets.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tawait dbContext.transaction(async db => {\n\t\t\tfor (const { key, value } of secrets) {\n\t\t\t\tawait db.commandBus.execute(new SetProjectSecretCommand(projectId, key, Buffer.from(value)))\n\t\t\t}\n\t\t\tawait db.commandBus.execute(new UpdateProjectCommand(projectId, {}))\n\t\t})\n\t}\n}\n"],"names":["ProjectSecretsQuery","SetProjectSecretCommand","UpdateProjectCommand"],"mappings":";;;;;;;;;;;;;;AAKO,MAAM,eAAe;AAAA,EAC3B,YAAoB,WAAsB;AAAtB,SAAA,YAAA;AAAA,EAAA;AAAA,EAEpB,MAAa,UAAU,WAA4B,WAAmB,KAAa,OAA8B;AAChH,UAAM,KAAK,WAAW,WAAW,WAAW,CAAC,EAAE,KAAK,OAAO,OAAO,KAAK,KAAK,EAAG,CAAA,CAAC;AAAA,EAAA;AAAA,EAGjF,MAAa,YAAY,WAA4B,WAAoD;AAClG,UAAA,SAAS,MAAM,UAAU,aAAa,MAAM,IAAIA,oBAAAA,oBAAoB,WAAW,KAAK,SAAS,CAAC;AACpG,UAAM,YAAY,OAAO,OAAO,CAAA,OAAM,GAAG,cAAc;AACvD,UAAM,KAAK,WAAW,WAAW,WAAW,SAAS;AACrD,WAAO,OAAO,YAAY,OAAO,IAAI,CAAM,OAAA,CAAC,GAAG,KAAK,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC;AAAA,EAAA;AAAA,EAG1E,MAAc,WAAW,WAA4B,WAAmB,SAAwD;AAC3H,QAAA,QAAQ,WAAW,GAAG;AACzB;AAAA,IAAA;AAEK,UAAA,UAAU,YAAY,OAAM,OAAM;AACvC,iBAAW,EAAE,KAAK,MAAM,KAAK,SAAS;AAC/B,cAAA,GAAG,WAAW,QAAQ,IAAIC,wBAAA,wBAAwB,WAAW,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC;AAAA,MAAA;AAEtF,YAAA,GAAG,WAAW,QAAQ,IAAIC,qBAAAA,qBAAqB,WAAW,CAAA,CAAE,CAAC;AAAA,IAAA,CACnE;AAAA,EAAA;AAEH;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"SecretsManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/SecretsManager.ts"],"sourcesContent":["import { SetProjectSecretCommand, UpdateProjectCommand } from '../commands'\nimport { Providers } from '../providers'\nimport { ProjectSecretsQuery } from '../queries'\nimport { DatabaseContext } from '../utils'\n\nexport class SecretsManager {\n\tconstructor(private providers: Providers) {}\n\n\tpublic async setSecret(dbContext: DatabaseContext, projectId: string, key: string, value: string): Promise<void> {\n\t\tawait this.setSecrets(dbContext, projectId, [{ key, value: Buffer.from(value) }])\n\t}\n\n\tpublic async readSecrets(dbContext: DatabaseContext, projectId: string): Promise<Record<string, string>> {\n\t\tconst result = await dbContext.queryHandler.fetch(new ProjectSecretsQuery(projectId, this.providers))\n\t\tconst forUpdate = result.filter(it => it.needsReEncrypt)\n\t\tawait this.setSecrets(dbContext, projectId, forUpdate)\n\t\treturn Object.fromEntries(result.map(it => [it.key, it.value.toString()]))\n\t}\n\n\tprivate async setSecrets(dbContext: DatabaseContext, projectId: string, secrets: {key: string; value: Buffer}[]): Promise<void> {\n\t\tif (secrets.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tawait dbContext.transaction(async db => {\n\t\t\tfor (const { key, value } of secrets) {\n\t\t\t\tawait db.commandBus.execute(new SetProjectSecretCommand(projectId, key, Buffer.from(value)))\n\t\t\t}\n\t\t\tawait db.commandBus.execute(new UpdateProjectCommand(projectId, {}))\n\t\t})\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAKO,MAAM,eAAe;AAAA,EAC3B,YAAoB,WAAsB;AAAtB,SAAA,YAAA;AAAA,EAAuB;AAAA,EAE3C,MAAa,UAAU,WAA4B,WAAmB,KAAa,OAA8B;AAChH,UAAM,KAAK,WAAW,WAAW,WAAW,CAAC,EAAE,KAAK,OAAO,OAAO,KAAK,KAAK,EAAA,CAAG,CAAC;AAAA,EACjF;AAAA,EAEA,MAAa,YAAY,WAA4B,WAAoD;AAClG,UAAA,SAAS,MAAM,UAAU,aAAa,MAAM,IAAI,oBAAoB,WAAW,KAAK,SAAS,CAAC;AACpG,UAAM,YAAY,OAAO,OAAO,CAAA,OAAM,GAAG,cAAc;AACvD,UAAM,KAAK,WAAW,WAAW,WAAW,SAAS;AACrD,WAAO,OAAO,YAAY,OAAO,IAAI,CAAM,OAAA,CAAC,GAAG,KAAK,GAAG,MAAM,SAAU,CAAA,CAAC,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAc,WAAW,WAA4B,WAAmB,SAAwD;AAC3H,QAAA,QAAQ,WAAW,GAAG;AACzB;AAAA,IACD;AACM,UAAA,UAAU,YAAY,OAAM,OAAM;AACvC,iBAAW,EAAE,KAAK,MAAM,KAAK,SAAS;AAC/B,cAAA,GAAG,WAAW,QAAQ,IAAI,wBAAwB,WAAW,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC;AAAA,MAC5F;AACM,YAAA,GAAG,WAAW,QAAQ,IAAI,qBAAqB,WAAW,CAAE,CAAA,CAAC;AAAA,IAAA,CACnE;AAAA,EACF;AACD;"}
1
+ {"version":3,"file":"SecretsManager.js","sources":["../../../../../../packages/engine-tenant-api/src/model/service/SecretsManager.ts"],"sourcesContent":["import { SetProjectSecretCommand, UpdateProjectCommand } from '../commands'\nimport { Providers } from '../providers'\nimport { ProjectSecretsQuery } from '../queries'\nimport { DatabaseContext } from '../utils'\n\nexport class SecretsManager {\n\tconstructor(private providers: Providers) {}\n\n\tpublic async setSecret(dbContext: DatabaseContext, projectId: string, key: string, value: string): Promise<void> {\n\t\tawait this.setSecrets(dbContext, projectId, [{ key, value: Buffer.from(value) }])\n\t}\n\n\tpublic async readSecrets(dbContext: DatabaseContext, projectId: string): Promise<Record<string, string>> {\n\t\tconst result = await dbContext.queryHandler.fetch(new ProjectSecretsQuery(projectId, this.providers))\n\t\tconst forUpdate = result.filter(it => it.needsReEncrypt)\n\t\tawait this.setSecrets(dbContext, projectId, forUpdate)\n\t\treturn Object.fromEntries(result.map(it => [it.key, it.value.toString()]))\n\t}\n\n\tprivate async setSecrets(dbContext: DatabaseContext, projectId: string, secrets: {key: string; value: Buffer}[]): Promise<void> {\n\t\tif (secrets.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tawait dbContext.transaction(async db => {\n\t\t\tfor (const { key, value } of secrets) {\n\t\t\t\tawait db.commandBus.execute(new SetProjectSecretCommand(projectId, key, Buffer.from(value)))\n\t\t\t}\n\t\t\tawait db.commandBus.execute(new UpdateProjectCommand(projectId, {}))\n\t\t})\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAKO,MAAM,eAAe;AAAA,EAC3B,YAAoB,WAAsB;AAAtB,SAAA,YAAA;AAAA,EAAA;AAAA,EAEpB,MAAa,UAAU,WAA4B,WAAmB,KAAa,OAA8B;AAChH,UAAM,KAAK,WAAW,WAAW,WAAW,CAAC,EAAE,KAAK,OAAO,OAAO,KAAK,KAAK,EAAG,CAAA,CAAC;AAAA,EAAA;AAAA,EAGjF,MAAa,YAAY,WAA4B,WAAoD;AAClG,UAAA,SAAS,MAAM,UAAU,aAAa,MAAM,IAAI,oBAAoB,WAAW,KAAK,SAAS,CAAC;AACpG,UAAM,YAAY,OAAO,OAAO,CAAA,OAAM,GAAG,cAAc;AACvD,UAAM,KAAK,WAAW,WAAW,WAAW,SAAS;AACrD,WAAO,OAAO,YAAY,OAAO,IAAI,CAAM,OAAA,CAAC,GAAG,KAAK,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC;AAAA,EAAA;AAAA,EAG1E,MAAc,WAAW,WAA4B,WAAmB,SAAwD;AAC3H,QAAA,QAAQ,WAAW,GAAG;AACzB;AAAA,IAAA;AAEK,UAAA,UAAU,YAAY,OAAM,OAAM;AACvC,iBAAW,EAAE,KAAK,MAAM,KAAK,SAAS;AAC/B,cAAA,GAAG,WAAW,QAAQ,IAAI,wBAAwB,WAAW,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC;AAAA,MAAA;AAEtF,YAAA,GAAG,WAAW,QAAQ,IAAI,qBAAqB,WAAW,CAAA,CAAE,CAAC;AAAA,IAAA,CACnE;AAAA,EAAA;AAEH;"}
@@ -1 +1 @@
1
- {"version":3,"file":"SignInManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/SignInManager.ts"],"sourcesContent":["import { CreateSessionTokenErrorCode, SignInErrorCode } from '../../schema'\nimport { ApiKeyManager, OtpAuthenticator } from '../service'\nimport { PersonQuery, PersonRow, PersonUniqueIdentifier } from '../queries'\nimport { Providers } from '../providers'\nimport { DatabaseContext } from '../utils'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { ImplementationException } from '../../exceptions'\n\nclass SignInManager {\n\tconstructor(\n\t\tprivate readonly apiKeyManager: ApiKeyManager,\n\t\tprivate readonly providers: Providers,\n\t\tprivate readonly otpAuthenticator: OtpAuthenticator,\n\t) {}\n\n\tasync signIn(dbContext: DatabaseContext, email: string, password: string, expiration?: number, otpCode?: string): Promise<SignInResponse> {\n\t\tconst personRow = await dbContext.queryHandler.fetch(PersonQuery.byEmail(email))\n\n\t\tif (personRow === null) {\n\t\t\treturn new ResponseError('UNKNOWN_EMAIL', `Person with email ${email} not found`)\n\t\t}\n\n\t\tif (!personRow.password_hash) {\n\t\t\treturn new ResponseError('NO_PASSWORD_SET', `No password set`)\n\t\t}\n\n\t\tif (personRow.disabled_at !== null) {\n\t\t\treturn new ResponseError('PERSON_DISABLED', `Person is disabled`)\n\t\t}\n\n\t\tconst passwordValid = await this.providers.bcryptCompare(password, personRow.password_hash)\n\n\t\tif (!passwordValid) {\n\t\t\treturn new ResponseError('INVALID_PASSWORD', `Password does not match`)\n\t\t}\n\n\t\tif (personRow.otp_uri && personRow.otp_activated_at) {\n\t\t\tif (!otpCode) {\n\t\t\t\treturn new ResponseError('OTP_REQUIRED', `2FA is enabled. OTP token is required`)\n\t\t\t}\n\n\t\t\tif (!this.otpAuthenticator.validate({ uri: personRow.otp_uri }, otpCode)) {\n\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed')\n\t\t\t}\n\t\t}\n\n\t\tconst sessionToken = await this.apiKeyManager.createSessionApiKey(dbContext, personRow.identity_id, expiration)\n\n\t\treturn new ResponseOk(new SignInResult(personRow, sessionToken))\n\t}\n\n\tasync createSessionToken(\n\t\tdbContext: DatabaseContext,\n\t\tpersonIdentifier: PersonUniqueIdentifier,\n\t\texpiration?: number,\n\t\tverifier?: (person: PersonRow) => Promise<void>,\n\t): Promise<CreateSessionTokenResponse> {\n\t\tconst personRow = await dbContext.queryHandler.fetch(PersonQuery.byUniqueIdentifier(personIdentifier))\n\n\t\tif (personRow === null) {\n\t\t\tif (personIdentifier.type === 'email') {\n\t\t\t\treturn new ResponseError('UNKNOWN_EMAIL', `Person with email ${personIdentifier.email} not found`)\n\n\t\t\t} else if (personIdentifier.type === 'id') {\n\t\t\t\treturn new ResponseError('UNKNOWN_PERSON_ID', `Person with id ${personIdentifier.id} not found`)\n\t\t\t}\n\n\t\t\tthrow new ImplementationException()\n\t\t}\n\n\t\tif (personRow.disabled_at !== null) {\n\t\t\treturn new ResponseError('PERSON_DISABLED', `Person with id ${personRow.id} is disabled`)\n\t\t}\n\n\t\tawait verifier?.(personRow)\n\n\t\tconst sessionToken = await this.apiKeyManager.createSessionApiKey(dbContext, personRow.identity_id, expiration)\n\t\treturn new ResponseOk(new SignInResult(personRow, sessionToken))\n\t}\n}\n\nexport class SignInResult {\n\tconstructor(\n\t\tpublic readonly person: PersonRow,\n\t\tpublic readonly token: string,\n\t) {}\n}\n\nexport type SignInResponse = Response<SignInResult, SignInErrorCode>\nexport type CreateSessionTokenResponse = Response<SignInResult, CreateSessionTokenErrorCode>\n\nexport { SignInManager }\n"],"names":["PersonQuery","ResponseError","ResponseOk","ImplementationException"],"mappings":";;;;;;;;;;;;AAQA,MAAM,cAAc;AAAA,EACnB,YACkB,eACA,WACA,kBAChB;AAHgB,SAAA,gBAAA;AACA,SAAA,YAAA;AACA,SAAA,mBAAA;AAAA,EACf;AAAA,EAEH,MAAM,OAAO,WAA4B,OAAe,UAAkB,YAAqB,SAA2C;AACnI,UAAA,YAAY,MAAM,UAAU,aAAa,MAAMA,wBAAY,QAAQ,KAAK,CAAC;AAE/E,QAAI,cAAc,MAAM;AACvB,aAAO,IAAIC,SAAA,cAAc,iBAAiB,qBAAqB,KAAK,YAAY;AAAA,IACjF;AAEI,QAAA,CAAC,UAAU,eAAe;AACtB,aAAA,IAAIA,SAAAA,cAAc,mBAAmB,iBAAiB;AAAA,IAC9D;AAEI,QAAA,UAAU,gBAAgB,MAAM;AAC5B,aAAA,IAAIA,SAAAA,cAAc,mBAAmB,oBAAoB;AAAA,IACjE;AAEA,UAAM,gBAAgB,MAAM,KAAK,UAAU,cAAc,UAAU,UAAU,aAAa;AAE1F,QAAI,CAAC,eAAe;AACZ,aAAA,IAAIA,SAAAA,cAAc,oBAAoB,yBAAyB;AAAA,IACvE;AAEI,QAAA,UAAU,WAAW,UAAU,kBAAkB;AACpD,UAAI,CAAC,SAAS;AACN,eAAA,IAAIA,SAAAA,cAAc,gBAAgB,uCAAuC;AAAA,MACjF;AAEI,UAAA,CAAC,KAAK,iBAAiB,SAAS,EAAE,KAAK,UAAU,WAAW,OAAO,GAAG;AAClE,eAAA,IAAIA,SAAc,cAAA,qBAAqB,iCAAiC;AAAA,MAChF;AAAA,IACD;AAEM,UAAA,eAAe,MAAM,KAAK,cAAc,oBAAoB,WAAW,UAAU,aAAa,UAAU;AAE9G,WAAO,IAAIC,SAAW,WAAA,IAAI,aAAa,WAAW,YAAY,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,mBACL,WACA,kBACA,YACA,UACsC;AAChC,UAAA,YAAY,MAAM,UAAU,aAAa,MAAMF,wBAAY,mBAAmB,gBAAgB,CAAC;AAErG,QAAI,cAAc,MAAM;AACnB,UAAA,iBAAiB,SAAS,SAAS;AACtC,eAAO,IAAIC,SAAAA,cAAc,iBAAiB,qBAAqB,iBAAiB,KAAK,YAAY;AAAA,MAAA,WAEvF,iBAAiB,SAAS,MAAM;AAC1C,eAAO,IAAIA,SAAAA,cAAc,qBAAqB,kBAAkB,iBAAiB,EAAE,YAAY;AAAA,MAChG;AAEA,YAAM,IAAIE,WAAwB,wBAAA;AAAA,IACnC;AAEI,QAAA,UAAU,gBAAgB,MAAM;AACnC,aAAO,IAAIF,SAAAA,cAAc,mBAAmB,kBAAkB,UAAU,EAAE,cAAc;AAAA,IACzF;AAEA,UAAM,WAAW,SAAS;AAEpB,UAAA,eAAe,MAAM,KAAK,cAAc,oBAAoB,WAAW,UAAU,aAAa,UAAU;AAC9G,WAAO,IAAIC,SAAW,WAAA,IAAI,aAAa,WAAW,YAAY,CAAC;AAAA,EAChE;AACD;AAEO,MAAM,aAAa;AAAA,EACzB,YACiB,QACA,OACf;AAFe,SAAA,SAAA;AACA,SAAA,QAAA;AAAA,EACd;AACJ;;;"}
1
+ {"version":3,"file":"SignInManager.cjs","sources":["../../../../../../packages/engine-tenant-api/src/model/service/SignInManager.ts"],"sourcesContent":["import { CreateSessionTokenErrorCode, SignInErrorCode } from '../../schema'\nimport { ApiKeyManager, OtpAuthenticator } from '../service'\nimport { PersonQuery, PersonRow, PersonUniqueIdentifier } from '../queries'\nimport { Providers } from '../providers'\nimport { DatabaseContext } from '../utils'\nimport { Response, ResponseError, ResponseOk } from '../utils/Response'\nimport { ImplementationException } from '../../exceptions'\n\nclass SignInManager {\n\tconstructor(\n\t\tprivate readonly apiKeyManager: ApiKeyManager,\n\t\tprivate readonly providers: Providers,\n\t\tprivate readonly otpAuthenticator: OtpAuthenticator,\n\t) {}\n\n\tasync signIn(dbContext: DatabaseContext, email: string, password: string, expiration?: number, otpCode?: string): Promise<SignInResponse> {\n\t\tconst personRow = await dbContext.queryHandler.fetch(PersonQuery.byEmail(email))\n\n\t\tif (personRow === null) {\n\t\t\treturn new ResponseError('UNKNOWN_EMAIL', `Person with email ${email} not found`)\n\t\t}\n\n\t\tif (!personRow.password_hash) {\n\t\t\treturn new ResponseError('NO_PASSWORD_SET', `No password set`)\n\t\t}\n\n\t\tif (personRow.disabled_at !== null) {\n\t\t\treturn new ResponseError('PERSON_DISABLED', `Person is disabled`)\n\t\t}\n\n\t\tconst passwordValid = await this.providers.bcryptCompare(password, personRow.password_hash)\n\n\t\tif (!passwordValid) {\n\t\t\treturn new ResponseError('INVALID_PASSWORD', `Password does not match`)\n\t\t}\n\n\t\tif (personRow.otp_uri && personRow.otp_activated_at) {\n\t\t\tif (!otpCode) {\n\t\t\t\treturn new ResponseError('OTP_REQUIRED', `2FA is enabled. OTP token is required`)\n\t\t\t}\n\n\t\t\tif (!this.otpAuthenticator.validate({ uri: personRow.otp_uri }, otpCode)) {\n\t\t\t\treturn new ResponseError('INVALID_OTP_TOKEN', 'OTP token validation has failed')\n\t\t\t}\n\t\t}\n\n\t\tconst sessionToken = await this.apiKeyManager.createSessionApiKey(dbContext, personRow.identity_id, expiration)\n\n\t\treturn new ResponseOk(new SignInResult(personRow, sessionToken))\n\t}\n\n\tasync createSessionToken(\n\t\tdbContext: DatabaseContext,\n\t\tpersonIdentifier: PersonUniqueIdentifier,\n\t\texpiration?: number,\n\t\tverifier?: (person: PersonRow) => Promise<void>,\n\t): Promise<CreateSessionTokenResponse> {\n\t\tconst personRow = await dbContext.queryHandler.fetch(PersonQuery.byUniqueIdentifier(personIdentifier))\n\n\t\tif (personRow === null) {\n\t\t\tif (personIdentifier.type === 'email') {\n\t\t\t\treturn new ResponseError('UNKNOWN_EMAIL', `Person with email ${personIdentifier.email} not found`)\n\n\t\t\t} else if (personIdentifier.type === 'id') {\n\t\t\t\treturn new ResponseError('UNKNOWN_PERSON_ID', `Person with id ${personIdentifier.id} not found`)\n\t\t\t}\n\n\t\t\tthrow new ImplementationException()\n\t\t}\n\n\t\tif (personRow.disabled_at !== null) {\n\t\t\treturn new ResponseError('PERSON_DISABLED', `Person with id ${personRow.id} is disabled`)\n\t\t}\n\n\t\tawait verifier?.(personRow)\n\n\t\tconst sessionToken = await this.apiKeyManager.createSessionApiKey(dbContext, personRow.identity_id, expiration)\n\t\treturn new ResponseOk(new SignInResult(personRow, sessionToken))\n\t}\n}\n\nexport class SignInResult {\n\tconstructor(\n\t\tpublic readonly person: PersonRow,\n\t\tpublic readonly token: string,\n\t) {}\n}\n\nexport type SignInResponse = Response<SignInResult, SignInErrorCode>\nexport type CreateSessionTokenResponse = Response<SignInResult, CreateSessionTokenErrorCode>\n\nexport { SignInManager }\n"],"names":["PersonQuery","ResponseError","ResponseOk","ImplementationException"],"mappings":";;;;;;;;;;;;AAQA,MAAM,cAAc;AAAA,EACnB,YACkB,eACA,WACA,kBAChB;AAHgB,SAAA,gBAAA;AACA,SAAA,YAAA;AACA,SAAA,mBAAA;AAAA,EAAA;AAAA,EAGlB,MAAM,OAAO,WAA4B,OAAe,UAAkB,YAAqB,SAA2C;AACnI,UAAA,YAAY,MAAM,UAAU,aAAa,MAAMA,wBAAY,QAAQ,KAAK,CAAC;AAE/E,QAAI,cAAc,MAAM;AACvB,aAAO,IAAIC,SAAA,cAAc,iBAAiB,qBAAqB,KAAK,YAAY;AAAA,IAAA;AAG7E,QAAA,CAAC,UAAU,eAAe;AACtB,aAAA,IAAIA,SAAc,cAAA,mBAAmB,iBAAiB;AAAA,IAAA;AAG1D,QAAA,UAAU,gBAAgB,MAAM;AAC5B,aAAA,IAAIA,SAAc,cAAA,mBAAmB,oBAAoB;AAAA,IAAA;AAGjE,UAAM,gBAAgB,MAAM,KAAK,UAAU,cAAc,UAAU,UAAU,aAAa;AAE1F,QAAI,CAAC,eAAe;AACZ,aAAA,IAAIA,SAAc,cAAA,oBAAoB,yBAAyB;AAAA,IAAA;AAGnE,QAAA,UAAU,WAAW,UAAU,kBAAkB;AACpD,UAAI,CAAC,SAAS;AACN,eAAA,IAAIA,SAAc,cAAA,gBAAgB,uCAAuC;AAAA,MAAA;AAG7E,UAAA,CAAC,KAAK,iBAAiB,SAAS,EAAE,KAAK,UAAU,WAAW,OAAO,GAAG;AAClE,eAAA,IAAIA,SAAAA,cAAc,qBAAqB,iCAAiC;AAAA,MAAA;AAAA,IAChF;AAGK,UAAA,eAAe,MAAM,KAAK,cAAc,oBAAoB,WAAW,UAAU,aAAa,UAAU;AAE9G,WAAO,IAAIC,SAAAA,WAAW,IAAI,aAAa,WAAW,YAAY,CAAC;AAAA,EAAA;AAAA,EAGhE,MAAM,mBACL,WACA,kBACA,YACA,UACsC;AAChC,UAAA,YAAY,MAAM,UAAU,aAAa,MAAMF,wBAAY,mBAAmB,gBAAgB,CAAC;AAErG,QAAI,cAAc,MAAM;AACnB,UAAA,iBAAiB,SAAS,SAAS;AACtC,eAAO,IAAIC,SAAc,cAAA,iBAAiB,qBAAqB,iBAAiB,KAAK,YAAY;AAAA,MAAA,WAEvF,iBAAiB,SAAS,MAAM;AAC1C,eAAO,IAAIA,SAAc,cAAA,qBAAqB,kBAAkB,iBAAiB,EAAE,YAAY;AAAA,MAAA;AAGhG,YAAM,IAAIE,WAAAA,wBAAwB;AAAA,IAAA;AAG/B,QAAA,UAAU,gBAAgB,MAAM;AACnC,aAAO,IAAIF,SAAc,cAAA,mBAAmB,kBAAkB,UAAU,EAAE,cAAc;AAAA,IAAA;AAGzF,UAAM,WAAW,SAAS;AAEpB,UAAA,eAAe,MAAM,KAAK,cAAc,oBAAoB,WAAW,UAAU,aAAa,UAAU;AAC9G,WAAO,IAAIC,SAAAA,WAAW,IAAI,aAAa,WAAW,YAAY,CAAC;AAAA,EAAA;AAEjE;AAEO,MAAM,aAAa;AAAA,EACzB,YACiB,QACA,OACf;AAFe,SAAA,SAAA;AACA,SAAA,QAAA;AAAA,EAAA;AAElB;;;"}