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