@drax/identity-back 0.0.9 → 0.0.11

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 (188) hide show
  1. package/dist/errors/BadCredentialsError.js +10 -0
  2. package/dist/errors/UnauthorizedError.js +10 -0
  3. package/dist/factory/RoleServiceFactory.js +16 -3
  4. package/dist/factory/UserServiceFactory.js +17 -3
  5. package/dist/graphql/resolvers/role.resolvers.js +98 -11
  6. package/dist/graphql/resolvers/user.resolvers.js +134 -15
  7. package/dist/graphql/types/role.graphql +6 -4
  8. package/dist/graphql/types/user.graphql +36 -9
  9. package/dist/i18n/messages/validation-i18n.js +21 -0
  10. package/dist/index.js +22 -7
  11. package/dist/interfaces/IID.js +1 -0
  12. package/dist/interfaces/IJwtUser.js +1 -0
  13. package/dist/middleware/jwtMiddleware.js +19 -0
  14. package/dist/middleware/rbacMiddleware.js +36 -0
  15. package/dist/models/RoleModel.js +0 -8
  16. package/dist/models/UserModel.js +1 -2
  17. package/dist/permissions/IdentityPermissions.js +16 -0
  18. package/dist/rbac/Rbac.js +20 -0
  19. package/dist/repository/mongo/RoleMongoRepository.js +41 -0
  20. package/dist/repository/mongo/UserMongoRepository.js +82 -0
  21. package/dist/repository/sqlite/RoleSqliteRepository.js +115 -0
  22. package/dist/repository/sqlite/UserSqliteRepository.js +157 -0
  23. package/dist/routes/RoleRoutes.js +145 -0
  24. package/dist/routes/UserRoutes.js +199 -0
  25. package/dist/routes/authRoutes.js +12 -4
  26. package/dist/services/AuthService.js +0 -15
  27. package/dist/services/PermissionService.js +19 -0
  28. package/dist/services/RoleService.js +48 -16
  29. package/dist/services/UserService.js +82 -23
  30. package/dist/utils/AuthUtils.js +20 -6
  31. package/dist/utils/DbSetupUtils.js +28 -0
  32. package/dist/zod/RoleZod.js +8 -0
  33. package/dist/zod/UserZod.js +18 -0
  34. package/package.json +17 -10
  35. package/src/errors/BadCredentialsError.ts +13 -0
  36. package/src/errors/UnauthorizedError.ts +13 -0
  37. package/src/factory/RoleServiceFactory.ts +20 -3
  38. package/src/factory/UserServiceFactory.ts +20 -3
  39. package/src/graphql/resolvers/role.resolvers.ts +92 -11
  40. package/src/graphql/resolvers/user.resolvers.ts +128 -15
  41. package/src/graphql/types/role.graphql +6 -4
  42. package/src/graphql/types/user.graphql +36 -9
  43. package/src/index.ts +50 -10
  44. package/src/interfaces/IID.ts +5 -0
  45. package/src/interfaces/IJwtUser.ts +7 -0
  46. package/src/interfaces/IRole.ts +15 -5
  47. package/src/interfaces/IRoleRepository.ts +8 -5
  48. package/src/interfaces/IUser.ts +30 -6
  49. package/src/interfaces/IUserGroup.ts +2 -1
  50. package/src/interfaces/IUserRepository.ts +11 -6
  51. package/src/middleware/jwtMiddleware.ts +22 -0
  52. package/src/middleware/rbacMiddleware.ts +40 -0
  53. package/src/models/RoleModel.ts +0 -9
  54. package/src/models/UserModel.ts +1 -2
  55. package/src/permissions/IdentityPermissions.ts +20 -0
  56. package/src/rbac/Rbac.ts +31 -0
  57. package/src/repository/mongo/RoleMongoRepository.ts +57 -0
  58. package/src/repository/mongo/UserMongoRepository.ts +104 -0
  59. package/src/repository/sqlite/RoleSqliteRepository.ts +151 -0
  60. package/src/repository/sqlite/UserSqliteRepository.ts +194 -0
  61. package/src/routes/RoleRoutes.ts +141 -0
  62. package/src/routes/UserRoutes.ts +198 -0
  63. package/src/services/PermissionService.ts +26 -0
  64. package/src/services/RoleService.ts +46 -21
  65. package/src/services/UserService.ts +86 -28
  66. package/src/utils/AuthUtils.ts +22 -7
  67. package/src/utils/DbSetupUtils.ts +39 -0
  68. package/src/zod/RoleZod.ts +14 -0
  69. package/src/zod/UserZod.ts +26 -0
  70. package/test/data-json/roles/admin-role.json +1 -1
  71. package/test/data-obj/roles/{admin-role.ts → admin-mongo-role.ts} +2 -1
  72. package/test/data-obj/roles/admin-sqlite-role.ts +9 -0
  73. package/test/data-obj/roles/operator-sqlite-role.ts +9 -0
  74. package/test/data-obj/users/root-mongo-user.ts +15 -0
  75. package/test/data-obj/users/root-sqlite-user.ts +16 -0
  76. package/test/{initializers → db}/MongoInMemory.ts +2 -1
  77. package/test/initializers/RoleMongoInitializer.ts +15 -0
  78. package/test/initializers/RoleSqliteInitializer.ts +18 -0
  79. package/test/repository/{role-repository.test.ts → mongo/role-mongo-repository.test.ts} +14 -24
  80. package/test/repository/mongo/user-mongo-repository.test.ts +121 -0
  81. package/test/repository/sqlite/role-sqlite-repository.test.ts +70 -0
  82. package/test/repository/sqlite/user-sqlite-repository.test.ts +126 -0
  83. package/test/service/mock-service.test.ts +3 -3
  84. package/test/service/role-service.test.ts +5 -5
  85. package/test/service/user-service.test.ts +42 -15
  86. package/test.db +0 -0
  87. package/tsconfig.json +16 -3
  88. package/tsconfig.tsbuildinfo +1 -1
  89. package/types/errors/BadCredentialsError.d.ts +6 -0
  90. package/types/errors/BadCredentialsError.d.ts.map +1 -0
  91. package/types/errors/UnauthorizedError.d.ts +6 -0
  92. package/types/errors/UnauthorizedError.d.ts.map +1 -0
  93. package/types/factory/RoleServiceFactory.d.ts +2 -2
  94. package/types/factory/RoleServiceFactory.d.ts.map +1 -1
  95. package/types/factory/UserServiceFactory.d.ts +2 -2
  96. package/types/factory/UserServiceFactory.d.ts.map +1 -1
  97. package/types/graphql/resolvers/role.resolvers.d.ts +24 -7
  98. package/types/graphql/resolvers/role.resolvers.d.ts.map +1 -1
  99. package/types/graphql/resolvers/user.resolvers.d.ts +38 -7
  100. package/types/graphql/resolvers/user.resolvers.d.ts.map +1 -1
  101. package/types/i18n/messages/validation-i18n.d.ts +4 -0
  102. package/types/i18n/messages/validation-i18n.d.ts.map +1 -0
  103. package/types/index.d.ts +21 -5
  104. package/types/index.d.ts.map +1 -1
  105. package/types/interfaces/IID.d.ts +6 -0
  106. package/types/interfaces/IID.d.ts.map +1 -0
  107. package/types/interfaces/IJwtUser.d.ts +7 -0
  108. package/types/interfaces/IJwtUser.d.ts.map +1 -0
  109. package/types/interfaces/IRole.d.ts +13 -6
  110. package/types/interfaces/IRole.d.ts.map +1 -1
  111. package/types/interfaces/IRoleRepository.d.ts +8 -4
  112. package/types/interfaces/IRoleRepository.d.ts.map +1 -1
  113. package/types/interfaces/IUser.d.ts +29 -8
  114. package/types/interfaces/IUser.d.ts.map +1 -1
  115. package/types/interfaces/IUserGroup.d.ts +3 -2
  116. package/types/interfaces/IUserGroup.d.ts.map +1 -1
  117. package/types/interfaces/IUserRepository.d.ts +10 -6
  118. package/types/interfaces/IUserRepository.d.ts.map +1 -1
  119. package/types/middleware/jwtMiddleware.d.ts +4 -0
  120. package/types/middleware/jwtMiddleware.d.ts.map +1 -0
  121. package/types/middleware/rbacMiddleware.d.ts +4 -0
  122. package/types/middleware/rbacMiddleware.d.ts.map +1 -0
  123. package/types/models/RoleModel.d.ts +8 -8
  124. package/types/models/RoleModel.d.ts.map +1 -1
  125. package/types/models/UserGroupModel.d.ts +8 -8
  126. package/types/models/UserGroupModel.d.ts.map +1 -1
  127. package/types/models/UserModel.d.ts +8 -8
  128. package/types/models/UserModel.d.ts.map +1 -1
  129. package/types/permissions/IdentityPermissions.d.ts +16 -0
  130. package/types/permissions/IdentityPermissions.d.ts.map +1 -0
  131. package/types/rbac/Rbac.d.ts +12 -0
  132. package/types/rbac/Rbac.d.ts.map +1 -0
  133. package/types/repository/mongo/RoleMongoRepository.d.ts +14 -0
  134. package/types/repository/mongo/RoleMongoRepository.d.ts.map +1 -0
  135. package/types/repository/mongo/UserMongoRepository.d.ts +18 -0
  136. package/types/repository/mongo/UserMongoRepository.d.ts.map +1 -0
  137. package/types/repository/sqlite/RoleSqliteRepository.d.ts +19 -0
  138. package/types/repository/sqlite/RoleSqliteRepository.d.ts.map +1 -0
  139. package/types/repository/sqlite/UserSqliteRepository.d.ts +24 -0
  140. package/types/repository/sqlite/UserSqliteRepository.d.ts.map +1 -0
  141. package/types/routes/RoleRoutes.d.ts +4 -0
  142. package/types/routes/RoleRoutes.d.ts.map +1 -0
  143. package/types/routes/UserRoutes.d.ts +4 -0
  144. package/types/routes/UserRoutes.d.ts.map +1 -0
  145. package/types/routes/authRoutes.d.ts.map +1 -1
  146. package/types/services/AuthService.d.ts +0 -3
  147. package/types/services/AuthService.d.ts.map +1 -1
  148. package/types/services/PermissionService.d.ts +9 -0
  149. package/types/services/PermissionService.d.ts.map +1 -0
  150. package/types/services/RoleService.d.ts +6 -8
  151. package/types/services/RoleService.d.ts.map +1 -1
  152. package/types/services/UserService.d.ts +13 -11
  153. package/types/services/UserService.d.ts.map +1 -1
  154. package/types/utils/AuthUtils.d.ts +5 -2
  155. package/types/utils/AuthUtils.d.ts.map +1 -1
  156. package/types/utils/DbSetupUtils.d.ts +10 -0
  157. package/types/utils/DbSetupUtils.d.ts.map +1 -0
  158. package/types/zod/RoleZod.d.ts +10 -0
  159. package/types/zod/RoleZod.d.ts.map +1 -0
  160. package/types/zod/UserZod.d.ts +53 -0
  161. package/types/zod/UserZod.d.ts.map +1 -0
  162. package/dist/factory/AuthServiceFactory.js +0 -8
  163. package/dist/graphql/resolvers/auth.resolvers.js +0 -16
  164. package/dist/graphql/types/auth.graphql +0 -12
  165. package/dist/repository/RoleRepository.js +0 -29
  166. package/dist/repository/UserRepository.js +0 -33
  167. package/src/factory/AuthServiceFactory.ts +0 -10
  168. package/src/graphql/resolvers/auth.resolvers.ts +0 -20
  169. package/src/graphql/types/auth.graphql +0 -12
  170. package/src/repository/RoleRepository.ts +0 -42
  171. package/src/repository/UserRepository.ts +0 -47
  172. package/src/routes/authRoutes.ts +0 -22
  173. package/src/services/AuthService.ts +0 -29
  174. package/test/data-obj/users/root-user.ts +0 -15
  175. package/test/initializers/MongoInMemory.mjs +0 -34
  176. package/test/initializers/RoleInitializer.mjs +0 -11
  177. package/test/initializers/RoleInitializer.ts +0 -15
  178. package/test/repository/user-repository.test.ts +0 -54
  179. package/types/factory/AuthServiceFactory.d.ts +0 -4
  180. package/types/factory/AuthServiceFactory.d.ts.map +0 -1
  181. package/types/graphql/resolvers/auth.resolvers.d.ts +0 -12
  182. package/types/graphql/resolvers/auth.resolvers.d.ts.map +0 -1
  183. package/types/repository/RoleRepository.d.ts +0 -41
  184. package/types/repository/RoleRepository.d.ts.map +0 -1
  185. package/types/repository/UserRepository.d.ts +0 -40
  186. package/types/repository/UserRepository.d.ts.map +0 -1
  187. package/types/routes/AuthRoutes.d.ts +0 -3
  188. package/types/routes/AuthRoutes.d.ts.map +0 -1
