@drax/identity-back 0.0.13 → 0.0.15
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/config/IdentityConfig.js +12 -0
- package/dist/factory/RoleServiceFactory.js +16 -13
- package/dist/factory/UserServiceFactory.js +16 -14
- package/dist/graphql/resolvers/role.resolvers.js +7 -1
- package/dist/graphql/resolvers/user.resolvers.js +9 -1
- package/dist/index.js +11 -1
- package/dist/middleware/rbacMiddleware.js +4 -3
- package/dist/routes/RoleRoutes.js +7 -1
- package/dist/routes/UserRoutes.js +8 -1
- package/dist/setup/CreateOrUpdateRole.js +15 -0
- package/dist/setup/CreateUserIfNotExist.js +17 -0
- package/dist/setup/LoadConfigFromEnv.js +12 -0
- package/dist/setup/LoadPermissions.js +8 -0
- package/dist/setup/RecoveryUserPassword.js +9 -0
- package/dist/utils/AuthUtils.js +9 -5
- package/dist/utils/DbSetupUtils.js +10 -8
- package/package.json +2 -2
- package/src/config/IdentityConfig.ts +17 -0
- package/src/factory/RoleServiceFactory.ts +19 -13
- package/src/factory/UserServiceFactory.ts +18 -14
- package/src/graphql/resolvers/role.resolvers.ts +8 -2
- package/src/graphql/resolvers/user.resolvers.ts +9 -4
- package/src/index.ts +18 -1
- package/src/middleware/rbacMiddleware.ts +5 -3
- package/src/routes/RoleRoutes.ts +8 -2
- package/src/routes/UserRoutes.ts +8 -3
- package/src/setup/CreateOrUpdateRole.ts +19 -0
- package/src/setup/CreateUserIfNotExist.ts +21 -0
- package/src/setup/LoadConfigFromEnv.ts +16 -0
- package/src/setup/LoadPermissions.ts +12 -0
- package/src/setup/RecoveryUserPassword.ts +13 -0
- package/src/utils/AuthUtils.ts +10 -5
- package/src/utils/DbSetupUtils.ts +10 -8
- package/tsconfig.tsbuildinfo +1 -1
- package/types/config/IdentityConfig.d.ts +12 -0
- package/types/config/IdentityConfig.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.map +1 -1
- package/types/graphql/resolvers/user.resolvers.d.ts.map +1 -1
- package/types/index.d.ts +7 -1
- package/types/index.d.ts.map +1 -1
- package/types/interfaces/IID.d.ts +1 -1
- package/types/middleware/rbacMiddleware.d.ts.map +1 -1
- package/types/routes/RoleRoutes.d.ts.map +1 -1
- package/types/routes/UserRoutes.d.ts +1 -1
- package/types/routes/UserRoutes.d.ts.map +1 -1
- package/types/setup/CreateOrUpdateRole.d.ts +5 -0
- package/types/setup/CreateOrUpdateRole.d.ts.map +1 -0
- package/types/setup/CreateUserIfNotExist.d.ts +5 -0
- package/types/setup/CreateUserIfNotExist.d.ts.map +1 -0
- package/types/setup/LoadConfigFromEnv.d.ts +4 -0
- package/types/setup/LoadConfigFromEnv.d.ts.map +1 -0
- package/types/setup/LoadPermissions.d.ts +4 -0
- package/types/setup/LoadPermissions.d.ts.map +1 -0
- package/types/setup/RecoveryUserPassword.d.ts +4 -0
- package/types/setup/RecoveryUserPassword.d.ts.map +1 -0
- package/types/utils/AuthUtils.d.ts.map +1 -1
- package/types/utils/DbSetupUtils.d.ts +1 -1
- package/types/utils/DbSetupUtils.d.ts.map +1 -1
- package/types/zod/UserZod.d.ts +6 -6
- package/dist/i18n/messages/validation-i18n.js +0 -21
- package/dist/routes/authRoutes.js +0 -29
- package/dist/services/AuthService.js +0 -6
- package/types/i18n/messages/validation-i18n.d.ts +0 -4
- package/types/i18n/messages/validation-i18n.d.ts.map +0 -1
- package/types/routes/authRoutes.d.ts +0 -4
- package/types/routes/authRoutes.d.ts.map +0 -1
- package/types/services/AuthService.d.ts +0 -7
- package/types/services/AuthService.d.ts.map +0 -1
|
@@ -1,27 +1,31 @@
|
|
|
1
1
|
import UserMongoRepository from "../repository/mongo/UserMongoRepository.js";
|
|
2
2
|
import UserService from "../services/UserService.js";
|
|
3
3
|
import UserSqliteRepository from "../repository/sqlite/UserSqliteRepository.js";
|
|
4
|
-
import process from "node:process";
|
|
5
4
|
import {DbEngine, DbSetupUtils} from "../utils/DbSetupUtils.js";
|
|
6
5
|
import {IUserRepository} from "../interfaces/IUserRepository";
|
|
7
6
|
|
|
7
|
+
let userService: UserService
|
|
8
|
+
|
|
8
9
|
const UserServiceFactory = () : UserService => {
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
11
|
+
if(!userService){
|
|
12
|
+
let userRepository: IUserRepository
|
|
13
|
+
switch (DbSetupUtils.getDbEngine()) {
|
|
14
|
+
case DbEngine.Mongo:
|
|
15
|
+
console.log("UserServiceFactory DB ENGINE MONGODB")
|
|
16
|
+
userRepository = new UserMongoRepository()
|
|
17
|
+
break;
|
|
18
|
+
case DbEngine.Sqlite:
|
|
19
|
+
console.log("UserServiceFactory DB ENGINE SQLITE")
|
|
20
|
+
userRepository = new UserSqliteRepository(DbSetupUtils.getDbConfig(),false)
|
|
21
|
+
userRepository.table()
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
userService = new UserService(userRepository)
|
|
21
26
|
}
|
|
22
27
|
|
|
23
|
-
const userService = new UserService(userRepository)
|
|
24
28
|
return userService
|
|
25
29
|
}
|
|
26
30
|
|
|
27
|
-
export default UserServiceFactory
|
|
31
|
+
export default UserServiceFactory
|
|
@@ -5,12 +5,13 @@ import {GraphQLError} from "graphql";
|
|
|
5
5
|
import {PermissionService} from "../../services/PermissionService.js";
|
|
6
6
|
import UnauthorizedError from "../../errors/UnauthorizedError.js";
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
export default {
|
|
10
10
|
Query: {
|
|
11
11
|
findRoleById: async (_, {id}, {rbac}) => {
|
|
12
12
|
try {
|
|
13
13
|
rbac.assertPermission(IdentityPermissions.ViewRole)
|
|
14
|
+
const roleService = RoleServiceFactory()
|
|
14
15
|
return await roleService.findById(id)
|
|
15
16
|
} catch (e) {
|
|
16
17
|
if (e instanceof UnauthorizedError) {
|
|
@@ -22,6 +23,7 @@ export default {
|
|
|
22
23
|
findRoleByName: async (_, {name}, {rbac}) => {
|
|
23
24
|
try {
|
|
24
25
|
rbac.assertPermission(IdentityPermissions.ViewRole)
|
|
26
|
+
const roleService = RoleServiceFactory()
|
|
25
27
|
return await roleService.findByName(name)
|
|
26
28
|
} catch (e) {
|
|
27
29
|
if (e instanceof UnauthorizedError) {
|
|
@@ -33,6 +35,7 @@ export default {
|
|
|
33
35
|
fetchRole: async (_, {}, {rbac}) => {
|
|
34
36
|
try {
|
|
35
37
|
rbac.assertPermission(IdentityPermissions.ViewRole)
|
|
38
|
+
const roleService = RoleServiceFactory()
|
|
36
39
|
return await roleService.fetchAll()
|
|
37
40
|
} catch (e) {
|
|
38
41
|
if (e instanceof UnauthorizedError) {
|
|
@@ -55,6 +58,7 @@ export default {
|
|
|
55
58
|
paginateRole: async (_, {page, limit, seach}, {rbac}) => {
|
|
56
59
|
try {
|
|
57
60
|
rbac.assertPermission(IdentityPermissions.ViewRole)
|
|
61
|
+
const roleService = RoleServiceFactory()
|
|
58
62
|
return await roleService.paginate(page, limit, seach)
|
|
59
63
|
} catch (e) {
|
|
60
64
|
console.error("paginateRole",e)
|
|
@@ -69,6 +73,7 @@ export default {
|
|
|
69
73
|
createRole: async (_, {input}, {rbac}) => {
|
|
70
74
|
try {
|
|
71
75
|
rbac.assertPermission(IdentityPermissions.CreateRole)
|
|
76
|
+
const roleService = RoleServiceFactory()
|
|
72
77
|
return await roleService.create(input)
|
|
73
78
|
} catch (e) {
|
|
74
79
|
console.error("createRole",e)
|
|
@@ -85,7 +90,7 @@ export default {
|
|
|
85
90
|
updateRole: async (_, {id, input}, {rbac}) => {
|
|
86
91
|
try {
|
|
87
92
|
rbac.assertPermission(IdentityPermissions.UpdateRole)
|
|
88
|
-
|
|
93
|
+
const roleService = RoleServiceFactory()
|
|
89
94
|
const currentRole = await roleService.findById(id)
|
|
90
95
|
if(currentRole.readonly){
|
|
91
96
|
throw new ValidationError([{field:'name', reason:"role.readonly", value:input.name}])
|
|
@@ -106,6 +111,7 @@ export default {
|
|
|
106
111
|
deleteRole: async (_, {id}, {rbac}) => {
|
|
107
112
|
try {
|
|
108
113
|
rbac.assertPermission(IdentityPermissions.DeleteRole)
|
|
114
|
+
const roleService = RoleServiceFactory()
|
|
109
115
|
return await roleService.delete(id)
|
|
110
116
|
} catch (e) {
|
|
111
117
|
console.error("deleteRole",e)
|
|
@@ -5,13 +5,12 @@ import {IdentityPermissions} from "../../permissions/IdentityPermissions.js";
|
|
|
5
5
|
import UnauthorizedError from "../../errors/UnauthorizedError.js";
|
|
6
6
|
import BadCredentialsError from "../../errors/BadCredentialsError.js";
|
|
7
7
|
|
|
8
|
-
const userService = UserServiceFactory
|
|
9
|
-
|
|
10
8
|
export default {
|
|
11
9
|
Query: {
|
|
12
10
|
me: async (_, {}, {authUser}) => {
|
|
13
11
|
try {
|
|
14
12
|
if (authUser) {
|
|
13
|
+
let userService= UserServiceFactory()
|
|
15
14
|
let user = await userService.findById(authUser.id)
|
|
16
15
|
delete user.password
|
|
17
16
|
return user
|
|
@@ -26,6 +25,7 @@ export default {
|
|
|
26
25
|
findUserById: async (_, {id}, {rbac}) => {
|
|
27
26
|
try {
|
|
28
27
|
rbac.assertPermission(IdentityPermissions.ViewUser)
|
|
28
|
+
let userService= UserServiceFactory()
|
|
29
29
|
return await userService.findById(id)
|
|
30
30
|
} catch (e) {
|
|
31
31
|
if (e instanceof UnauthorizedError) {
|
|
@@ -38,6 +38,7 @@ export default {
|
|
|
38
38
|
paginateUser: async (_, {page, limit, search}, {rbac}) => {
|
|
39
39
|
try {
|
|
40
40
|
rbac.assertPermission(IdentityPermissions.ViewUser)
|
|
41
|
+
let userService= UserServiceFactory()
|
|
41
42
|
return await userService.paginate(page, limit, search)
|
|
42
43
|
} catch (e) {
|
|
43
44
|
if (e instanceof UnauthorizedError) {
|
|
@@ -50,6 +51,7 @@ export default {
|
|
|
50
51
|
Mutation: {
|
|
51
52
|
auth: async (_, {input}) => {
|
|
52
53
|
try {
|
|
54
|
+
let userService= UserServiceFactory()
|
|
53
55
|
return await userService.auth(input.username, input.password)
|
|
54
56
|
} catch (e) {
|
|
55
57
|
console.error("auth", e)
|
|
@@ -63,6 +65,7 @@ export default {
|
|
|
63
65
|
createUser: async (_, {input}, {rbac}) => {
|
|
64
66
|
try {
|
|
65
67
|
rbac.assertPermission(IdentityPermissions.CreateUser)
|
|
68
|
+
let userService= UserServiceFactory()
|
|
66
69
|
const user = await userService.create(input)
|
|
67
70
|
return user
|
|
68
71
|
} catch (e) {
|
|
@@ -79,7 +82,7 @@ export default {
|
|
|
79
82
|
updateUser: async (_, {id, input}, {rbac}) => {
|
|
80
83
|
try {
|
|
81
84
|
rbac.assertPermission(IdentityPermissions.UpdateUser)
|
|
82
|
-
|
|
85
|
+
let userService= UserServiceFactory()
|
|
83
86
|
const user = await userService.update(id, input)
|
|
84
87
|
return user
|
|
85
88
|
} catch (e) {
|
|
@@ -94,6 +97,7 @@ export default {
|
|
|
94
97
|
deleteUser: async (_, {id}, {rbac}) => {
|
|
95
98
|
try {
|
|
96
99
|
rbac.assertPermission(IdentityPermissions.DeleteUser)
|
|
100
|
+
let userService= UserServiceFactory()
|
|
97
101
|
return await userService.delete(id)
|
|
98
102
|
} catch (e) {
|
|
99
103
|
console.error("deleteUser", e)
|
|
@@ -111,6 +115,7 @@ export default {
|
|
|
111
115
|
throw new UnauthorizedError()
|
|
112
116
|
}
|
|
113
117
|
let userId = authUser.id
|
|
118
|
+
let userService= UserServiceFactory()
|
|
114
119
|
return await userService.changeOwnPassword(userId, currentPassword, newPassword)
|
|
115
120
|
} catch (e) {
|
|
116
121
|
if (e instanceof ValidationError) {
|
|
@@ -124,7 +129,7 @@ export default {
|
|
|
124
129
|
changeUserPassword: async (_, {userId, newPassword}, {rbac}) => {
|
|
125
130
|
try {
|
|
126
131
|
rbac.assertPermission(IdentityPermissions.UpdateUser)
|
|
127
|
-
|
|
132
|
+
let userService= UserServiceFactory()
|
|
128
133
|
return await userService.changeUserPassword(userId, newPassword)
|
|
129
134
|
} catch (e) {
|
|
130
135
|
if (e instanceof ValidationError) {
|
package/src/index.ts
CHANGED
|
@@ -12,9 +12,16 @@ import {jwtMiddleware} from "./middleware/jwtMiddleware.js";
|
|
|
12
12
|
import {rbacMiddleware} from "./middleware/rbacMiddleware.js";
|
|
13
13
|
|
|
14
14
|
import IdentityPermissions from "./permissions/IdentityPermissions.js";
|
|
15
|
+
import IdentityConfig from "./config/IdentityConfig.js";
|
|
15
16
|
import UnauthorizedError from "./errors/UnauthorizedError.js";
|
|
16
17
|
import BadCredentialsError from "./errors/BadCredentialsError.js";
|
|
17
18
|
|
|
19
|
+
import CreateUserIfNotExist from "./setup/CreateUserIfNotExist.js";
|
|
20
|
+
import CreateOrUpdateRole from "./setup/CreateOrUpdateRole.js";
|
|
21
|
+
import LoadPermissions from "./setup/LoadPermissions.js";
|
|
22
|
+
import LoadConfigFromEnv from "./setup/LoadConfigFromEnv.js";
|
|
23
|
+
import RecoveryUserPassword from "./setup/RecoveryUserPassword.js";
|
|
24
|
+
|
|
18
25
|
import type {IJwtUser} from "./interfaces/IJwtUser";
|
|
19
26
|
import type {IRole, IRoleBase} from "./interfaces/IRole";
|
|
20
27
|
import type {IUser, IUserCreate, IUserUpdate} from "./interfaces/IUser";
|
|
@@ -62,9 +69,19 @@ export {
|
|
|
62
69
|
//Permissions
|
|
63
70
|
IdentityPermissions,
|
|
64
71
|
|
|
72
|
+
//Config
|
|
73
|
+
IdentityConfig,
|
|
74
|
+
|
|
65
75
|
//Errors
|
|
66
76
|
UnauthorizedError,
|
|
67
|
-
BadCredentialsError
|
|
77
|
+
BadCredentialsError,
|
|
78
|
+
|
|
79
|
+
//Setup
|
|
80
|
+
LoadConfigFromEnv,
|
|
81
|
+
LoadPermissions,
|
|
82
|
+
CreateOrUpdateRole,
|
|
83
|
+
CreateUserIfNotExist,
|
|
84
|
+
RecoveryUserPassword
|
|
68
85
|
}
|
|
69
86
|
|
|
70
87
|
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import type {IJwtUser} from "../interfaces/IJwtUser";
|
|
2
2
|
import type {IRole, IRoleBase} from "../interfaces/IRole";
|
|
3
|
-
import {DraxCache} from "@drax/common-back";
|
|
3
|
+
import {DraxCache, DraxConfig} from "@drax/common-back";
|
|
4
4
|
import RoleServiceFactory from "../factory/RoleServiceFactory.js";
|
|
5
5
|
import Rbac from "../rbac/Rbac.js";
|
|
6
|
+
import IdentityConfig from "../config/IdentityConfig.js";
|
|
6
7
|
|
|
7
|
-
const cacheTTL =
|
|
8
|
+
const cacheTTL = DraxConfig.getOrLoad(IdentityConfig.RbacCacheTTL) ? parseInt(DraxConfig.getOrLoad(IdentityConfig.RbacCacheTTL)) : 10000;
|
|
8
9
|
const draxCache = new DraxCache<IRoleBase>(cacheTTL);
|
|
9
|
-
|
|
10
|
+
|
|
10
11
|
|
|
11
12
|
async function roleLoader(k):Promise<IRoleBase | null> {
|
|
13
|
+
const roleService = RoleServiceFactory()
|
|
12
14
|
const role: IRole = await roleService.findById(k)
|
|
13
15
|
if(role){
|
|
14
16
|
return {id: role.id, name: role.name, permissions: role.permissions} as IRoleBase
|
package/src/routes/RoleRoutes.ts
CHANGED
|
@@ -5,7 +5,7 @@ import {IdentityPermissions} from "../permissions/IdentityPermissions.js";
|
|
|
5
5
|
import {PermissionService} from "../services/PermissionService.js";
|
|
6
6
|
import UnauthorizedError from "../errors/UnauthorizedError.js";
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
|
|
10
10
|
async function RoleRoutes(fastify, options) {
|
|
11
11
|
|
|
@@ -30,6 +30,7 @@ async function RoleRoutes(fastify, options) {
|
|
|
30
30
|
try {
|
|
31
31
|
request.rbac.assertPermission(IdentityPermissions.ViewRole)
|
|
32
32
|
const id = request.params.id
|
|
33
|
+
const roleService = RoleServiceFactory()
|
|
33
34
|
let role = await roleService.findById(id)
|
|
34
35
|
return role
|
|
35
36
|
} catch (e) {
|
|
@@ -51,6 +52,7 @@ async function RoleRoutes(fastify, options) {
|
|
|
51
52
|
try {
|
|
52
53
|
request.rbac.assertPermission(IdentityPermissions.ViewRole)
|
|
53
54
|
const name = request.params.name
|
|
55
|
+
const roleService = RoleServiceFactory()
|
|
54
56
|
let role = await roleService.findByName(name)
|
|
55
57
|
return role
|
|
56
58
|
} catch (e) {
|
|
@@ -71,6 +73,7 @@ async function RoleRoutes(fastify, options) {
|
|
|
71
73
|
fastify.get('/api/roles/all', async (request, reply): Promise<IRole[]> => {
|
|
72
74
|
try {
|
|
73
75
|
request.rbac.assertPermission(IdentityPermissions.ViewRole)
|
|
76
|
+
const roleService = RoleServiceFactory()
|
|
74
77
|
let roles = await roleService.fetchAll()
|
|
75
78
|
return roles
|
|
76
79
|
} catch (e) {
|
|
@@ -94,6 +97,7 @@ async function RoleRoutes(fastify, options) {
|
|
|
94
97
|
const page = request.query.page
|
|
95
98
|
const limit = request.query.limit
|
|
96
99
|
const search = request.query.search
|
|
100
|
+
const roleService = RoleServiceFactory()
|
|
97
101
|
let paginateResult = await roleService.paginate(page, limit, search)
|
|
98
102
|
return paginateResult
|
|
99
103
|
} catch (e) {
|
|
@@ -115,6 +119,7 @@ async function RoleRoutes(fastify, options) {
|
|
|
115
119
|
try {
|
|
116
120
|
request.rbac.assertPermission(IdentityPermissions.CreateRole)
|
|
117
121
|
const payload = request.body
|
|
122
|
+
const roleService = RoleServiceFactory()
|
|
118
123
|
let role = await roleService.create(payload)
|
|
119
124
|
return role
|
|
120
125
|
} catch (e) {
|
|
@@ -138,7 +143,7 @@ async function RoleRoutes(fastify, options) {
|
|
|
138
143
|
request.rbac.assertPermission(IdentityPermissions.UpdateRole)
|
|
139
144
|
const id = request.params.id
|
|
140
145
|
const payload = request.body
|
|
141
|
-
|
|
146
|
+
const roleService = RoleServiceFactory()
|
|
142
147
|
const currentRole = await roleService.findById(id)
|
|
143
148
|
if(currentRole.readonly){
|
|
144
149
|
throw new ValidationError([{field:'name', reason:"role.readonly", value:payload.name}])
|
|
@@ -166,6 +171,7 @@ async function RoleRoutes(fastify, options) {
|
|
|
166
171
|
try {
|
|
167
172
|
request.rbac.assertPermission(IdentityPermissions.DeleteRole)
|
|
168
173
|
const id = request.params.id
|
|
174
|
+
const roleService = RoleServiceFactory()
|
|
169
175
|
let r = await roleService.delete(id)
|
|
170
176
|
return r
|
|
171
177
|
} catch (e) {
|
package/src/routes/UserRoutes.ts
CHANGED
|
@@ -5,13 +5,12 @@ import {IdentityPermissions} from "../permissions/IdentityPermissions.js";
|
|
|
5
5
|
import UnauthorizedError from "../errors/UnauthorizedError.js";
|
|
6
6
|
import BadCredentialsError from "../errors/BadCredentialsError.js";
|
|
7
7
|
|
|
8
|
-
const userService = UserServiceFactory
|
|
9
|
-
|
|
10
8
|
async function UserRoutes(fastify, options) {
|
|
11
9
|
fastify.post('/api/auth', async (request, reply) => {
|
|
12
10
|
try {
|
|
13
11
|
const username = request.body.username
|
|
14
12
|
const password = request.body.password
|
|
13
|
+
const userService = UserServiceFactory()
|
|
15
14
|
return await userService.auth(username, password)
|
|
16
15
|
} catch (e) {
|
|
17
16
|
console.error('/api/auth error', e)
|
|
@@ -30,6 +29,7 @@ async function UserRoutes(fastify, options) {
|
|
|
30
29
|
fastify.get('/api/me', async (request, reply): Promise<IUser | null> => {
|
|
31
30
|
try {
|
|
32
31
|
if (request.authUser) {
|
|
32
|
+
const userService = UserServiceFactory()
|
|
33
33
|
let user = await userService.findById(request.authUser.id)
|
|
34
34
|
delete user.password
|
|
35
35
|
return user
|
|
@@ -60,6 +60,7 @@ async function UserRoutes(fastify, options) {
|
|
|
60
60
|
const page = request.query.page
|
|
61
61
|
const limit = request.query.limit
|
|
62
62
|
const search = request.query.search
|
|
63
|
+
const userService = UserServiceFactory()
|
|
63
64
|
let paginateResult = await userService.paginate(page, limit, search)
|
|
64
65
|
return paginateResult
|
|
65
66
|
} catch (e) {
|
|
@@ -80,6 +81,7 @@ async function UserRoutes(fastify, options) {
|
|
|
80
81
|
try {
|
|
81
82
|
request.rbac.assertPermission(IdentityPermissions.CreateUser)
|
|
82
83
|
const payload = request.body
|
|
84
|
+
const userService = UserServiceFactory()
|
|
83
85
|
let user = await userService.create(payload)
|
|
84
86
|
return user
|
|
85
87
|
} catch (e) {
|
|
@@ -102,6 +104,7 @@ async function UserRoutes(fastify, options) {
|
|
|
102
104
|
request.rbac.assertPermission(IdentityPermissions.UpdateUser)
|
|
103
105
|
const id = request.params.id
|
|
104
106
|
const payload = request.body
|
|
107
|
+
const userService = UserServiceFactory()
|
|
105
108
|
let user = await userService.update(id, payload)
|
|
106
109
|
return user
|
|
107
110
|
} catch (e) {
|
|
@@ -126,6 +129,7 @@ async function UserRoutes(fastify, options) {
|
|
|
126
129
|
try {
|
|
127
130
|
request.rbac.assertPermission(IdentityPermissions.DeleteUser)
|
|
128
131
|
const id = request.params.id
|
|
132
|
+
const userService = UserServiceFactory()
|
|
129
133
|
let r = await userService.delete(id)
|
|
130
134
|
return r
|
|
131
135
|
} catch (e) {
|
|
@@ -150,6 +154,7 @@ async function UserRoutes(fastify, options) {
|
|
|
150
154
|
const userId = request.authUser.id
|
|
151
155
|
const currentPassword = request.body.currentPassword
|
|
152
156
|
const newPassword = request.body.newPassword
|
|
157
|
+
const userService = UserServiceFactory()
|
|
153
158
|
return await userService.changeOwnPassword(userId, currentPassword, newPassword)
|
|
154
159
|
} catch (e) {
|
|
155
160
|
console.error('/api/password error', e)
|
|
@@ -175,7 +180,7 @@ async function UserRoutes(fastify, options) {
|
|
|
175
180
|
throw new UnauthorizedError()
|
|
176
181
|
}
|
|
177
182
|
const newPassword = request.body.newPassword
|
|
178
|
-
|
|
183
|
+
const userService = UserServiceFactory()
|
|
179
184
|
return await userService.changeUserPassword(userId, newPassword)
|
|
180
185
|
} catch (e) {
|
|
181
186
|
console.error('/api/password error', e)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type {IRole} from "../interfaces/IRole"
|
|
2
|
+
import RoleServiceFactory from "../factory/RoleServiceFactory.js"
|
|
3
|
+
|
|
4
|
+
async function CreateOrUpdateRole(roleData: IRole) {
|
|
5
|
+
const roleService = RoleServiceFactory()
|
|
6
|
+
const role = await roleService.findByName(roleData.name)
|
|
7
|
+
if(role){
|
|
8
|
+
const r = await roleService.update(role.id, roleData)
|
|
9
|
+
console.log("Role Updated. Name: "+ roleData.name)
|
|
10
|
+
}else{
|
|
11
|
+
const r = await roleService.create(roleData)
|
|
12
|
+
console.log("Role Created. Name: "+ roleData.name)
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export default CreateOrUpdateRole
|
|
17
|
+
export {
|
|
18
|
+
CreateOrUpdateRole
|
|
19
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import RoleServiceFactory from "../factory/RoleServiceFactory.js"
|
|
2
|
+
import UserServiceFactory from "../factory/UserServiceFactory.js"
|
|
3
|
+
import {IUserCreate} from "../interfaces/IUser";
|
|
4
|
+
|
|
5
|
+
async function CreateUserIfNotExist(userData: IUserCreate) {
|
|
6
|
+
const userService = UserServiceFactory()
|
|
7
|
+
const roleService = RoleServiceFactory()
|
|
8
|
+
const user = await userService.findByUsername(userData.username)
|
|
9
|
+
if (user) {
|
|
10
|
+
} else {
|
|
11
|
+
const role = await roleService.findByName(userData.role as string)
|
|
12
|
+
userData.role = role.id as string
|
|
13
|
+
const r = await userService.create(userData)
|
|
14
|
+
console.log("User Created. Username: " + userData.username)
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default CreateUserIfNotExist
|
|
19
|
+
export {
|
|
20
|
+
CreateUserIfNotExist
|
|
21
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {DraxConfig} from "@drax/common-back";
|
|
2
|
+
import IdentityConfig from "../config/IdentityConfig.js";
|
|
3
|
+
|
|
4
|
+
function LoadConfigFromEnv() {
|
|
5
|
+
DraxConfig.set(IdentityConfig.DbEngine, process.env[IdentityConfig.DbEngine])
|
|
6
|
+
DraxConfig.set(IdentityConfig.SqliteDbFile, process.env[IdentityConfig.SqliteDbFile])
|
|
7
|
+
DraxConfig.set(IdentityConfig.MongoDbUri, process.env[IdentityConfig.MongoDbUri])
|
|
8
|
+
DraxConfig.set(IdentityConfig.JwtSecret, process.env[IdentityConfig.JwtSecret])
|
|
9
|
+
DraxConfig.set(IdentityConfig.JwtExpiration, process.env[IdentityConfig.JwtExpiration])
|
|
10
|
+
DraxConfig.set(IdentityConfig.JwtIssuer, process.env[IdentityConfig.JwtIssuer])
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export default LoadConfigFromEnv
|
|
14
|
+
export {
|
|
15
|
+
LoadConfigFromEnv
|
|
16
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import {PermissionService} from "../services/PermissionService.js";
|
|
2
|
+
|
|
3
|
+
function LoadPermissions(permissions: string[]) {
|
|
4
|
+
for(const permission of permissions){
|
|
5
|
+
PermissionService.addPermission(permission)
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export default LoadPermissions
|
|
10
|
+
export {
|
|
11
|
+
LoadPermissions
|
|
12
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import UserServiceFactory from "../factory/UserServiceFactory.js"
|
|
2
|
+
|
|
3
|
+
async function RecoveryUserPassword(username:string, password:string) {
|
|
4
|
+
const userService = UserServiceFactory()
|
|
5
|
+
const user = await userService.findByUsername(username)
|
|
6
|
+
const r = await userService.changeUserPassword(user.id as string, password)
|
|
7
|
+
console.log("User password recovered. Username: " + username)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default RecoveryUserPassword
|
|
11
|
+
export {
|
|
12
|
+
RecoveryUserPassword
|
|
13
|
+
}
|
package/src/utils/AuthUtils.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import bcryptjs from "bcryptjs";
|
|
2
2
|
import jsonwebtoken, {SignOptions, VerifyOptions} from "jsonwebtoken";
|
|
3
|
+
import {DraxConfig} from "@drax/common-back";
|
|
4
|
+
import IdentityConfig from "../config/IdentityConfig.js";
|
|
3
5
|
|
|
4
6
|
class AuthUtils{
|
|
5
7
|
|
|
6
8
|
static verifyToken(token : string) {
|
|
7
|
-
const JWT_SECRET =
|
|
9
|
+
const JWT_SECRET = DraxConfig.getOrLoad(IdentityConfig.JwtSecret)
|
|
8
10
|
if(!JWT_SECRET){
|
|
9
|
-
throw new Error("JWT_SECRET
|
|
11
|
+
throw new Error("DraxConfig.JWT_SECRET must be provided")
|
|
10
12
|
}
|
|
11
13
|
const options : VerifyOptions = {
|
|
12
14
|
algorithms: ['HS256'],
|
|
@@ -40,17 +42,20 @@ class AuthUtils{
|
|
|
40
42
|
static generateToken(userId : string, username: string, roleId: string, session : string) {
|
|
41
43
|
const payload = AuthUtils.tokenSignPayload(userId, username, roleId, session)
|
|
42
44
|
|
|
43
|
-
const JWT_SECRET =
|
|
45
|
+
const JWT_SECRET = DraxConfig.getOrLoad(IdentityConfig.JwtSecret)
|
|
44
46
|
if(!JWT_SECRET){
|
|
45
47
|
throw new Error("JWT_SECRET ENV must be provided")
|
|
46
48
|
}
|
|
47
49
|
|
|
50
|
+
const JWT_EXPIRATION = DraxConfig.getOrLoad(IdentityConfig.JwtExpiration) || '1h'
|
|
51
|
+
const JWT_ISSUER = DraxConfig.getOrLoad(IdentityConfig.JwtIssuer) || 'DRAX'
|
|
52
|
+
|
|
48
53
|
const options : SignOptions = {
|
|
49
|
-
expiresIn:
|
|
54
|
+
expiresIn: JWT_EXPIRATION,
|
|
50
55
|
jwtid: userId,
|
|
51
56
|
algorithm: 'HS256',
|
|
52
57
|
audience: username,
|
|
53
|
-
issuer:
|
|
58
|
+
issuer: JWT_ISSUER
|
|
54
59
|
}
|
|
55
60
|
|
|
56
61
|
let token = jsonwebtoken.sign(
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import IdentityConfig from "../config/IdentityConfig.js";
|
|
2
|
+
import {DraxConfig} from "@drax/common-back";
|
|
1
3
|
|
|
2
4
|
enum DbEngine{
|
|
3
5
|
Sqlite = "sqlite",
|
|
@@ -9,24 +11,24 @@ class DbSetupUtils{
|
|
|
9
11
|
|
|
10
12
|
|
|
11
13
|
static getDbEngine() {
|
|
12
|
-
if (!
|
|
13
|
-
throw new Error("
|
|
14
|
+
if (!DraxConfig.getOrLoad(IdentityConfig.DbEngine)) {
|
|
15
|
+
throw new Error("DraxConfig.DB_ENGINE is not defined");
|
|
14
16
|
}
|
|
15
|
-
const dbEngine =
|
|
17
|
+
const dbEngine = DraxConfig.getOrLoad(IdentityConfig.DbEngine) as DbEngine;
|
|
16
18
|
if (!Object.values(DbEngine).includes(dbEngine)) {
|
|
17
|
-
throw new Error("
|
|
19
|
+
throw new Error("DraxConfig.DB_ENGINE must be one of " + Object.values(DbEngine).join(", "));
|
|
18
20
|
}
|
|
19
21
|
return dbEngine;
|
|
20
22
|
}
|
|
21
23
|
|
|
22
|
-
static
|
|
24
|
+
static getDbConfig(){
|
|
23
25
|
switch (DbSetupUtils.getDbEngine()) {
|
|
24
26
|
case DbEngine.Mongo:
|
|
25
|
-
return
|
|
27
|
+
return DraxConfig.getOrLoad(IdentityConfig.MongoDbUri);
|
|
26
28
|
case DbEngine.Sqlite:
|
|
27
|
-
return
|
|
29
|
+
return DraxConfig.getOrLoad(IdentityConfig.SqliteDbFile);
|
|
28
30
|
default:
|
|
29
|
-
throw new Error("
|
|
31
|
+
throw new Error("DraxConfig.DB_ENGINE must be one of " + Object.values(DbEngine).join(", "));
|
|
30
32
|
}
|
|
31
33
|
}
|
|
32
34
|
|