@contember/engine-tenant-api 1.3.0-alpha.8 → 1.3.0-beta.1

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 (374) hide show
  1. package/dist/src/TenantContainer.d.ts +17 -3
  2. package/dist/src/TenantContainer.d.ts.map +1 -1
  3. package/dist/src/TenantContainer.js +7 -0
  4. package/dist/src/TenantContainer.js.map +1 -1
  5. package/dist/src/bridges/system/IdentityFetcher.d.ts +1 -1
  6. package/dist/src/bridges/system/IdentityFetcher.d.ts.map +1 -1
  7. package/dist/src/migrations/2023-01-20-135500-person-email-normalize.d.ts +3 -0
  8. package/dist/src/migrations/2023-01-20-135500-person-email-normalize.d.ts.map +1 -0
  9. package/dist/src/migrations/2023-01-20-135500-person-email-normalize.js +28 -0
  10. package/dist/src/migrations/2023-01-20-135500-person-email-normalize.js.map +1 -0
  11. package/dist/src/migrations/2023-06-03-104000-person-disabled.d.ts +3 -0
  12. package/dist/src/migrations/2023-06-03-104000-person-disabled.d.ts.map +1 -0
  13. package/dist/src/migrations/2023-06-03-104000-person-disabled.js +11 -0
  14. package/dist/src/migrations/2023-06-03-104000-person-disabled.js.map +1 -0
  15. package/dist/src/migrations/runner.d.ts.map +1 -1
  16. package/dist/src/migrations/runner.js +4 -0
  17. package/dist/src/migrations/runner.js.map +1 -1
  18. package/dist/src/migrations/snapshot.d.ts.map +1 -1
  19. package/dist/src/migrations/snapshot.js +1 -0
  20. package/dist/src/migrations/snapshot.js.map +1 -1
  21. package/dist/src/model/authorization/AclSchemaAccessNodeFactory.d.ts.map +1 -1
  22. package/dist/src/model/authorization/AclSchemaAccessNodeFactory.js +14 -9
  23. package/dist/src/model/authorization/AclSchemaAccessNodeFactory.js.map +1 -1
  24. package/dist/src/model/authorization/MembershipMatcher.d.ts +1 -1
  25. package/dist/src/model/authorization/MembershipMatcher.d.ts.map +1 -1
  26. package/dist/src/model/authorization/PermissionActions.d.ts +21 -0
  27. package/dist/src/model/authorization/PermissionActions.d.ts.map +1 -1
  28. package/dist/src/model/authorization/PermissionActions.js +4 -2
  29. package/dist/src/model/authorization/PermissionActions.js.map +1 -1
  30. package/dist/src/model/authorization/PermissionContext.d.ts +1 -1
  31. package/dist/src/model/authorization/PermissionContext.d.ts.map +1 -1
  32. package/dist/src/model/authorization/PermissionsFactory.d.ts.map +1 -1
  33. package/dist/src/model/authorization/PermissionsFactory.js +6 -3
  34. package/dist/src/model/authorization/PermissionsFactory.js.map +1 -1
  35. package/dist/src/model/authorization/Roles.js +1 -1
  36. package/dist/src/model/authorization/Roles.js.map +1 -1
  37. package/dist/src/model/commands/apiKey/CreateApiKeyCommand.d.ts +1 -1
  38. package/dist/src/model/commands/apiKey/CreateApiKeyCommand.d.ts.map +1 -1
  39. package/dist/src/model/commands/identity/PatchIdentityGlobalRoles.d.ts +9 -0
  40. package/dist/src/model/commands/identity/PatchIdentityGlobalRoles.d.ts.map +1 -0
  41. package/dist/src/model/commands/identity/PatchIdentityGlobalRoles.js +29 -0
  42. package/dist/src/model/commands/identity/PatchIdentityGlobalRoles.js.map +1 -0
  43. package/dist/src/model/commands/identity/index.d.ts +1 -0
  44. package/dist/src/model/commands/identity/index.d.ts.map +1 -1
  45. package/dist/src/model/commands/identity/index.js +1 -0
  46. package/dist/src/model/commands/identity/index.js.map +1 -1
  47. package/dist/src/model/commands/idp/UpdateIdpCommand.d.ts +1 -1
  48. package/dist/src/model/commands/idp/UpdateIdpCommand.d.ts.map +1 -1
  49. package/dist/src/model/commands/membership/AddProjectMemberCommand.d.ts +2 -6
  50. package/dist/src/model/commands/membership/AddProjectMemberCommand.d.ts.map +1 -1
  51. package/dist/src/model/commands/membership/AddProjectMemberCommand.js +5 -11
  52. package/dist/src/model/commands/membership/AddProjectMemberCommand.js.map +1 -1
  53. package/dist/src/model/commands/membership/RemoveProjectMemberCommand.d.ts +1 -1
  54. package/dist/src/model/commands/membership/RemoveProjectMemberCommand.d.ts.map +1 -1
  55. package/dist/src/model/commands/membership/RemoveProjectMemberCommand.js +1 -2
  56. package/dist/src/model/commands/membership/RemoveProjectMemberCommand.js.map +1 -1
  57. package/dist/src/model/commands/membership/UpdateProjectMemberCommand.d.ts +1 -1
  58. package/dist/src/model/commands/membership/UpdateProjectMemberCommand.d.ts.map +1 -1
  59. package/dist/src/model/commands/membership/UpdateProjectMemberCommand.js +2 -3
  60. package/dist/src/model/commands/membership/UpdateProjectMemberCommand.js.map +1 -1
  61. package/dist/src/model/commands/membership/types.d.ts +3 -3
  62. package/dist/src/model/commands/membership/types.d.ts.map +1 -1
  63. package/dist/src/model/commands/passwordReset/ResetPasswordCommand.d.ts +2 -6
  64. package/dist/src/model/commands/passwordReset/ResetPasswordCommand.d.ts.map +1 -1
  65. package/dist/src/model/commands/passwordReset/ResetPasswordCommand.js +5 -11
  66. package/dist/src/model/commands/passwordReset/ResetPasswordCommand.js.map +1 -1
  67. package/dist/src/model/commands/person/CreatePersonCommand.d.ts.map +1 -1
  68. package/dist/src/model/commands/person/CreatePersonCommand.js +10 -5
  69. package/dist/src/model/commands/person/CreatePersonCommand.js.map +1 -1
  70. package/dist/src/model/commands/person/DisablePersonCommand.d.ts +7 -0
  71. package/dist/src/model/commands/person/DisablePersonCommand.d.ts.map +1 -0
  72. package/dist/src/model/commands/person/DisablePersonCommand.js +22 -0
  73. package/dist/src/model/commands/person/DisablePersonCommand.js.map +1 -0
  74. package/dist/src/model/dtos/Password.d.ts +1 -1
  75. package/dist/src/model/dtos/Password.d.ts.map +1 -1
  76. package/dist/src/model/mailing/type.js +1 -1
  77. package/dist/src/model/mailing/type.js.map +1 -1
  78. package/dist/src/model/queries/apiKey/ApiKeyQuery.d.ts +23 -0
  79. package/dist/src/model/queries/apiKey/ApiKeyQuery.d.ts.map +1 -0
  80. package/dist/src/model/queries/apiKey/ApiKeyQuery.js +45 -0
  81. package/dist/src/model/queries/apiKey/ApiKeyQuery.js.map +1 -0
  82. package/dist/src/model/queries/apiKey/index.d.ts +1 -1
  83. package/dist/src/model/queries/apiKey/index.d.ts.map +1 -1
  84. package/dist/src/model/queries/apiKey/index.js +1 -1
  85. package/dist/src/model/queries/apiKey/index.js.map +1 -1
  86. package/dist/src/model/queries/idp/types.d.ts +4 -4
  87. package/dist/src/model/queries/idp/types.d.ts.map +1 -1
  88. package/dist/src/model/queries/membership/ProjectMembersQuery.d.ts +1 -1
  89. package/dist/src/model/queries/membership/ProjectMembersQuery.d.ts.map +1 -1
  90. package/dist/src/model/queries/membership/ProjectMembersQuery.js +3 -4
  91. package/dist/src/model/queries/membership/ProjectMembersQuery.js.map +1 -1
  92. package/dist/src/model/queries/person/PersonQuery.d.ts +4 -3
  93. package/dist/src/model/queries/person/PersonQuery.d.ts.map +1 -1
  94. package/dist/src/model/queries/person/PersonQuery.js +22 -0
  95. package/dist/src/model/queries/person/PersonQuery.js.map +1 -1
  96. package/dist/src/model/queries/person/PersonQueryBuilderFactory.d.ts.map +1 -1
  97. package/dist/src/model/queries/person/PersonQueryBuilderFactory.js +1 -0
  98. package/dist/src/model/queries/person/PersonQueryBuilderFactory.js.map +1 -1
  99. package/dist/src/model/queries/person/types.d.ts +4 -3
  100. package/dist/src/model/queries/person/types.d.ts.map +1 -1
  101. package/dist/src/model/queries/project/ProjectSecretsQuery.d.ts +1 -1
  102. package/dist/src/model/queries/project/ProjectSecretsQuery.d.ts.map +1 -1
  103. package/dist/src/model/service/IDPSignInManager.d.ts.map +1 -1
  104. package/dist/src/model/service/IDPSignInManager.js +8 -6
  105. package/dist/src/model/service/IDPSignInManager.js.map +1 -1
  106. package/dist/src/model/service/InviteManager.d.ts +1 -1
  107. package/dist/src/model/service/InviteManager.d.ts.map +1 -1
  108. package/dist/src/model/service/InviteManager.js +2 -3
  109. package/dist/src/model/service/InviteManager.js.map +1 -1
  110. package/dist/src/model/service/OtpAuthenticator.d.ts +1 -1
  111. package/dist/src/model/service/OtpAuthenticator.d.ts.map +1 -1
  112. package/dist/src/model/service/PasswordChangeManager.js +4 -5
  113. package/dist/src/model/service/PasswordChangeManager.js.map +1 -1
  114. package/dist/src/model/service/PasswordResetManager.d.ts +2 -4
  115. package/dist/src/model/service/PasswordResetManager.d.ts.map +1 -1
  116. package/dist/src/model/service/PasswordResetManager.js +2 -6
  117. package/dist/src/model/service/PasswordResetManager.js.map +1 -1
  118. package/dist/src/model/service/PersonAccessManager.d.ts +14 -0
  119. package/dist/src/model/service/PersonAccessManager.d.ts.map +1 -0
  120. package/dist/src/model/service/PersonAccessManager.js +42 -0
  121. package/dist/src/model/service/PersonAccessManager.js.map +1 -0
  122. package/dist/src/model/service/PersonManager.d.ts +7 -0
  123. package/dist/src/model/service/PersonManager.d.ts.map +1 -0
  124. package/dist/src/model/service/PersonManager.js +11 -0
  125. package/dist/src/model/service/PersonManager.js.map +1 -0
  126. package/dist/src/model/service/ProjectManager.d.ts +1 -1
  127. package/dist/src/model/service/ProjectManager.d.ts.map +1 -1
  128. package/dist/src/model/service/ProjectManager.js +2 -3
  129. package/dist/src/model/service/ProjectManager.js.map +1 -1
  130. package/dist/src/model/service/ProjectMemberManager.d.ts +2 -2
  131. package/dist/src/model/service/ProjectMemberManager.d.ts.map +1 -1
  132. package/dist/src/model/service/ProjectMemberManager.js +3 -16
  133. package/dist/src/model/service/ProjectMemberManager.js.map +1 -1
  134. package/dist/src/model/service/RolesManager.d.ts +11 -0
  135. package/dist/src/model/service/RolesManager.d.ts.map +1 -0
  136. package/dist/src/model/service/RolesManager.js +35 -0
  137. package/dist/src/model/service/RolesManager.js.map +1 -0
  138. package/dist/src/model/service/SignInManager.d.ts +2 -2
  139. package/dist/src/model/service/SignInManager.d.ts.map +1 -1
  140. package/dist/src/model/service/SignInManager.js +13 -8
  141. package/dist/src/model/service/SignInManager.js.map +1 -1
  142. package/dist/src/model/service/SignUpManager.d.ts +2 -2
  143. package/dist/src/model/service/SignUpManager.d.ts.map +1 -1
  144. package/dist/src/model/service/SignUpManager.js +2 -3
  145. package/dist/src/model/service/SignUpManager.js.map +1 -1
  146. package/dist/src/model/service/apiKey/ApiKeyManager.d.ts +3 -1
  147. package/dist/src/model/service/apiKey/ApiKeyManager.d.ts.map +1 -1
  148. package/dist/src/model/service/apiKey/ApiKeyManager.js +4 -1
  149. package/dist/src/model/service/apiKey/ApiKeyManager.js.map +1 -1
  150. package/dist/src/model/service/apiKey/ApiKeyService.d.ts +1 -1
  151. package/dist/src/model/service/apiKey/ApiKeyService.d.ts.map +1 -1
  152. package/dist/src/model/service/idp/IDPManager.d.ts +4 -4
  153. package/dist/src/model/service/idp/IDPManager.d.ts.map +1 -1
  154. package/dist/src/model/service/idp/IDPManager.js +7 -8
  155. package/dist/src/model/service/idp/IDPManager.js.map +1 -1
  156. package/dist/src/model/service/idp/providers/AppleProvider.d.ts +1 -1
  157. package/dist/src/model/service/idp/providers/AppleProvider.d.ts.map +1 -1
  158. package/dist/src/model/service/idp/providers/FacebookProvider.d.ts +1 -1
  159. package/dist/src/model/service/idp/providers/FacebookProvider.d.ts.map +1 -1
  160. package/dist/src/model/service/idp/providers/OIDCTypes.d.ts +3 -3
  161. package/dist/src/model/service/idp/providers/OIDCTypes.d.ts.map +1 -1
  162. package/dist/src/model/service/index.d.ts +2 -0
  163. package/dist/src/model/service/index.d.ts.map +1 -1
  164. package/dist/src/model/service/index.js +2 -0
  165. package/dist/src/model/service/index.js.map +1 -1
  166. package/dist/src/model/type/Variables.d.ts +1 -1
  167. package/dist/src/model/type/Variables.d.ts.map +1 -1
  168. package/dist/src/model/utils/Response.d.ts +2 -2
  169. package/dist/src/model/utils/Response.d.ts.map +1 -1
  170. package/dist/src/model/utils/email.d.ts +2 -0
  171. package/dist/src/model/utils/email.d.ts.map +1 -0
  172. package/dist/src/model/utils/email.js +8 -0
  173. package/dist/src/model/utils/email.js.map +1 -0
  174. package/dist/src/model/utils/tokenUtils.d.ts +1 -1
  175. package/dist/src/model/utils/tokenUtils.d.ts.map +1 -1
  176. package/dist/src/model/utils/typeUtils.d.ts +1 -1
  177. package/dist/src/model/utils/typeUtils.d.ts.map +1 -1
  178. package/dist/src/resolvers/ResolverFactory.d.ts +4 -1
  179. package/dist/src/resolvers/ResolverFactory.d.ts.map +1 -1
  180. package/dist/src/resolvers/ResolverFactory.js +3 -0
  181. package/dist/src/resolvers/ResolverFactory.js.map +1 -1
  182. package/dist/src/resolvers/errorUtils.d.ts +3 -3
  183. package/dist/src/resolvers/errorUtils.d.ts.map +1 -1
  184. package/dist/src/resolvers/errorUtils.js.map +1 -1
  185. package/dist/src/resolvers/membershipUtils.d.ts +4 -9
  186. package/dist/src/resolvers/membershipUtils.d.ts.map +1 -1
  187. package/dist/src/resolvers/membershipUtils.js +10 -18
  188. package/dist/src/resolvers/membershipUtils.js.map +1 -1
  189. package/dist/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js +1 -2
  190. package/dist/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js.map +1 -1
  191. package/dist/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js +1 -2
  192. package/dist/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js.map +1 -1
  193. package/dist/src/resolvers/mutation/identity/GlobalRolesMutationResolver.d.ts +11 -0
  194. package/dist/src/resolvers/mutation/identity/GlobalRolesMutationResolver.d.ts.map +1 -0
  195. package/dist/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js +44 -0
  196. package/dist/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js.map +1 -0
  197. package/dist/src/resolvers/mutation/identity/index.d.ts +2 -0
  198. package/dist/src/resolvers/mutation/identity/index.d.ts.map +1 -0
  199. package/dist/src/resolvers/mutation/identity/index.js +18 -0
  200. package/dist/src/resolvers/mutation/identity/index.js.map +1 -0
  201. package/dist/src/resolvers/mutation/index.d.ts +1 -0
  202. package/dist/src/resolvers/mutation/index.d.ts.map +1 -1
  203. package/dist/src/resolvers/mutation/index.js +1 -0
  204. package/dist/src/resolvers/mutation/index.js.map +1 -1
  205. package/dist/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js +6 -7
  206. package/dist/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js.map +1 -1
  207. package/dist/src/resolvers/mutation/person/ChangePasswordMutationResolver.js +2 -3
  208. package/dist/src/resolvers/mutation/person/ChangePasswordMutationResolver.js.map +1 -1
  209. package/dist/src/resolvers/mutation/person/DisablePersonMutationResolver.d.ts +11 -0
  210. package/dist/src/resolvers/mutation/person/DisablePersonMutationResolver.d.ts.map +1 -0
  211. package/dist/src/resolvers/mutation/person/DisablePersonMutationResolver.js +36 -0
  212. package/dist/src/resolvers/mutation/person/DisablePersonMutationResolver.js.map +1 -0
  213. package/dist/src/resolvers/mutation/person/InviteMutationResolver.d.ts.map +1 -1
  214. package/dist/src/resolvers/mutation/person/InviteMutationResolver.js +3 -4
  215. package/dist/src/resolvers/mutation/person/InviteMutationResolver.js.map +1 -1
  216. package/dist/src/resolvers/mutation/person/OtpMutationResolver.d.ts.map +1 -1
  217. package/dist/src/resolvers/mutation/person/OtpMutationResolver.js +3 -4
  218. package/dist/src/resolvers/mutation/person/OtpMutationResolver.js.map +1 -1
  219. package/dist/src/resolvers/mutation/person/ResetPasswordMutationResolver.d.ts.map +1 -1
  220. package/dist/src/resolvers/mutation/person/ResetPasswordMutationResolver.js +2 -10
  221. package/dist/src/resolvers/mutation/person/ResetPasswordMutationResolver.js.map +1 -1
  222. package/dist/src/resolvers/mutation/person/SignInMutationResolver.d.ts.map +1 -1
  223. package/dist/src/resolvers/mutation/person/SignInMutationResolver.js.map +1 -1
  224. package/dist/src/resolvers/mutation/person/SignOutMutationResolver.d.ts.map +1 -1
  225. package/dist/src/resolvers/mutation/person/SignOutMutationResolver.js +5 -2
  226. package/dist/src/resolvers/mutation/person/SignOutMutationResolver.js.map +1 -1
  227. package/dist/src/resolvers/mutation/project/CreateProjectMutationResolver.d.ts.map +1 -1
  228. package/dist/src/resolvers/mutation/project/CreateProjectMutationResolver.js +1 -2
  229. package/dist/src/resolvers/mutation/project/CreateProjectMutationResolver.js.map +1 -1
  230. package/dist/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js +1 -2
  231. package/dist/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js.map +1 -1
  232. package/dist/src/resolvers/mutation/project/UpdateProjectMutationResolver.d.ts.map +1 -1
  233. package/dist/src/resolvers/mutation/project/UpdateProjectMutationResolver.js +1 -2
  234. package/dist/src/resolvers/mutation/project/UpdateProjectMutationResolver.js.map +1 -1
  235. package/dist/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js +1 -2
  236. package/dist/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js.map +1 -1
  237. package/dist/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js +1 -2
  238. package/dist/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js.map +1 -1
  239. package/dist/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js +1 -2
  240. package/dist/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js.map +1 -1
  241. package/dist/src/resolvers/types/ProjectTypeResolver.d.ts.map +1 -1
  242. package/dist/src/resolvers/types/ProjectTypeResolver.js +5 -6
  243. package/dist/src/resolvers/types/ProjectTypeResolver.js.map +1 -1
  244. package/dist/src/schema/index.d.ts +431 -397
  245. package/dist/src/schema/index.d.ts.map +1 -1
  246. package/dist/src/schema/index.js +0 -188
  247. package/dist/src/schema/index.js.map +1 -1
  248. package/dist/src/schema/tenant.graphql.d.ts.map +1 -1
  249. package/dist/src/schema/tenant.graphql.js +97 -21
  250. package/dist/src/schema/tenant.graphql.js.map +1 -1
  251. package/dist/src/tsconfig.tsbuildinfo +1 -1
  252. package/dist/src/utils/Mailer.d.ts +1 -1
  253. package/dist/src/utils/Mailer.d.ts.map +1 -1
  254. package/dist/src/utils/array.d.ts +1 -1
  255. package/dist/src/utils/array.d.ts.map +1 -1
  256. package/dist/src/utils/batchQuery.d.ts +2 -2
  257. package/dist/src/utils/batchQuery.d.ts.map +1 -1
  258. package/dist/tests/cases/integration/db/updateRoles.test.d.ts +2 -0
  259. package/dist/tests/cases/integration/db/updateRoles.test.d.ts.map +1 -0
  260. package/dist/tests/cases/integration/db/updateRoles.test.js +67 -0
  261. package/dist/tests/cases/integration/db/updateRoles.test.js.map +1 -0
  262. package/dist/tests/cases/integration/mocked/confirmOtpMutation.test.js +1 -2
  263. package/dist/tests/cases/integration/mocked/confirmOtpMutation.test.js.map +1 -1
  264. package/dist/tests/cases/integration/mocked/gql/signUp.d.ts.map +1 -1
  265. package/dist/tests/cases/integration/mocked/gql/signUp.js +4 -0
  266. package/dist/tests/cases/integration/mocked/gql/signUp.js.map +1 -1
  267. package/dist/tests/cases/integration/mocked/gql/types.d.ts +1 -1
  268. package/dist/tests/cases/integration/mocked/gql/types.d.ts.map +1 -1
  269. package/dist/tests/cases/integration/mocked/signInMutation.test.js +36 -4
  270. package/dist/tests/cases/integration/mocked/signInMutation.test.js.map +1 -1
  271. package/dist/tests/cases/integration/mocked/signOutMutation.test.js +53 -0
  272. package/dist/tests/cases/integration/mocked/signOutMutation.test.js.map +1 -1
  273. package/dist/tests/cases/integration/mocked/signUpMutation.test.js +9 -0
  274. package/dist/tests/cases/integration/mocked/signUpMutation.test.js.map +1 -1
  275. package/dist/tests/cases/integration/mocked/sql/getApiKeySql.d.ts +11 -0
  276. package/dist/tests/cases/integration/mocked/sql/getApiKeySql.d.ts.map +1 -0
  277. package/dist/tests/cases/integration/mocked/sql/getApiKeySql.js +31 -0
  278. package/dist/tests/cases/integration/mocked/sql/getApiKeySql.js.map +1 -0
  279. package/dist/tests/cases/integration/mocked/sql/getPersonByEmailSql.d.ts.map +1 -1
  280. package/dist/tests/cases/integration/mocked/sql/getPersonByEmailSql.js +2 -1
  281. package/dist/tests/cases/integration/mocked/sql/getPersonByEmailSql.js.map +1 -1
  282. package/dist/tests/cases/integration/mocked/sql/getPersonByIdSql.js +1 -1
  283. package/dist/tests/cases/integration/mocked/sql/getPersonByIdentity.js +1 -1
  284. package/dist/tests/cases/integration/mocked/sql/getPersonByIdpSql.d.ts.map +1 -1
  285. package/dist/tests/cases/integration/mocked/sql/getPersonByIdpSql.js +2 -1
  286. package/dist/tests/cases/integration/mocked/sql/getPersonByIdpSql.js.map +1 -1
  287. package/dist/tests/cases/unit/authorization/membershipAwareAccessNode.test.js +27 -0
  288. package/dist/tests/cases/unit/authorization/membershipAwareAccessNode.test.js.map +1 -1
  289. package/dist/tests/src/mailer.d.ts +2 -2
  290. package/dist/tests/src/mailer.d.ts.map +1 -1
  291. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  292. package/graphql-tenant.codegen.yml +2 -1
  293. package/package.json +14 -14
  294. package/src/TenantContainer.ts +19 -2
  295. package/src/migrations/2023-01-20-135500-person-email-normalize.ts +28 -0
  296. package/src/migrations/2023-06-03-104000-person-disabled.ts +10 -0
  297. package/src/migrations/runner.ts +4 -0
  298. package/src/migrations/snapshot.ts +1 -0
  299. package/src/model/authorization/AclSchemaAccessNodeFactory.ts +16 -6
  300. package/src/model/authorization/PermissionActions.ts +5 -0
  301. package/src/model/authorization/PermissionsFactory.ts +11 -3
  302. package/src/model/commands/identity/PatchIdentityGlobalRoles.ts +28 -0
  303. package/src/model/commands/identity/index.ts +1 -0
  304. package/src/model/commands/membership/AddProjectMemberCommand.ts +9 -10
  305. package/src/model/commands/membership/RemoveProjectMemberCommand.ts +1 -1
  306. package/src/model/commands/membership/UpdateProjectMemberCommand.ts +2 -2
  307. package/src/model/commands/passwordReset/ResetPasswordCommand.ts +9 -16
  308. package/src/model/commands/person/CreatePersonCommand.ts +9 -4
  309. package/src/model/commands/person/DisablePersonCommand.ts +18 -0
  310. package/src/model/queries/apiKey/ApiKeyQuery.ts +64 -0
  311. package/src/model/queries/apiKey/index.ts +1 -1
  312. package/src/model/queries/idp/types.ts +2 -2
  313. package/src/model/queries/membership/ProjectMembersQuery.ts +3 -3
  314. package/src/model/queries/person/PersonQuery.ts +30 -3
  315. package/src/model/queries/person/PersonQueryBuilderFactory.ts +1 -0
  316. package/src/model/queries/person/types.ts +3 -2
  317. package/src/model/service/IDPSignInManager.ts +11 -6
  318. package/src/model/service/InviteManager.ts +2 -2
  319. package/src/model/service/PasswordChangeManager.ts +4 -4
  320. package/src/model/service/PasswordResetManager.ts +3 -5
  321. package/src/model/service/PersonAccessManager.ts +56 -0
  322. package/src/model/service/PersonManager.ts +14 -0
  323. package/src/model/service/ProjectManager.ts +3 -3
  324. package/src/model/service/ProjectMemberManager.ts +3 -15
  325. package/src/model/service/RolesManager.ts +40 -0
  326. package/src/model/service/SignInManager.ts +25 -7
  327. package/src/model/service/SignUpManager.ts +2 -2
  328. package/src/model/service/apiKey/ApiKeyManager.ts +8 -1
  329. package/src/model/service/idp/IDPManager.ts +8 -8
  330. package/src/model/service/index.ts +2 -0
  331. package/src/model/utils/Response.ts +1 -1
  332. package/src/model/utils/email.ts +5 -0
  333. package/src/resolvers/ResolverFactory.ts +10 -1
  334. package/src/resolvers/errorUtils.ts +1 -1
  335. package/src/resolvers/membershipUtils.ts +21 -21
  336. package/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.ts +2 -2
  337. package/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.ts +1 -1
  338. package/src/resolvers/mutation/identity/GlobalRolesMutationResolver.ts +69 -0
  339. package/src/resolvers/mutation/identity/index.ts +1 -0
  340. package/src/resolvers/mutation/index.ts +1 -0
  341. package/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.ts +6 -6
  342. package/src/resolvers/mutation/person/ChangePasswordMutationResolver.ts +2 -2
  343. package/src/resolvers/mutation/person/DisablePersonMutationResolver.ts +48 -0
  344. package/src/resolvers/mutation/person/InviteMutationResolver.ts +5 -12
  345. package/src/resolvers/mutation/person/OtpMutationResolver.ts +4 -6
  346. package/src/resolvers/mutation/person/ResetPasswordMutationResolver.ts +2 -10
  347. package/src/resolvers/mutation/person/SignInMutationResolver.ts +1 -0
  348. package/src/resolvers/mutation/person/SignOutMutationResolver.ts +13 -3
  349. package/src/resolvers/mutation/project/CreateProjectMutationResolver.ts +2 -7
  350. package/src/resolvers/mutation/project/SetProjectSecretMutationResolver.ts +1 -1
  351. package/src/resolvers/mutation/project/UpdateProjectMutationResolver.ts +2 -7
  352. package/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.ts +2 -2
  353. package/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.ts +1 -1
  354. package/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.ts +2 -2
  355. package/src/resolvers/types/ProjectTypeResolver.ts +2 -2
  356. package/src/schema/index.ts +321 -159
  357. package/src/schema/tenant.graphql.ts +97 -21
  358. package/tests/cases/integration/db/updateRoles.test.ts +74 -0
  359. package/tests/cases/integration/mocked/confirmOtpMutation.test.ts +1 -1
  360. package/tests/cases/integration/mocked/gql/signUp.ts +4 -0
  361. package/tests/cases/integration/mocked/signInMutation.test.ts +37 -3
  362. package/tests/cases/integration/mocked/signOutMutation.test.ts +58 -0
  363. package/tests/cases/integration/mocked/signUpMutation.test.ts +9 -0
  364. package/tests/cases/integration/mocked/sql/getApiKeySql.ts +33 -0
  365. package/tests/cases/integration/mocked/sql/getPersonByEmailSql.ts +2 -1
  366. package/tests/cases/integration/mocked/sql/getPersonByIdSql.ts +1 -1
  367. package/tests/cases/integration/mocked/sql/getPersonByIdentity.ts +1 -1
  368. package/tests/cases/integration/mocked/sql/getPersonByIdpSql.ts +2 -1
  369. package/tests/cases/unit/authorization/membershipAwareAccessNode.test.ts +36 -0
  370. package/dist/src/model/queries/apiKey/ApiKeyByTokenQuery.d.ts +0 -22
  371. package/dist/src/model/queries/apiKey/ApiKeyByTokenQuery.d.ts.map +0 -1
  372. package/dist/src/model/queries/apiKey/ApiKeyByTokenQuery.js +0 -33
  373. package/dist/src/model/queries/apiKey/ApiKeyByTokenQuery.js.map +0 -1
  374. package/src/model/queries/apiKey/ApiKeyByTokenQuery.ts +0 -49