@@ -0,0 +1,13 @@
1
+ class UnauthorizedError extends Error {
2
+ constructor() {
3
+ super('UNAUTHORIZED');
4
+ this.name = 'UnauthorizedError';
5
+ }
6
+
7
+ get statusCode(){
8
+ return 401
9
+ }
10
+
11
+ }
12
+
13
+ export default UnauthorizedError
@@ -1,10 +1,27 @@
1
1
  import RoleService from "../services/RoleService.js";
2
- import RoleRepository from "../repository/RoleRepository.js";
2
+ import RoleMongoRepository from "../repository/mongo/RoleMongoRepository.js";
3
+ import RoleSqliteRepository from "../repository/sqlite/RoleSqliteRepository.js";
4
+ import {DbSetupUtils, DbEngine} from "../utils/DbSetupUtils.js";
5
+ import type {IRoleRepository} from "../interfaces/IRoleRepository";
3
6
 
4
7
  const RoleServiceFactory = () : RoleService => {
5
- const roleRepository = new RoleRepository
8
+
9
+ let roleRepository: IRoleRepository
10
+
11
+ switch (DbSetupUtils.getDbEngine()) {
12
+ case DbEngine.Mongo:
13
+ console.log("RoleServiceFactory DB ENGINE MONGODB")
14
+ roleRepository = new RoleMongoRepository()
15
+ break;
16
+ case DbEngine.Sqlite:
17
+ console.log("RoleServiceFactory DB ENGINE SQLITE")
18
+ roleRepository = new RoleSqliteRepository(process.env.SQLITE_DATABASE, false)
19
+ roleRepository.table()
20
+ break;
21
+ }
22
+
6
23
  const roleService = new RoleService(roleRepository)
7
24
  return roleService
8
25
  }
