@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.
- package/dist/errors/BadCredentialsError.js +10 -0
- package/dist/errors/UnauthorizedError.js +10 -0
- package/dist/factory/RoleServiceFactory.js +16 -3
- package/dist/factory/UserServiceFactory.js +17 -3
- package/dist/graphql/resolvers/role.resolvers.js +98 -11
- package/dist/graphql/resolvers/user.resolvers.js +134 -15
- package/dist/graphql/types/role.graphql +6 -4
- package/dist/graphql/types/user.graphql +36 -9
- package/dist/i18n/messages/validation-i18n.js +21 -0
- package/dist/index.js +22 -7
- package/dist/interfaces/IID.js +1 -0
- package/dist/interfaces/IJwtUser.js +1 -0
- package/dist/middleware/jwtMiddleware.js +19 -0
- package/dist/middleware/rbacMiddleware.js +36 -0
- package/dist/models/RoleModel.js +0 -8
- package/dist/models/UserModel.js +1 -2
- package/dist/permissions/IdentityPermissions.js +16 -0
- package/dist/rbac/Rbac.js +20 -0
- package/dist/repository/mongo/RoleMongoRepository.js +41 -0
- package/dist/repository/mongo/UserMongoRepository.js +82 -0
- package/dist/repository/sqlite/RoleSqliteRepository.js +115 -0
- package/dist/repository/sqlite/UserSqliteRepository.js +157 -0
- package/dist/routes/RoleRoutes.js +145 -0
- package/dist/routes/UserRoutes.js +199 -0
- package/dist/routes/authRoutes.js +12 -4
- package/dist/services/AuthService.js +0 -15
- package/dist/services/PermissionService.js +19 -0
- package/dist/services/RoleService.js +48 -16
- package/dist/services/UserService.js +82 -23
- package/dist/utils/AuthUtils.js +20 -6
- package/dist/utils/DbSetupUtils.js +28 -0
- package/dist/zod/RoleZod.js +8 -0
- package/dist/zod/UserZod.js +18 -0
- package/package.json +17 -10
- package/src/errors/BadCredentialsError.ts +13 -0
- package/src/errors/UnauthorizedError.ts +13 -0
- package/src/factory/RoleServiceFactory.ts +20 -3
- package/src/factory/UserServiceFactory.ts +20 -3
- package/src/graphql/resolvers/role.resolvers.ts +92 -11
- package/src/graphql/resolvers/user.resolvers.ts +128 -15
- package/src/graphql/types/role.graphql +6 -4
- package/src/graphql/types/user.graphql +36 -9
- package/src/index.ts +50 -10
- package/src/interfaces/IID.ts +5 -0
- package/src/interfaces/IJwtUser.ts +7 -0
- package/src/interfaces/IRole.ts +15 -5
- package/src/interfaces/IRoleRepository.ts +8 -5
- package/src/interfaces/IUser.ts +30 -6
- package/src/interfaces/IUserGroup.ts +2 -1
- package/src/interfaces/IUserRepository.ts +11 -6
- package/src/middleware/jwtMiddleware.ts +22 -0
- package/src/middleware/rbacMiddleware.ts +40 -0
- package/src/models/RoleModel.ts +0 -9
- package/src/models/UserModel.ts +1 -2
- package/src/permissions/IdentityPermissions.ts +20 -0
- package/src/rbac/Rbac.ts +31 -0
- package/src/repository/mongo/RoleMongoRepository.ts +57 -0
- package/src/repository/mongo/UserMongoRepository.ts +104 -0
- package/src/repository/sqlite/RoleSqliteRepository.ts +151 -0
- package/src/repository/sqlite/UserSqliteRepository.ts +194 -0
- package/src/routes/RoleRoutes.ts +141 -0
- package/src/routes/UserRoutes.ts +198 -0
- package/src/services/PermissionService.ts +26 -0
- package/src/services/RoleService.ts +46 -21
- package/src/services/UserService.ts +86 -28
- package/src/utils/AuthUtils.ts +22 -7
- package/src/utils/DbSetupUtils.ts +39 -0
- package/src/zod/RoleZod.ts +14 -0
- package/src/zod/UserZod.ts +26 -0
- package/test/data-json/roles/admin-role.json +1 -1
- package/test/data-obj/roles/{admin-role.ts → admin-mongo-role.ts} +2 -1
- package/test/data-obj/roles/admin-sqlite-role.ts +9 -0
- package/test/data-obj/roles/operator-sqlite-role.ts +9 -0
- package/test/data-obj/users/root-mongo-user.ts +15 -0
- package/test/data-obj/users/root-sqlite-user.ts +16 -0
- package/test/{initializers → db}/MongoInMemory.ts +2 -1
- package/test/initializers/RoleMongoInitializer.ts +15 -0
- package/test/initializers/RoleSqliteInitializer.ts +18 -0
- package/test/repository/{role-repository.test.ts → mongo/role-mongo-repository.test.ts} +14 -24
- package/test/repository/mongo/user-mongo-repository.test.ts +121 -0
- package/test/repository/sqlite/role-sqlite-repository.test.ts +70 -0
- package/test/repository/sqlite/user-sqlite-repository.test.ts +126 -0
- package/test/service/mock-service.test.ts +3 -3
- package/test/service/role-service.test.ts +5 -5
- package/test/service/user-service.test.ts +42 -15
- package/test.db +0 -0
- package/tsconfig.json +16 -3
- package/tsconfig.tsbuildinfo +1 -1
- package/types/errors/BadCredentialsError.d.ts +6 -0
- package/types/errors/BadCredentialsError.d.ts.map +1 -0
- package/types/errors/UnauthorizedError.d.ts +6 -0
- package/types/errors/UnauthorizedError.d.ts.map +1 -0
- package/types/factory/RoleServiceFactory.d.ts +2 -2
- package/types/factory/RoleServiceFactory.d.ts.map +1 -1
- package/types/factory/UserServiceFactory.d.ts +2 -2
- package/types/factory/UserServiceFactory.d.ts.map +1 -1
- package/types/graphql/resolvers/role.resolvers.d.ts +24 -7
- package/types/graphql/resolvers/role.resolvers.d.ts.map +1 -1
- package/types/graphql/resolvers/user.resolvers.d.ts +38 -7
- package/types/graphql/resolvers/user.resolvers.d.ts.map +1 -1
- package/types/i18n/messages/validation-i18n.d.ts +4 -0
- package/types/i18n/messages/validation-i18n.d.ts.map +1 -0
- package/types/index.d.ts +21 -5
- package/types/index.d.ts.map +1 -1
- package/types/interfaces/IID.d.ts +6 -0
- package/types/interfaces/IID.d.ts.map +1 -0
- package/types/interfaces/IJwtUser.d.ts +7 -0
- package/types/interfaces/IJwtUser.d.ts.map +1 -0
- package/types/interfaces/IRole.d.ts +13 -6
- package/types/interfaces/IRole.d.ts.map +1 -1
- package/types/interfaces/IRoleRepository.d.ts +8 -4
- package/types/interfaces/IRoleRepository.d.ts.map +1 -1
- package/types/interfaces/IUser.d.ts +29 -8
- package/types/interfaces/IUser.d.ts.map +1 -1
- package/types/interfaces/IUserGroup.d.ts +3 -2
- package/types/interfaces/IUserGroup.d.ts.map +1 -1
- package/types/interfaces/IUserRepository.d.ts +10 -6
- package/types/interfaces/IUserRepository.d.ts.map +1 -1
- package/types/middleware/jwtMiddleware.d.ts +4 -0
- package/types/middleware/jwtMiddleware.d.ts.map +1 -0
- package/types/middleware/rbacMiddleware.d.ts +4 -0
- package/types/middleware/rbacMiddleware.d.ts.map +1 -0
- package/types/models/RoleModel.d.ts +8 -8
- package/types/models/RoleModel.d.ts.map +1 -1
- package/types/models/UserGroupModel.d.ts +8 -8
- package/types/models/UserGroupModel.d.ts.map +1 -1
- package/types/models/UserModel.d.ts +8 -8
- package/types/models/UserModel.d.ts.map +1 -1
- package/types/permissions/IdentityPermissions.d.ts +16 -0
- package/types/permissions/IdentityPermissions.d.ts.map +1 -0
- package/types/rbac/Rbac.d.ts +12 -0
- package/types/rbac/Rbac.d.ts.map +1 -0
- package/types/repository/mongo/RoleMongoRepository.d.ts +14 -0
- package/types/repository/mongo/RoleMongoRepository.d.ts.map +1 -0
- package/types/repository/mongo/UserMongoRepository.d.ts +18 -0
- package/types/repository/mongo/UserMongoRepository.d.ts.map +1 -0
- package/types/repository/sqlite/RoleSqliteRepository.d.ts +19 -0
- package/types/repository/sqlite/RoleSqliteRepository.d.ts.map +1 -0
- package/types/repository/sqlite/UserSqliteRepository.d.ts +24 -0
- package/types/repository/sqlite/UserSqliteRepository.d.ts.map +1 -0
- package/types/routes/RoleRoutes.d.ts +4 -0
- package/types/routes/RoleRoutes.d.ts.map +1 -0
- package/types/routes/UserRoutes.d.ts +4 -0
- package/types/routes/UserRoutes.d.ts.map +1 -0
- package/types/routes/authRoutes.d.ts.map +1 -1
- package/types/services/AuthService.d.ts +0 -3
- package/types/services/AuthService.d.ts.map +1 -1
- package/types/services/PermissionService.d.ts +9 -0
- package/types/services/PermissionService.d.ts.map +1 -0
- package/types/services/RoleService.d.ts +6 -8
- package/types/services/RoleService.d.ts.map +1 -1
- package/types/services/UserService.d.ts +13 -11
- package/types/services/UserService.d.ts.map +1 -1
- package/types/utils/AuthUtils.d.ts +5 -2
- package/types/utils/AuthUtils.d.ts.map +1 -1
- package/types/utils/DbSetupUtils.d.ts +10 -0
- package/types/utils/DbSetupUtils.d.ts.map +1 -0
- package/types/zod/RoleZod.d.ts +10 -0
- package/types/zod/RoleZod.d.ts.map +1 -0
- package/types/zod/UserZod.d.ts +53 -0
- package/types/zod/UserZod.d.ts.map +1 -0
- package/dist/factory/AuthServiceFactory.js +0 -8
- package/dist/graphql/resolvers/auth.resolvers.js +0 -16
- package/dist/graphql/types/auth.graphql +0 -12
- package/dist/repository/RoleRepository.js +0 -29
- package/dist/repository/UserRepository.js +0 -33
- package/src/factory/AuthServiceFactory.ts +0 -10
- package/src/graphql/resolvers/auth.resolvers.ts +0 -20
- package/src/graphql/types/auth.graphql +0 -12
- package/src/repository/RoleRepository.ts +0 -42
- package/src/repository/UserRepository.ts +0 -47
- package/src/routes/authRoutes.ts +0 -22
- package/src/services/AuthService.ts +0 -29
- package/test/data-obj/users/root-user.ts +0 -15
- package/test/initializers/MongoInMemory.mjs +0 -34
- package/test/initializers/RoleInitializer.mjs +0 -11
- package/test/initializers/RoleInitializer.ts +0 -15
- package/test/repository/user-repository.test.ts +0 -54
- package/types/factory/AuthServiceFactory.d.ts +0 -4
- package/types/factory/AuthServiceFactory.d.ts.map +0 -1
- package/types/graphql/resolvers/auth.resolvers.d.ts +0 -12
- package/types/graphql/resolvers/auth.resolvers.d.ts.map +0 -1
- package/types/repository/RoleRepository.d.ts +0 -41
- package/types/repository/RoleRepository.d.ts.map +0 -1
- package/types/repository/UserRepository.d.ts +0 -40
- package/types/repository/UserRepository.d.ts.map +0 -1
- package/types/routes/AuthRoutes.d.ts +0 -3
- package/types/routes/AuthRoutes.d.ts.map +0 -1
|
@@ -1,10 +1,27 @@
|
|
|
1
1
|
import RoleService from "../services/RoleService.js";
|
|
2
|
-
import
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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:
|
|
7
|
-
|
|
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
|
-
|
|
10
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
7
|
-
|
|
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
|
-
|
|
11
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
21
|
-
|
|
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
|
-
|
|
24
|
-
|
|
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
|
-
|
|
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
|
-
|
|
10
|
+
total: Int
|
|
11
11
|
page: Int
|
|
12
12
|
limit: Int
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
|
|
13
|
+
total: Int
|
|
12
14
|
page: Int
|
|
13
15
|
limit: Int
|
|
14
|
-
|
|
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
|
|
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
|
-
|
|
32
|
-
|
|
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
|
|
5
|
-
import
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
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
|
|
package/src/interfaces/IRole.ts
CHANGED
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
import {mongoose} from "@drax/common-back";
|
|
2
|
+
import {IID} from "./IID";
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
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(
|
|
5
|
-
delete(
|
|
6
|
-
findById(
|
|
7
|
-
|
|
8
|
-
paginate(
|
|
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}
|
package/src/interfaces/IUser.ts
CHANGED
|
@@ -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
|
-
|
|
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:
|
|
17
|
-
groups:
|
|
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}
|