@@ -1,23 +1,23 @@
1
1
  import { MembershipValidationError, MembershipValidationErrorType } from '../model/service/MembershipValidator'
2
2
  import { MembershipValidationError as MembershipValidationErrorSchema, MembershipValidationErrorCode } from '../schema'
3
3
 
4
- export enum MembershipErrorCode {
5
- InvalidMembership = 'INVALID_MEMBERSHIP',
6
- RoleNotFound = 'ROLE_NOT_FOUND',
7
- VariableEmpty = 'VARIABLE_EMPTY',
8
- VariableNotFound = 'VARIABLE_NOT_FOUND',
9
- }
4
+ export type MembershipErrorCode =
5
+ | 'INVALID_MEMBERSHIP'
6
+ | 'ROLE_NOT_FOUND'
7
+ | 'VARIABLE_EMPTY'
8
+ | 'VARIABLE_NOT_FOUND'
9
+
10
10
 
11
- export interface MembershipErrorVariable<Code> {
12
- code: Code
11
+ export interface MembershipErrorVariable {
12
+ code: MembershipErrorCode
13
13
  membershipValidation?: MembershipValidationErrorSchema[]
14
14
  endUserMessage?: string
15
15
  developerMessage: string
16
16
  }
17
17
 
18
- export const createMembershipValidationErrorResult = <Code>(
18
+ export const createMembershipValidationErrorResult = (
19
19
  result: MembershipValidationError[],
20
- ): MembershipErrorVariable<Code>[] => {
20
+ ): MembershipErrorVariable[] => {
21
21
  const formatDeveloperError = (it: MembershipValidationError) => {
22
22
  switch (it.error) {
23
23
  case MembershipValidationErrorType.ROLE_NOT_FOUND:
@@ -31,58 +31,58 @@ export const createMembershipValidationErrorResult = <Code>(
31
31
  }
32
32
  }
33
33
 
34
- const legacyErrors = result.map((it): MembershipErrorVariable<Code> | undefined => {
34
+ const legacyErrors = result.map((it): MembershipErrorVariable | undefined => {
35
35
  switch (it.error) {
36
36
  case MembershipValidationErrorType.ROLE_NOT_FOUND:
37
37
  return {
38
- code: MembershipErrorCode.RoleNotFound as unknown as Code,
38
+ code: 'ROLE_NOT_FOUND',
39
39
  endUserMessage: 'Given role not found',
40
40
  developerMessage: formatDeveloperError(it),
41
41
  }
42
42
  case MembershipValidationErrorType.VARIABLE_EMPTY:
43
43
  return {
44
- code: MembershipErrorCode.VariableEmpty as unknown as Code,
44
+ code: 'VARIABLE_EMPTY',
45
45
  endUserMessage: 'Required variable is empty',
46
46
  developerMessage: formatDeveloperError(it),
47
47
  }
48
48
  case MembershipValidationErrorType.VARIABLE_NOT_FOUND:
49
49
  return {
50
- code: MembershipErrorCode.VariableNotFound as unknown as Code,
50
+ code: 'VARIABLE_NOT_FOUND',
51
51
  endUserMessage: 'Provided variable does not exist',
52
52
  developerMessage: formatDeveloperError(it),
53
53
  }
54
54
  }
55
- }).filter((it): it is MembershipErrorVariable<Code> => it !== undefined)
55
+ }).filter((it): it is MembershipErrorVariable => it !== undefined)
56
56
 
57
57
  return [
58
58
  {
59
- code: MembershipErrorCode.InvalidMembership as unknown as Code,
59
+ code: 'INVALID_MEMBERSHIP',
60
60
  developerMessage:
61
61
  'Provided membership is invalid: ' +
62
62
  result.map(it => formatDeveloperError(it)).join('. ') +
63
63
  '. You can also check membershipValidation field for structured details.',
64
- membershipValidation: result.map(it => {
64
+ membershipValidation: result.map((it): MembershipValidationErrorSchema => {
65
65
  switch (it.error) {
66
66
  case MembershipValidationErrorType.ROLE_NOT_FOUND:
67
67
  return {
68
- code: MembershipValidationErrorCode.RoleNotFound,
68
+ code: 'ROLE_NOT_FOUND',
69
69
  role: it.role,
70
70
  }
71
71
  case MembershipValidationErrorType.VARIABLE_EMPTY:
72
72
  return {
73
- code: MembershipValidationErrorCode.VariableEmpty,
73
+ code: 'VARIABLE_EMPTY',
74
74
  role: it.role,
75
75
  variable: it.variable,
76
76
  }
77
77
  case MembershipValidationErrorType.VARIABLE_NOT_FOUND:
78
78
  return {
79
- code: MembershipValidationErrorCode.VariableNotFound,
79
+ code: 'VARIABLE_NOT_FOUND',
80
80
  role: it.role,
81
81
  variable: it.variable,
82
82
  }
83
83
  case MembershipValidationErrorType.VARIABLE_INVALID:
84
84
  return {
85
- code: MembershipValidationErrorCode.VariableInvalid,
85
+ code: 'VARIABLE_INVALID',
86
86
  role: it.role,
87
87
  variable: it.variable,
88
88
  }
@@ -31,14 +31,14 @@ export class CreateApiKeyMutationResolver implements MutationResolvers {
31
31
  message: 'You are not allowed to create an API key for this project',
32
32
  })
33
33
  if (!project) {
34
- return createProjectNotFoundResponse(CreateApiKeyErrorCode.ProjectNotFound, projectSlug)
34
+ return createProjectNotFoundResponse('PROJECT_NOT_FOUND', projectSlug)
35
35
  }
36
36
  if (typeof tokenHash === 'string' && !isTokenHash(tokenHash)) {
37
37
  throw new UserInputError('Invalid format of tokenHash. Must be hex-encoded sha256.')
38
38
  }
39
39
  const validationResult = await this.membershipValidator.validate(project.slug, memberships)
40
40
  if (validationResult.length > 0) {
41
- const errors = createMembershipValidationErrorResult<CreateApiKeyErrorCode>(validationResult)
41
+ const errors = createMembershipValidationErrorResult(validationResult)
42
42
  return {
43
43
  ok: false,
44
44
  errors: errors,
@@ -26,7 +26,7 @@ export class DisableApiKeyMutationResolver implements MutationResolvers {
26
26
  const result = await this.apiKeyManager.disableApiKey(context.db, id)
27
27
 
28
28
  if (!result) {
29
- return createErrorResponse(DisableApiKeyErrorCode.KeyNotFound, 'API key not found')
29
+ return createErrorResponse('KEY_NOT_FOUND', 'API key not found')
30
30
  }
31
31
 
32
32
  return {
@@ -0,0 +1,69 @@
1
+ import {
2
+ AddGlobalIdentityRolesResponse,
3
+ MutationAddGlobalIdentityRolesArgs,
4
+ MutationRemoveGlobalIdentityRolesArgs,
5
+ MutationResolvers,
6
+ RemoveGlobalIdentityRolesResponse,
7
+ } from '../../../schema'
8
+ import { GraphQLResolveInfo } from 'graphql'
9
+ import { TenantResolverContext } from '../../TenantResolverContext'
10
+ import { PermissionActions } from '../../../model'
11
+ import { createErrorResponse } from '../../errorUtils'
12
+ import { RolesManager } from '../../../model'
13
+
14
+ export class IdentityGlobalRolesMutationResolver implements MutationResolvers {
15
+ constructor(
16
+ private readonly rolesManager: RolesManager,
17
+ ) {
18
+ }
19
+
20
+ async addGlobalIdentityRoles(
21
+ parent: any,
22
+ { roles, identityId }: MutationAddGlobalIdentityRolesArgs,
23
+ context: TenantResolverContext,
24
+ info: GraphQLResolveInfo,
25
+ ): Promise<AddGlobalIdentityRolesResponse> {
26
+ await context.requireAccess({
27
+ action: PermissionActions.IDENTITY_ADD_GLOBAL_ROLES(roles),
28
+ message: 'You are not allowed to add global roles',
29
+ })
30
+
31
+ const result = await this.rolesManager.addGlobalRoles(context.db, identityId, roles)
32
+
33
+ if (!result.ok) {
34
+ return createErrorResponse(result.error, result.errorMessage)
35
+ }
36
+
37
+ return {
38
+ ok: true,
39
+ result: {
40
+ identity: { id: identityId, projects: [] },
41
+ },
42
+ }
43
+ }
44
+
45
+ async removeGlobalIdentityRoles(
46
+ parent: any,
47
+ { roles, identityId }: MutationRemoveGlobalIdentityRolesArgs,
48
+ context: TenantResolverContext,
49
+ info: GraphQLResolveInfo,
50
+ ): Promise<RemoveGlobalIdentityRolesResponse> {
51
+ await context.requireAccess({
52
+ action: PermissionActions.IDENTITY_REMOVE_GLOBAL_ROLES(roles),
53
+ message: 'You are not allowed to remove global roles',
54
+ })
55
+
56
+ const result = await this.rolesManager.removeGlobalRoles(context.db, identityId, roles)
57
+
58
+ if (!result.ok) {
59
+ return createErrorResponse(result.error, result.errorMessage)
60
+ }
61
+
62
+ return {
63
+ ok: true,
64
+ result: {
65
+ identity: { id: identityId, projects: [] },
66
+ },
67
+ }
68
+ }
69
+ }
@@ -0,0 +1 @@
1
+ export * from './GlobalRolesMutationResolver'
@@ -1,4 +1,5 @@
1
1
  export * from './apiKey'
2
+ export * from './identity'
2
3
  export * from './idp'
3
4
  export * from './mailTemplates'
4
5
  export * from './person'
@@ -30,7 +30,7 @@ export class MailTemplateMutationResolver implements MutationResolvers {
30
30
  message: 'You are not allowed to add a mail template',
31
31
  })
32
32
  if (projectSlug && !project) {
33
- return createProjectNotFoundResponse(AddMailTemplateErrorCode.ProjectNotFound, projectSlug)
33
+ return createProjectNotFoundResponse('PROJECT_NOT_FOUND', projectSlug)
34
34
  }
35
35
 
36
36
  await this.mailTemplateManager.addMailTemplate(context.db, {
@@ -60,7 +60,7 @@ export class MailTemplateMutationResolver implements MutationResolvers {
60
60
  message: 'You are not allowed to remove a mail template',
61
61
  })
62
62
  if (projectSlug && !project) {
63
- return createProjectNotFoundResponse(RemoveMailTemplateErrorCode.ProjectNotFound, projectSlug)
63
+ return createProjectNotFoundResponse('PROJECT_NOT_FOUND', projectSlug)
64
64
  }
65
65
 
66
66
  const removed = await this.mailTemplateManager.removeMailTemplate(context.db, {
@@ -69,7 +69,7 @@ export class MailTemplateMutationResolver implements MutationResolvers {
69
69
  type: this.mapMailType(type),
70
70
  })
71
71
  if (!removed) {
72
- return createErrorResponse(RemoveMailTemplateErrorCode.TemplateNotFound, 'Mail template not found')
72
+ return createErrorResponse('PROJECT_NOT_FOUND', 'Mail template not found')
73
73
  }
74
74
 
75
75
  return {
@@ -80,9 +80,9 @@ export class MailTemplateMutationResolver implements MutationResolvers {
80
80
 
81
81
  private mapMailType(type: SchemaMailType): MailType {
82
82
  return {
83
- [SchemaMailType.ExistingUserInvited]: MailType.existingUserInvited,
84
- [SchemaMailType.NewUserInvited]: MailType.newUserInvited,
85
- [SchemaMailType.ResetPasswordRequest]: MailType.passwordReset,
83
+ EXISTING_USER_INVITED: MailType.existingUserInvited,
84
+ NEW_USER_INVITED: MailType.newUserInvited,
85
+ RESET_PASSWORD_REQUEST: MailType.passwordReset,
86
86
  }[type]
87
87
  }
88
88
  }
@@ -25,7 +25,7 @@ export class ChangePasswordMutationResolver implements MutationResolvers {
25
25
  ): Promise<ChangePasswordResponse> {
26
26
  const person = await context.db.queryHandler.fetch(PersonQuery.byId(args.personId))
27
27
  if (!person) {
28
- return createErrorResponse(ChangePasswordErrorCode.PersonNotFound, 'Person not found')
28
+ return createErrorResponse('PERSON_NOT_FOUND', 'Person not found')
29
29
  }
30
30
 
31
31
  await context.requireAccess({
@@ -50,7 +50,7 @@ export class ChangePasswordMutationResolver implements MutationResolvers {
50
50
  ): Promise<ChangeMyPasswordResponse> {
51
51
  const person = await context.db.queryHandler.fetch(PersonQuery.byIdentity(context.identity.id))
52
52
  if (!person) {
53
- return createErrorResponse(ChangeMyPasswordErrorCode.NotAPerson, 'Only a person can change a password')
53
+ return createErrorResponse('NOT_A_PERSON', 'Only a person can change a password')
54
54
  }
55
55
  await context.requireAccess({
56
56
  action: PermissionActions.PERSON_CHANGE_MY_PASSWORD,
@@ -0,0 +1,48 @@
1
+ import {
2
+ DisablePersonResponse,
3
+ MutationDisablePersonArgs,
4
+ MutationResolvers,
5
+ } from '../../../schema'
6
+ import { TenantResolverContext } from '../../TenantResolverContext'
7
+ import { PermissionActions, PersonAccessManager } from '../../../model'
8
+ import { PersonManager } from '../../../model/service/PersonManager'
9
+ import { createErrorResponse } from '../../errorUtils'
10
+
11
+ export class DisablePersonMutationResolver implements MutationResolvers {
12
+
13
+ constructor(
14
+ private readonly personAccessManager: PersonAccessManager,
15
+ private readonly personManager: PersonManager,
16
+ ) {}
17
+
18
+ async disablePerson(
19
+ parent: any, args: MutationDisablePersonArgs, context: TenantResolverContext,
20
+ ): Promise<DisablePersonResponse> {
21
+ const targetPerson = await this.personManager.findPersonById(context.db, args.personId)
22
+
23
+ if (targetPerson === null) {
24
+ return {
25
+ ok: false,
26
+ error: {
27
+ code: 'PERSON_NOT_FOUND',
28
+ developerMessage: `Person <${args.personId}> was not found`,
29
+ },
30
+ }
31
+ }
32
+
33
+ await context.requireAccess({
34
+ action: PermissionActions.PERSON_DISABLE(targetPerson.roles),
35
+ message: 'You are not allowed to disable person account',
36
+ })
37
+
38
+ const result = await this.personAccessManager.disablePerson(context.db, args.personId)
39
+
40
+ if (!result.ok) {
41
+ return createErrorResponse(result.error, result.errorMessage)
42
+ }
43
+
44
+ return {
45
+ ok: true,
46
+ }
47
+ }
48
+ }
@@ -1,11 +1,4 @@
1
- import {
2
- InviteErrorCode,
3
- InviteMethod,
4
- InviteResponse,
5
- MutationInviteArgs,
6
- MutationResolvers,
7
- MutationUnmanagedInviteArgs,
8
- } from '../../../schema'
1
+ import { InviteErrorCode, InviteResponse, MutationInviteArgs, MutationResolvers, MutationUnmanagedInviteArgs } from '../../../schema'
9
2
  import { TenantResolverContext } from '../../TenantResolverContext'
10
3
  import {
11
4
  DatabaseContext,
@@ -40,7 +33,7 @@ export class InviteMutationResolver implements MutationResolvers {
40
33
  message: 'You are not allowed to invite a person',
41
34
  })
42
35
  if (!project) {
43
- return createProjectNotFoundResponse(InviteErrorCode.ProjectNotFound, projectSlug)
36
+ return createProjectNotFoundResponse('PROJECT_NOT_FOUND', projectSlug)
44
37
  }
45
38
  return this.doInvite(context.db, {
46
39
  email,
@@ -48,7 +41,7 @@ export class InviteMutationResolver implements MutationResolvers {
48
41
  memberships,
49
42
  name: name ?? undefined,
50
43
  emailVariant: options?.mailVariant || '',
51
- method: options?.method ?? InviteMethod.CreatePassword,
44
+ method: options?.method ?? 'CREATE_PASSWORD',
52
45
  })
53
46
  }
54
47
 
@@ -64,7 +57,7 @@ export class InviteMutationResolver implements MutationResolvers {
64
57
  message: 'You are not allowed to unmanaged person invite',
65
58
  })
66
59
  if (!project) {
67
- return createProjectNotFoundResponse(InviteErrorCode.ProjectNotFound, projectSlug)
60
+ return createProjectNotFoundResponse('PROJECT_NOT_FOUND', projectSlug)
68
61
  }
69
62
  if (typeof options?.resetTokenHash === 'string' && !isTokenHash(options?.resetTokenHash)) {
70
63
  throw new UserInputError('Invalid format of resetTokenHash. Must be hex-encoded sha256.')
@@ -85,7 +78,7 @@ export class InviteMutationResolver implements MutationResolvers {
85
78
  ): Promise<InviteResponse> {
86
79
  const validationResult = await this.membershipValidator.validate(invite.project.slug, invite.memberships)
87
80
  if (validationResult.length > 0) {
88
- const errors = createMembershipValidationErrorResult<InviteErrorCode>(validationResult)
81
+ const errors = createMembershipValidationErrorResult(validationResult)
89
82
  return {
90
83
  ok: false,
91
84
  errors: errors,
@@ -1,7 +1,5 @@
1
1
  import {
2
- ConfirmOtpErrorCode,
3
2
  ConfirmOtpResponse,
4
- DisableOtpErrorCode,
5
3
  DisableOtpResponse,
6
4
  MutationConfirmOtpArgs,
7
5
  MutationPrepareOtpArgs,
@@ -9,7 +7,7 @@ import {
9
7
  PrepareOtpResponse,
10
8
  } from '../../../schema'
11
9
  import { TenantResolverContext } from '../../TenantResolverContext'
12
- import { DatabaseContext, OtpManager, PermissionActions, PersonQuery, PersonRow } from '../../../model'
10
+ import { OtpManager, PermissionActions, PersonQuery, PersonRow } from '../../../model'
13
11
  import { ImplementationException } from '../../../exceptions'
14
12
  import { createErrorResponse } from '../../errorUtils'
15
13
 
@@ -32,12 +30,12 @@ export class OtpMutationResolver implements MutationResolvers {
32
30
  const person = await this.getPersonFromContext(context)
33
31
  if (!person.otp_uri) {
34
32
  return createErrorResponse(
35
- ConfirmOtpErrorCode.NotPrepared,
33
+ 'NOT_PREPARED',
36
34
  `OTP setup was not initialized. Call prepareOtp first.`,
37
35
  )
38
36
  }
39
37
  if (!this.otpManager.verifyOtp(person, args.otpToken)) {
40
- return createErrorResponse(ConfirmOtpErrorCode.InvalidOtpToken, 'Provided token is not correct.')
38
+ return createErrorResponse('INVALID_OTP_TOKEN', 'Provided token is not correct.')
41
39
  }
42
40
  await this.otpManager.confirmOtp(context.db, person)
43
41
  return {
@@ -49,7 +47,7 @@ export class OtpMutationResolver implements MutationResolvers {
49
47
  async disableOtp(parent: any, args: {}, context: TenantResolverContext): Promise<DisableOtpResponse> {
50
48
  const person = await this.getPersonFromContext(context)
51
49
  if (!person.otp_uri) {
52
- return createErrorResponse(DisableOtpErrorCode.OtpNotActive, 'OTP is not active, you cannot disable it.')
50
+ return createErrorResponse('OTP_NOT_ACTIVE', 'OTP is not active, you cannot disable it.')
53
51
  }
54
52
  await this.otpManager.disableOtp(context.db, person)
55
53
  return {
@@ -37,10 +37,9 @@ export class ResetPasswordMutationResolver implements MutationResolvers {
37
37
  })
38
38
  const person = await context.db.queryHandler.fetch(PersonQuery.byEmail(args.email))
39
39
  if (!person) {
40
- return createErrorResponse(CreatePasswordResetRequestErrorCode.PersonNotFound, 'Person was not found.')
40
+ return createErrorResponse('PERSON_NOT_FOUND', 'Person was not found.')
41
41
  }
42
42
 
43
-
44
43
  const permissionContext = await this.permissionContextFactory.create(context.db, {
45
44
  id: person.identity_id,
46
45
  roles: person.roles,
@@ -67,13 +66,6 @@ export class ResetPasswordMutationResolver implements MutationResolvers {
67
66
  if (result.ok) {
68
67
  return { ok: true, errors: [] }
69
68
  }
70
- const err = result.error
71
- const code = {
72
- [ResetPasswordErrorCode.PASSWORD_TOO_WEAK]: SchemaResetPasswordErrorCode.PasswordTooWeak,
73
- [ResetPasswordCommandErrorCode.TOKEN_EXPIRED]: SchemaResetPasswordErrorCode.TokenExpired,
74
- [ResetPasswordCommandErrorCode.TOKEN_NOT_FOUND]: SchemaResetPasswordErrorCode.TokenNotFound,
75
- [ResetPasswordCommandErrorCode.TOKEN_USED]: SchemaResetPasswordErrorCode.TokenUsed,
76
- }[err]
77
- return createErrorResponse(code, result.errorMessage)
69
+ return createErrorResponse(result.error, result.errorMessage)
78
70
  }
79
71
  }
@@ -34,6 +34,7 @@ export class SignInMutationResolver implements MutationResolvers {
34
34
  if (!response.ok) {
35
35
  return createErrorResponse(response.error, response.errorMessage)
36
36
  }
37
+
37
38
  return {
38
39
  ok: true,
39
40
  errors: [],
@@ -1,6 +1,6 @@
1
- import { MutationResolvers, MutationSignOutArgs, SignOutErrorCode, SignOutResponse } from '../../../schema'
1
+ import { MutationResolvers, MutationSignOutArgs, SignOutResponse } from '../../../schema'
2
2
  import { TenantResolverContext } from '../../TenantResolverContext'
3
- import { ApiKeyManager, DatabaseContext, PermissionActions, PersonQuery } from '../../../model'
3
+ import { ApiKey, ApiKeyManager, PermissionActions, PersonQuery } from '../../../model'
4
4
  import { createErrorResponse } from '../../errorUtils'
5
5
 
6
6
  export class SignOutMutationResolver implements MutationResolvers {
@@ -8,8 +8,17 @@ export class SignOutMutationResolver implements MutationResolvers {
8
8
 
9
9
  async signOut(parent: any, args: MutationSignOutArgs, context: TenantResolverContext): Promise<SignOutResponse> {
10
10
  const person = await context.db.queryHandler.fetch(PersonQuery.byIdentity(context.identity.id))
11
+
11
12
  if (!person) {
12
- return createErrorResponse(SignOutErrorCode.NotAPerson, 'Only a person can sign out')
13
+ return createErrorResponse('NOT_A_PERSON', 'Only a person can sign out')
14
+ }
15
+
16
+ const personApiKeyId = await this.apiKeyManager.findApiKey(context.db, context.apiKeyId)
17
+
18
+ if (personApiKeyId?.type === ApiKey.Type.PERMANENT) {
19
+ return createErrorResponse(
20
+ 'NOT_POSSIBLE_SIGN_OUT_WITH_PERMANENT_API_KEY', 'Only session API keys can be used for person sign out.',
21
+ )
13
22
  }
14
23
 
15
24
  await context.requireAccess({
@@ -22,6 +31,7 @@ export class SignOutMutationResolver implements MutationResolvers {
22
31
  } else {
23
32
  await this.apiKeyManager.disableApiKey(context.db, context.apiKeyId)
24
33
  }
34
+
25
35
  return { ok: true, errors: [] }
26
36
  }
27
37
  }
@@ -1,9 +1,4 @@
1
- import {
2
- CreateProjectResponse,
3
- CreateProjectResponseErrorCode,
4
- MutationCreateProjectArgs,
5
- MutationResolvers,
6
- } from '../../../schema'
1
+ import { CreateProjectResponse, MutationCreateProjectArgs, MutationResolvers } from '../../../schema'
7
2
  import { TenantResolverContext } from '../../TenantResolverContext'
8
3
  import { isTokenHash, PermissionActions, ProjectManager, TenantRole } from '../../../model'
9
4
  import { createErrorResponse } from '../../errorUtils'
@@ -20,7 +15,7 @@ export class CreateProjectMutationResolver implements MutationResolvers {
20
15
  const project = await this.projectManager.getProjectBySlug(context.db, projectSlug)
21
16
 
22
17
  if (project) {
23
- return createErrorResponse(CreateProjectResponseErrorCode.AlreadyExists, `Project ${projectSlug} already exists`)
18
+ return createErrorResponse('ALREADY_EXISTS', `Project ${projectSlug} already exists`)
24
19
  }
25
20
 
26
21
  await context.requireAccess({
@@ -24,7 +24,7 @@ export class SetProjectSecretMutationResolver implements MutationResolvers {
24
24
  message: 'You are not allowed to set project secrets',
25
25
  })
26
26
  if (!project) {
27
- return createProjectNotFoundResponse(AddProjectMemberErrorCode.ProjectNotFound, args.projectSlug)
27
+ return createProjectNotFoundResponse('PROJECT_NOT_FOUND', args.projectSlug)
28
28
  }
29
29
  await this.secretManager.setSecret(context.db, project.id, args.key, args.value)
30
30
  return { ok: true }
@@ -1,9 +1,4 @@
1
- import {
2
- AddProjectMemberErrorCode,
3
- MutationResolvers,
4
- MutationUpdateProjectArgs,
5
- UpdateProjectResponse,
6
- } from '../../../schema'
1
+ import { MutationResolvers, MutationUpdateProjectArgs, UpdateProjectResponse } from '../../../schema'
7
2
  import { TenantResolverContext } from '../../TenantResolverContext'
8
3
  import { PermissionActions, ProjectManager } from '../../../model'
9
4
  import { createProjectNotFoundResponse } from '../../errorUtils'
@@ -24,7 +19,7 @@ export class UpdateProjectMutationResolver implements MutationResolvers {
24
19
  message: 'You are not allowed to update a project',
25
20
  })
26
21
  if (!project) {
27
- return createProjectNotFoundResponse(AddProjectMemberErrorCode.ProjectNotFound, args.projectSlug)
22
+ return createProjectNotFoundResponse('PROJECT_NOT_FOUND', args.projectSlug)
28
23
  }
29
24
  await this.projectManager.updateProject(context.db, project.id, {
30
25
  name: args.name || undefined,
@@ -28,11 +28,11 @@ export class AddProjectMemberMutationResolver implements MutationResolvers {
28
28
  message: 'You are not allowed to add a project member',
29
29
  })
30
30
  if (!project) {
31
- return createProjectNotFoundResponse(AddProjectMemberErrorCode.ProjectNotFound, projectSlug)
31
+ return createProjectNotFoundResponse('PROJECT_NOT_FOUND', projectSlug)
32
32
  }
33
33
  const validationResult = await this.membershipValidator.validate(project.slug, memberships)
34
34
  if (validationResult.length > 0) {
35
- const errors = createMembershipValidationErrorResult<AddProjectMemberErrorCode>(validationResult)
35
+ const errors = createMembershipValidationErrorResult(validationResult)
36
36
  return {
37
37
  ok: false,
38
38
  errors: errors,
@@ -27,7 +27,7 @@ export class RemoveProjectMemberMutationResolver implements MutationResolvers {
27
27
  message: 'You are not allowed to remove a project member',
28
28
  })
29
29
  if (!project) {
30
- return createProjectNotFoundResponse(RemoveProjectMemberErrorCode.ProjectNotFound, projectSlug)
30
+ return createProjectNotFoundResponse('PROJECT_NOT_FOUND', projectSlug)
31
31
  }
32
32
  const memberships = await this.projectMemberManager.getStoredProjectsMemberships(
33
33
  context.db,
@@ -37,7 +37,7 @@ export class UpdateProjectMemberMutationResolver implements MutationResolvers {
37
37
  message: 'You are not allowed to update project member variables',
38
38
  })
39
39
  if (!project) {
40
- return createProjectNotFoundResponse(UpdateProjectMemberErrorCode.ProjectNotFound, projectSlug)
40
+ return createProjectNotFoundResponse('PROJECT_NOT_FOUND', projectSlug)
41
41
  }
42
42
  const visibleMemberships = await this.projectMemberManager.getStoredProjectsMemberships(
43
43
  context.db,
@@ -65,7 +65,7 @@ export class UpdateProjectMemberMutationResolver implements MutationResolvers {
65
65
  it => it.error !== MembershipValidationErrorType.VARIABLE_EMPTY,
66
66
  )
67
67
  if (validationResult.length > 0) {
68
- const errors = createMembershipValidationErrorResult<UpdateProjectMemberErrorCode>(validationResult)
68
+ const errors = createMembershipValidationErrorResult(validationResult)
69
69
  return {
70
70
  ok: false,
71
71
  errors: errors,
@@ -1,4 +1,4 @@
1
- import { MemberType, ProjectIdentityRelation, ProjectMembersArgs, ProjectResolvers } from '../../schema'
1
+ import { ProjectIdentityRelation, ProjectMembersArgs, ProjectResolvers } from '../../schema'
2
2
  import { TenantResolverContext } from '../TenantResolverContext'
3
3
  import { PermissionActions, Project, ProjectMemberManager, ProjectSchemaResolver } from '../../model'
4
4
  import { getRoleVariables } from '@contember/schema-utils'
@@ -21,7 +21,7 @@ export class ProjectTypeResolver implements ProjectResolvers {
21
21
  if (!(await verifier(PermissionActions.PROJECT_VIEW_MEMBER([])))) {
22
22
  return []
23
23
  }
24
- if (args.input?.filter?.email && args.input.filter.memberType === MemberType.ApiKey) {
24
+ if (args.input?.filter?.email && args.input.filter.memberType === 'API_KEY') {
25
25
  throw new UserInputError(`Cannot use email filter for ApiKey member type.`)
26
26
  }
27
27
  if (args.memberType && args.input) {