9
26
 
10
- export default RoleServiceFactory
27
+ export default RoleServiceFactory()
@@ -1,10 +1,27 @@
1
- import UserRepository from "../repository/UserRepository.js";
1
+ import UserMongoRepository from "../repository/mongo/UserMongoRepository.js";
2
2
  import UserService from "../services/UserService.js";
3
+ import UserSqliteRepository from "../repository/sqlite/UserSqliteRepository.js";
4
+ import process from "node:process";
5
+ import {DbEngine, DbSetupUtils} from "../utils/DbSetupUtils.js";
6
+ import {IUserRepository} from "../interfaces/IUserRepository";
3
7
 
4
8
  const UserServiceFactory = () : UserService => {
5
- const userRepository = new UserRepository
9
+
10
+ let userRepository: IUserRepository
11
+ switch (DbSetupUtils.getDbEngine()) {
12
+ case DbEngine.Mongo:
13
+ console.log("UserServiceFactory DB ENGINE MONGODB")
14
+ userRepository = new UserMongoRepository()
15
+ break;
16
+ case DbEngine.Sqlite:
17
+ console.log("UserServiceFactory DB ENGINE SQLITE")
18
+ userRepository = new UserSqliteRepository(process.env.SQLITE_DATABASE,false)
19
+ userRepository.table()
20
+ break;
21
+ }
22
+
6
23
  const userService = new UserService(userRepository)
7
24
  return userService
8
25
  }
9
26
 
10
- export default UserServiceFactory
27
+ export default UserServiceFactory()
@@ -1,25 +1,106 @@
1
1
  import RoleServiceFactory from "../../factory/RoleServiceFactory.js";
2
+ import {IdentityPermissions} from "../../permissions/IdentityPermissions.js";
3
+ import {ValidationError, ValidationErrorToGraphQLError} from "@drax/common-back";
4
+ import {GraphQLError} from "graphql";
5
+ import {PermissionService} from "../../services/PermissionService.js";
6
+ import UnauthorizedError from "../../errors/UnauthorizedError.js";
2
7
 
3
- const roleService = RoleServiceFactory()
8
+ const roleService = RoleServiceFactory
4
9
  export default {
5
10
  Query: {
6
- findRoleById: async (_,{id}) => {
7
- return await roleService.findById(id)
11
+ findRoleById: async (_, {id}, {rbac}) => {
12
+ try {
13
+ rbac.assertPermission(IdentityPermissions.ViewRole)
14
+ return await roleService.findById(id)
15
+ } catch (e) {
16
+ if (e instanceof UnauthorizedError) {
17
+ throw new GraphQLError(e.message)
18
+ }
19
+ throw new GraphQLError('error.server')
20
+ }
8
21
  },
9
- paginateRole: async () => {
10
- return await roleService.paginate()
22
+ fetchRole: async (_, {}, {rbac}) => {
23
+ try {
24
+ rbac.assertPermission(IdentityPermissions.ViewRole)
25
+ return await roleService.fetchAll()
26
+ } catch (e) {
27
+ if (e instanceof UnauthorizedError) {
28
+ throw new GraphQLError(e.message)
29
+ }
30
+ throw new GraphQLError('error.server')
31
+ }
32
+ },
33
+ fetchPermissions: async (_, {}, {rbac}) => {
34
+ try {
35
+ rbac.assertPermission(IdentityPermissions.PermissionsRole)
36
+ return PermissionService.getPermissions()
37
+ } catch (e) {
38
+ if (e instanceof UnauthorizedError) {
39
+ throw new GraphQLError(e.message)
40
+ }
41
+ throw new GraphQLError('error.server')
42
+ }
43
+ },
44
+ paginateRole: async (_, {page, limit, seach}, {rbac}) => {
45
+ try {
46
+ rbac.assertPermission(IdentityPermissions.ViewRole)
47
+ return await roleService.paginate(page, limit, seach)
48
+ } catch (e) {
49
+ console.error("paginateRole",e)
50
+ if (e instanceof UnauthorizedError) {
51
+ throw new GraphQLError(e.message)
52
+ }
53
+ throw new GraphQLError('error.server')
54
+ }
11
55
  }
12
56
  },
13
57
  Mutation: {
14
- createRole: async (_,{input}) => {
15
- return await roleService.create(input)
58
+ createRole: async (_, {input}, {rbac}) => {
59
+ try {
60
+ rbac.assertPermission(IdentityPermissions.CreateRole)
61
+ return await roleService.create(input)
62
+ } catch (e) {
63
+ console.error("createRole",e)
64
+ if (e instanceof ValidationError) {
65
+ throw ValidationErrorToGraphQLError(e)
66
+ }
67
+ if (e instanceof UnauthorizedError) {
68
+ throw new GraphQLError(e.message)
69
+ }
70
+ throw new GraphQLError('error.server')
71
+ }
16
72
 
17
73
  },
18
- updateRole: async (_,{id, input}) => {
19
- return await roleService.update(id, input)
74
+ updateRole: async (_, {id, input}, {rbac}) => {
75
+ try {
76
+ rbac.assertPermission(IdentityPermissions.UpdateRole)
77
+ return await roleService.update(id, input)
78
+ } catch (e) {
79
+ console.error("updateRole",e)
80
+ if (e instanceof ValidationError) {
81
+ throw ValidationErrorToGraphQLError(e)
82
+ }
83
+ if (e instanceof UnauthorizedError) {
84
+ throw new GraphQLError(e.message)
85
+ }
86
+ throw new GraphQLError('error.server')
87
+ }
20
88
  },
21
- deleteRole: async (_,{id}) => {
22
- return await roleService.delete(id)
89
+ deleteRole: async (_, {id}, {rbac}) => {
90
+ try {
91
+ rbac.assertPermission(IdentityPermissions.DeleteRole)
92
+ return await roleService.delete(id)
93
+ } catch (e) {
94
+ console.error("deleteRole",e)
95
+ if (e instanceof ValidationError) {
96
+ throw ValidationErrorToGraphQLError(e)
97
+ }
98
+ if (e instanceof UnauthorizedError) {
99
+ throw new GraphQLError(e.message)
100
+ }
101
+ throw new GraphQLError('error.server')
102
+ }
103
+
23
104
  }
24
105
  }
25
106
  }
@@ -1,27 +1,140 @@
1
1
  import UserServiceFactory from "../../factory/UserServiceFactory.js";
2
+ import {GraphQLError} from "graphql";
3
+ import {ValidationErrorToGraphQLError, ValidationError} from "@drax/common-back";
4
+ import {IdentityPermissions} from "../../permissions/IdentityPermissions.js";
5
+ import UnauthorizedError from "../../errors/UnauthorizedError.js";
6
+ import BadCredentialsError from "../../errors/BadCredentialsError.js";
7
+
8
+ const userService = UserServiceFactory
2
9
 
3
- const userService = UserServiceFactory()
4
10
  export default {
5
11
  Query: {
6
- findUserById: async (_,{id}) => {
7
- return await userService.findById(id)
12
+ me: async (_, {}, {authUser}) => {
13
+ try {
14
+ if (authUser) {
15
+ let user = await userService.findById(authUser.id)
16
+ delete user.password
17
+ return user
18
+ }
19
+ throw new UnauthorizedError()
20
+ } catch (e) {
21
+ console.log(e)
22
+ throw new GraphQLError(e.message)
23
+ }
24
+
25
+ },
26
+ findUserById: async (_, {id}, {rbac}) => {
27
+ try {
28
+ rbac.assertPermission(IdentityPermissions.ViewUser)
29
+ return await userService.findById(id)
30
+ } catch (e) {
31
+ if (e instanceof UnauthorizedError) {
32
+ throw new GraphQLError(e.message)
33
+ }
34
+ throw new GraphQLError('error.server')
35
+ }
36
+
8
37
  },
9
- paginateUser: async () => {
10
- console.log("paginateUser")
11
- return await userService.paginate()
38
+ paginateUser: async (_, {page, limit, search}, {rbac}) => {
39
+ try {
40
+ rbac.assertPermission(IdentityPermissions.ViewUser)
41
+ return await userService.paginate(page, limit, search)
42
+ } catch (e) {
43
+ if (e instanceof UnauthorizedError) {
44
+ throw new GraphQLError(e.message)
45
+ }
46
+ throw new GraphQLError('error.server')
47
+ }
12
48
  }
13
49
  },
14
50
  Mutation: {
15
- createUser: async (_,{input}) => {
16
- console.log("createUser")
17
- const user = await userService.create(input)
18
- return user
51
+ auth: async (_, {input}) => {
52
+ try {
53
+ return await userService.auth(input.username, input.password)
54
+ } catch (e) {
55
+ console.error("auth", e)
56
+ if (e instanceof BadCredentialsError) {
57
+ throw new GraphQLError(e.message)
58
+ }
59
+ throw new GraphQLError('error.server')
60
+ }
61
+
19
62
  },
20
- updateUser: async (_,{id, input}) => {
21
- return await userService.update(id, input)
63
+ createUser: async (_, {input}, {rbac}) => {
64
+ try {
65
+ rbac.assertPermission(IdentityPermissions.CreateUser)
66
+ const user = await userService.create(input)
67
+ return user
68
+ } catch (e) {
69
+ console.error("createUser", e)
70
+ if (e instanceof ValidationError) {
71
+ throw ValidationErrorToGraphQLError(e)
72
+ } else if (e instanceof UnauthorizedError) {
73
+ throw new GraphQLError(e.message)
74
+ }
75
+ throw new GraphQLError('error.server')
76
+ }
77
+
22
78
  },
23
- deleteUser: async (_,{id}) => {
24
- return await userService.delete(id)
25
- }
79
+ updateUser: async (_, {id, input}, {rbac}) => {
80
+ try {
81
+ rbac.assertPermission(IdentityPermissions.UpdateUser)
82
+
83
+ const user = await userService.update(id, input)
84
+ return user
85
+ } catch (e) {
86
+ if (e instanceof ValidationError) {
87
+ throw ValidationErrorToGraphQLError(e)
88
+ } else if (e instanceof UnauthorizedError) {
89
+ throw new GraphQLError(e.message)
90
+ }
91
+ throw new GraphQLError('error.server')
92
+ }
93
+ },
94
+ deleteUser: async (_, {id}, {rbac}) => {
95
+ try {
96
+ rbac.assertPermission(IdentityPermissions.DeleteUser)
97
+ return await userService.delete(id)
98
+ } catch (e) {
99
+ console.error("deleteUser", e)
100
+ if (e instanceof ValidationError) {
101
+ throw ValidationErrorToGraphQLError(e)
102
+ } else if (e instanceof UnauthorizedError) {
103
+ throw new GraphQLError(e.message)
104
+ }
105
+ throw new GraphQLError('error.server')
106
+ }
107
+ },
108
+ changeOwnPassword: async (_, {currentPassword, newPassword}, {authUser}) => {
109
+ try {
110
+ if (!authUser) {
111
+ throw new UnauthorizedError()
112
+ }
113
+ let userId = authUser.id
114
+ return await userService.changeOwnPassword(userId, currentPassword, newPassword)
115
+ } catch (e) {
116
+ if (e instanceof ValidationError) {
117
+ throw ValidationErrorToGraphQLError(e)
118
+ } else if (e instanceof UnauthorizedError) {
119
+ throw new GraphQLError(e.message)
120
+ }
121
+ throw new GraphQLError('error.server')
122
+ }
123
+ },
124
+ changeUserPassword: async (_, {userId, newPassword}, {rbac}) => {
125
+ try {
126
+ rbac.assertPermission(IdentityPermissions.UpdateUser)
127
+
128
+ return await userService.changeUserPassword(userId, newPassword)
129
+ } catch (e) {
130
+ if (e instanceof ValidationError) {
131
+ throw ValidationErrorToGraphQLError(e)
132
+ } else if (e instanceof UnauthorizedError) {
133
+ throw new GraphQLError(e.message)
134
+ }
135
+ throw new GraphQLError('error.server')
136
+ }
137
+ },
138
+
26
139
  }
27
140
  }
@@ -1,5 +1,5 @@
1
1
  type Role {
2
- _id: ID!
2
+ id: ID!
3
3
  name: String
4
4
  readonly: Boolean
5
5
  childRoles: [Role]
@@ -7,14 +7,16 @@ type Role {
7
7
  }
8
8
 
9
9
  type RolePaginated{
10
- totalDocs: Int
10
+ total: Int
11
11
  page: Int
12
12
  limit: Int
13
- docs: [Role]
13
+ items: [Role]
14
14
  }
15
15
 
16
16
  type Query{
17
- paginateRole: RolePaginated
17
+ paginateRole(page:Int, limit:Int, search:String): RolePaginated
18
+ fetchRole: [Role]
19
+ fetchPermissions: [String]
18
20
  findRoleById(id: ID): Role
19
21
  }
20
22
 
@@ -1,34 +1,61 @@
1
1
  type User {
2
- _id: ID!
2
+ id: ID!
3
3
  username: String!
4
+ name: String
4
5
  email: String
5
6
  role: Role
6
7
  phone: String
7
-
8
+ avatar: String
9
+ active: Boolean
8
10
  }
9
11
 
10
12
  type UserPaginated{
11
- totalDocs: Int
13
+ total: Int
12
14
  page: Int
13
15
  limit: Int
14
- docs: [User]
16
+ items: [User]
15
17
  }
16
18
 
17
19
  type Query{
20
+ me: User
18
21
  findUserByUsername(username: String!): User
19
22
  findUserById(id: ID!): User
20
- paginateUser: UserPaginated
23
+ paginateUser(page: Int, limit: Int, search: String): UserPaginated
21
24
  }
22
25
 
23
- input UserInput{
26
+ input UserCreateInput{
27
+ name: String
24
28
  username: String!
25
- email: String!
26
29
  password: String!
27
30
  role: ID
31
+ email: String!
32
+ phone: String
33
+ active: Boolean
34
+ }
35
+
36
+ input UserUpdateInput{
37
+ name: String
38
+ username: String!
39
+ role: ID
40
+ email: String!
41
+ phone: String
42
+ active: Boolean
43
+ }
44
+
45
+ type Auth{
46
+ accessToken: String
47
+ }
48
+
49
+ input AuthInput{
50
+ username: String!
51
+ password: String!
28
52
  }
29
53
 
30
54
  type Mutation{
31
- createUser(input: UserInput): User
32
- updateUser(id: ID!, input: UserInput): User
55
+ auth(input: AuthInput): Auth
56
+ createUser(input: UserCreateInput): User
57
+ updateUser(id: ID!, input: UserUpdateInput): User
33
58
  deleteUser(id: ID!): Boolean
59
+ changeOwnPassword(currentPassword:String!, newPassword: String!): Boolean
60
+ changeUserPassword(userId:ID!, newPassword:String!): Boolean
34
61
  }
package/src/index.ts CHANGED
@@ -1,30 +1,70 @@
1
1
  import GraphqlMerge from "./graphql/index.js"
2
2
  import UserServiceFactory from "./factory/UserServiceFactory.js";
3
3
  import RoleServiceFactory from "./factory/RoleServiceFactory.js";
4
- import AuthServiceFactory from "./factory/AuthServiceFactory.js";
5
- import {authRoutes} from "./routes/authRoutes.js";
4
+ import RoleService from "./services/RoleService.js";
5
+ import UserService from "./services/UserService.js";
6
+ import PermissionService from "./services/PermissionService.js";
7
+ import Rbac from "./rbac/Rbac.js";
8
+ import {UserRoutes} from "./routes/UserRoutes.js";
9
+ import {RoleRoutes} from "./routes/RoleRoutes.js";
10
+ import AuthUtils from "./utils/AuthUtils.js";
11
+ import {jwtMiddleware} from "./middleware/jwtMiddleware.js";
12
+ import {rbacMiddleware} from "./middleware/rbacMiddleware.js";
13
+
14
+ import IdentityPermissions from "./permissions/IdentityPermissions.js";
15
+ import UnauthorizedError from "./errors/UnauthorizedError.js";
16
+ import BadCredentialsError from "./errors/BadCredentialsError.js";
17
+
18
+ import type {IJwtUser} from "./interfaces/IJwtUser";
19
+ import type {IRole, IRoleBase} from "./interfaces/IRole";
20
+ import type {IUser} from "./interfaces/IUser";
21
+ import type {IUserRepository} from "./interfaces/IUserRepository";
22
+ import type {IRoleRepository} from "./interfaces/IRoleRepository";
6
23
 
7
24
  const graphqlMergeResult = await GraphqlMerge()
8
25
  const identityTypeDefs = await graphqlMergeResult.typeDefs;
9
26
  const identityResolvers = await graphqlMergeResult.resolvers;
10
27
 
11
- const userService = UserServiceFactory()
12
- const roleService = RoleServiceFactory()
13
-
14
- const authService = AuthServiceFactory()
28
+ export type {
29
+ IJwtUser,
30
+ IRole,
31
+ IRoleBase,
32
+ IRoleRepository,
33
+ IUser,
34
+ IUserRepository
35
+ }
15
36
 
16
37
  export {
17
38
  //Service
18
- userService,
19
- roleService,
20
- authService,
39
+ UserService,
40
+ RoleService,
41
+ PermissionService,
42
+ Rbac,
43
+
44
+ //Factories
45
+ UserServiceFactory,
46
+ RoleServiceFactory,
21
47
 
22
48
  //GQL
23
49
  identityTypeDefs,
24
50
  identityResolvers,
25
51
 
26
52
  //API REST
27
- authRoutes
53
+ UserRoutes,
54
+ RoleRoutes,
55
+
56
+ AuthUtils,
57
+
58
+ //API MIDDLEWARE
59
+ jwtMiddleware,
60
+ rbacMiddleware,
61
+
62
+ //Permissions
63
+ IdentityPermissions,
64
+
65
+ //Errors
66
+ UnauthorizedError,
67
+ BadCredentialsError
28
68
  }
29
69
 
30
70
 
@@ -0,0 +1,5 @@
1
+ import {mongoose} from "@drax/common-back";
2
+ import {UUID} from "crypto";
3
+
4
+ export type IID = mongoose.Types.ObjectId | UUID | string | number;
5
+
@@ -0,0 +1,7 @@
1
+ interface IJwtUser {
2
+ id: string
3
+ username: string;
4
+ roleId: string
5
+ }
6
+
7
+ export {IJwtUser}
@@ -1,11 +1,21 @@
1
1
  import {mongoose} from "@drax/common-back";
2
+ import {IID} from "./IID";
2
3
 
3
- interface IRole{
4
- _id?: mongoose.Types.ObjectId
4
+ type IPermissions = string[] | string;
5
+
6
+ interface IRoleBase{
7
+ id: IID
5
8
  name: string
6
9
  permissions: string[]
7
- childRoles?: mongoose.Types.ObjectId[]
8
- readonly: boolean
9
10
  }
10
11
 
11
- export {IRole}
12
+ interface IRole{
13
+ id?: IID
14
+ name: string
15
+ permissions: IPermissions
16
+ childRoles?: mongoose.Types.ObjectId[] | string
17
+ readonly: boolean | number
18
+ }
19
+
20
+
21
+ export {IRole, IRoleBase, IPermissions}
@@ -1,11 +1,14 @@
1
1
  import {IRole} from './IRole'
2
+ import {IPaginateFilter, IPaginateResult} from "@drax/common-back";
3
+ import {IID} from "./IID";
2
4
  interface IRoleRepository{
3
5
  create(role: IRole): Promise<IRole>;
4
- update(_id: any, updatedRole: IRole): Promise<IRole | null>;
5
- delete(_id: any): Promise<boolean>;
6
- findById(_id: any): Promise<IRole | null>;
7
-
8
- paginate(query: any, options: any): any;
6
+ update(id: IID, updatedRole: IRole): Promise<IRole | null>;
7
+ delete(id: IID): Promise<boolean>;
8
+ findById(id: IID): Promise<IRole | null>;
9
+ fetchAll(): Promise<IRole[]>;
10
+ paginate(page?: number, limit?: number, search?:string, filters?: IPaginateFilter[]): Promise<IPaginateResult>;
11
+ table?():void
9
12
  }
10
13
 
11
14
  export {IRoleRepository}
@@ -1,21 +1,45 @@
1
1
  import {mongoose} from "@drax/common-back";
2
2
  import {IRole} from "./IRole";
3
3
  import {IUserGroup} from "./IUserGroup";
4
+ import {IID} from "./IID";
4
5
 
5
6
  interface IUser {
6
- _id?: mongoose.Types.ObjectId
7
+ id?: IID
7
8
  username: string
8
9
  email: string
9
10
  password: string
10
- active: boolean
11
+ active: boolean | number
11
12
  name?: string
12
13
  phone?: string
13
14
  avatar?: string
14
- avatarurl?: string
15
15
  code?: string
16
- role: mongoose.Types.ObjectId | IRole
17
- groups: mongoose.Types.ObjectId[] | IUserGroup[]
16
+ role: IRole | IID
17
+ groups: IID[] | IUserGroup[] | string[] | string
18
+ toObject(): IUser;
19
+ }
20
+
21
+ interface IUserCreate {
22
+ id?: IID
23
+ name: string
24
+ username: string
25
+ password: string
26
+ email: string
27
+ active: boolean | number
28
+ phone: string
29
+ role: IID
30
+ groups: IID[] | string
31
+ }
18
32
 
33
+ interface IUserUpdate {
34
+ id?: IID
35
+ name: string
36
+ username: string
37
+ email: string
38
+ active: boolean
39
+ phone: string
40
+ role: IID
41
+ groups: IID[]
42
+ password?: string
19
43
  }
20
44
 
21
- export {IUser}
45
+ export {IUser, IUserCreate, IUserUpdate}
@@ -1,8 +1,9 @@
1
1
  import {mongoose} from "@drax/common-back";
2
2
  import {IUser} from "./IUser";
3
+ import {IID} from "./IID";
3
4
 
4
5
  interface IUserGroup{
5
- _id?: mongoose.Types.ObjectId
6
+ id?: IID
6
7
  name: string
7
8
  users: mongoose.Types.ObjectId[] | IUser[]
8
9
  }