@drax/identity-back 0.36.0 → 0.37.0
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/controllers/UserController.js +5 -1
- package/dist/controllers/UserLoginFailController.js +54 -0
- package/dist/controllers/UserSessionController.js +54 -0
- package/dist/factory/UserLoginFailServiceFactory.js +25 -0
- package/dist/factory/UserSessionServiceFactory.js +25 -0
- package/dist/factory/services/UserLoginFailServiceFactory.js +15 -0
- package/dist/factory/services/UserSessionServiceFactory.js +15 -0
- package/dist/graphql/resolvers/role.resolvers.js +9 -9
- package/dist/graphql/resolvers/tenant.resolvers.js +8 -8
- package/dist/graphql/resolvers/user-api-key.resolvers.js +7 -7
- package/dist/graphql/resolvers/user.resolvers.js +3 -1
- package/dist/index.js +6 -3
- package/dist/interfaces/IUserLoginFail.js +1 -0
- package/dist/interfaces/IUserLoginFailRepository.js +1 -0
- package/dist/interfaces/IUserSession.js +1 -0
- package/dist/interfaces/IUserSessionRepository.js +1 -0
- package/dist/models/RoleModel.js +2 -0
- package/dist/models/UserLoginFailModel.js +20 -0
- package/dist/models/UserSessionModel.js +21 -0
- package/dist/permissions/UserLoginFailPermissions.js +8 -0
- package/dist/permissions/UserSessionPermissions.js +8 -0
- package/dist/permissions/index.js +9 -5
- package/dist/rbac/Rbac.js +1 -1
- package/dist/repository/mongo/UserLoginFailMongoRepository.js +12 -0
- package/dist/repository/mongo/UserSessionMongoRepository.js +12 -0
- package/dist/repository/sqlite/UserLoginFailSqliteRepository.js +31 -0
- package/dist/repository/sqlite/UserSessionSqliteRepository.js +31 -0
- package/dist/routes/UserLoginFailRoutes.js +12 -0
- package/dist/routes/UserRoutes.js +1 -0
- package/dist/routes/UserSessionRoutes.js +12 -0
- package/dist/schemas/RoleSchema.js +4 -0
- package/dist/schemas/UserLoginFailSchema.js +13 -0
- package/dist/schemas/UserSchema.js +2 -0
- package/dist/schemas/UserSessionSchema.js +15 -0
- package/dist/services/UserLoginFailService.js +8 -0
- package/dist/services/UserService.js +18 -3
- package/dist/services/UserSessionService.js +8 -0
- package/package.json +7 -7
- package/src/controllers/UserController.ts +6 -1
- package/src/controllers/UserLoginFailController.ts +64 -0
- package/src/controllers/UserSessionController.ts +64 -0
- package/src/factory/UserLoginFailServiceFactory.ts +31 -0
- package/src/factory/UserSessionServiceFactory.ts +31 -0
- package/src/graphql/resolvers/role.resolvers.ts +9 -9
- package/src/graphql/resolvers/tenant.resolvers.ts +8 -8
- package/src/graphql/resolvers/user-api-key.resolvers.ts +7 -7
- package/src/graphql/resolvers/user.resolvers.ts +3 -1
- package/src/index.ts +8 -3
- package/src/interfaces/IUserLoginFailRepository.ts +11 -0
- package/src/interfaces/IUserSessionRepository.ts +11 -0
- package/src/models/RoleModel.ts +2 -0
- package/src/models/UserLoginFailModel.ts +34 -0
- package/src/models/UserSessionModel.ts +36 -0
- package/src/permissions/UserLoginFailPermissions.ts +12 -0
- package/src/permissions/UserSessionPermissions.ts +12 -0
- package/src/permissions/index.ts +9 -5
- package/src/rbac/Rbac.ts +1 -1
- package/src/repository/mongo/UserLoginFailMongoRepository.ts +21 -0
- package/src/repository/mongo/UserSessionMongoRepository.ts +21 -0
- package/src/repository/sqlite/RoleSqliteRepository.ts +0 -7
- package/src/repository/sqlite/UserLoginFailSqliteRepository.ts +44 -0
- package/src/repository/sqlite/UserSessionSqliteRepository.ts +44 -0
- package/src/routes/UserLoginFailRoutes.ts +20 -0
- package/src/routes/UserRoutes.ts +2 -0
- package/src/routes/UserSessionRoutes.ts +20 -0
- package/src/schemas/RoleSchema.ts +4 -0
- package/src/schemas/UserLoginFailSchema.ts +18 -0
- package/src/schemas/UserSchema.ts +2 -0
- package/src/schemas/UserSessionSchema.ts +20 -0
- package/src/services/UserLoginFailService.ts +16 -0
- package/src/services/UserService.ts +18 -3
- package/src/services/UserSessionService.ts +16 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/types/controllers/UserController.d.ts.map +1 -1
- package/types/controllers/UserLoginFailController.d.ts +13 -0
- package/types/controllers/UserLoginFailController.d.ts.map +1 -0
- package/types/controllers/UserSessionController.d.ts +13 -0
- package/types/controllers/UserSessionController.d.ts.map +1 -0
- package/types/factory/UserLoginFailServiceFactory.d.ts +4 -0
- package/types/factory/UserLoginFailServiceFactory.d.ts.map +1 -0
- package/types/factory/UserSessionServiceFactory.d.ts +4 -0
- package/types/factory/UserSessionServiceFactory.d.ts.map +1 -0
- package/types/factory/services/UserLoginFailServiceFactory.d.ts +8 -0
- package/types/factory/services/UserLoginFailServiceFactory.d.ts.map +1 -0
- package/types/factory/services/UserSessionServiceFactory.d.ts +8 -0
- package/types/factory/services/UserSessionServiceFactory.d.ts.map +1 -0
- package/types/graphql/resolvers/user.resolvers.d.ts.map +1 -1
- package/types/index.d.ts +5 -2
- package/types/index.d.ts.map +1 -1
- package/types/interfaces/IUserLoginFail.d.ts +17 -0
- package/types/interfaces/IUserLoginFail.d.ts.map +1 -0
- package/types/interfaces/IUserLoginFailRepository.d.ts +6 -0
- package/types/interfaces/IUserLoginFailRepository.d.ts.map +1 -0
- package/types/interfaces/IUserSession.d.ts +19 -0
- package/types/interfaces/IUserSession.d.ts.map +1 -0
- package/types/interfaces/IUserSessionRepository.d.ts +6 -0
- package/types/interfaces/IUserSessionRepository.d.ts.map +1 -0
- package/types/models/RoleModel.d.ts.map +1 -1
- package/types/models/UserLoginFailModel.d.ts +15 -0
- package/types/models/UserLoginFailModel.d.ts.map +1 -0
- package/types/models/UserSessionModel.d.ts +15 -0
- package/types/models/UserSessionModel.d.ts.map +1 -0
- package/types/permissions/UserLoginFailPermissions.d.ts +8 -0
- package/types/permissions/UserLoginFailPermissions.d.ts.map +1 -0
- package/types/permissions/UserSessionPermissions.d.ts +8 -0
- package/types/permissions/UserSessionPermissions.d.ts.map +1 -0
- package/types/permissions/index.d.ts +7 -5
- package/types/permissions/index.d.ts.map +1 -1
- package/types/repository/mongo/UserLoginFailMongoRepository.d.ts +9 -0
- package/types/repository/mongo/UserLoginFailMongoRepository.d.ts.map +1 -0
- package/types/repository/mongo/UserSessionMongoRepository.d.ts +9 -0
- package/types/repository/mongo/UserSessionMongoRepository.d.ts.map +1 -0
- package/types/repository/sqlite/RoleSqliteRepository.d.ts.map +1 -1
- package/types/repository/sqlite/UserLoginFailSqliteRepository.d.ts +23 -0
- package/types/repository/sqlite/UserLoginFailSqliteRepository.d.ts.map +1 -0
- package/types/repository/sqlite/UserSessionSqliteRepository.d.ts +23 -0
- package/types/repository/sqlite/UserSessionSqliteRepository.d.ts.map +1 -0
- package/types/routes/UserLoginFailRoutes.d.ts +4 -0
- package/types/routes/UserLoginFailRoutes.d.ts.map +1 -0
- package/types/routes/UserRoutes.d.ts.map +1 -1
- package/types/routes/UserSessionRoutes.d.ts +4 -0
- package/types/routes/UserSessionRoutes.d.ts.map +1 -0
- package/types/schemas/RoleSchema.d.ts +24 -10
- package/types/schemas/RoleSchema.d.ts.map +1 -1
- package/types/schemas/UserLoginFailSchema.d.ts +37 -0
- package/types/schemas/UserLoginFailSchema.d.ts.map +1 -0
- package/types/schemas/UserSchema.d.ts +31 -21
- package/types/schemas/UserSchema.d.ts.map +1 -1
- package/types/schemas/UserSessionSchema.d.ts +59 -0
- package/types/schemas/UserSessionSchema.d.ts.map +1 -0
- package/types/services/UserLoginFailService.d.ts +10 -0
- package/types/services/UserLoginFailService.d.ts.map +1 -0
- package/types/services/UserService.d.ts +4 -1
- package/types/services/UserService.d.ts.map +1 -1
- package/types/services/UserSessionService.d.ts +10 -0
- package/types/services/UserSessionService.d.ts.map +1 -0
- package/src/permissions/IdentityPermissions.ts +0 -35
|
@@ -15,13 +15,17 @@ const BASE_URL = DraxConfig.getOrLoad(CommonConfig.BaseUrl) ? DraxConfig.get(Com
|
|
|
15
15
|
class UserController extends AbstractFastifyController {
|
|
16
16
|
constructor() {
|
|
17
17
|
super(UserServiceFactory(), UserPermissions);
|
|
18
|
+
this.tenantField = "tenant";
|
|
19
|
+
this.tenantFilter = true;
|
|
18
20
|
}
|
|
19
21
|
async auth(request, reply) {
|
|
20
22
|
try {
|
|
21
23
|
const username = request.body.username;
|
|
22
24
|
const password = request.body.password;
|
|
25
|
+
const userAgent = request.headers['user-agent'];
|
|
26
|
+
const ip = request.ip;
|
|
23
27
|
const userService = UserServiceFactory();
|
|
24
|
-
return await userService.auth(username, password);
|
|
28
|
+
return await userService.auth(username, password, { userAgent, ip });
|
|
25
29
|
}
|
|
26
30
|
catch (e) {
|
|
27
31
|
console.error('/api/auth error', e);
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import UserLoginFailServiceFactory from "../factory/UserLoginFailServiceFactory.js";
|
|
2
|
+
import { AbstractFastifyController } from "@drax/crud-back";
|
|
3
|
+
import UserLoginFailPermissions from "../permissions/UserLoginFailPermissions.js";
|
|
4
|
+
import { MethodNotAllowedError } from "@drax/common-back";
|
|
5
|
+
class UserLoginFailController extends AbstractFastifyController {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(UserLoginFailServiceFactory(), UserLoginFailPermissions);
|
|
8
|
+
this.tenantField = "tenant";
|
|
9
|
+
this.userField = "user";
|
|
10
|
+
this.tenantFilter = false;
|
|
11
|
+
this.userFilter = true;
|
|
12
|
+
this.tenantSetter = false;
|
|
13
|
+
this.userSetter = true;
|
|
14
|
+
this.tenantAssert = false;
|
|
15
|
+
this.userAssert = true;
|
|
16
|
+
}
|
|
17
|
+
async create(request, reply) {
|
|
18
|
+
try {
|
|
19
|
+
throw new MethodNotAllowedError();
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
this.handleError(e, reply);
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
async update(request, reply) {
|
|
27
|
+
try {
|
|
28
|
+
throw new MethodNotAllowedError();
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
this.handleError(e, reply);
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
async updatePartial(request, reply) {
|
|
36
|
+
try {
|
|
37
|
+
throw new MethodNotAllowedError();
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
this.handleError(e, reply);
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
async delete(request, reply) {
|
|
45
|
+
try {
|
|
46
|
+
throw new MethodNotAllowedError();
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
this.handleError(e, reply);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export default UserLoginFailController;
|
|
54
|
+
export { UserLoginFailController };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import UserSessionServiceFactory from "../factory/UserSessionServiceFactory.js";
|
|
2
|
+
import { AbstractFastifyController } from "@drax/crud-back";
|
|
3
|
+
import UserSessionPermissions from "../permissions/UserSessionPermissions.js";
|
|
4
|
+
import { MethodNotAllowedError } from "@drax/common-back";
|
|
5
|
+
class UserSessionController extends AbstractFastifyController {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(UserSessionServiceFactory(), UserSessionPermissions);
|
|
8
|
+
this.tenantField = "tenant";
|
|
9
|
+
this.userField = "user";
|
|
10
|
+
this.tenantFilter = false;
|
|
11
|
+
this.userFilter = true;
|
|
12
|
+
this.tenantSetter = false;
|
|
13
|
+
this.userSetter = true;
|
|
14
|
+
this.tenantAssert = false;
|
|
15
|
+
this.userAssert = true;
|
|
16
|
+
}
|
|
17
|
+
async create(request, reply) {
|
|
18
|
+
try {
|
|
19
|
+
throw new MethodNotAllowedError();
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
this.handleError(e, reply);
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
async update(request, reply) {
|
|
27
|
+
try {
|
|
28
|
+
throw new MethodNotAllowedError();
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
this.handleError(e, reply);
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
async updatePartial(request, reply) {
|
|
36
|
+
try {
|
|
37
|
+
throw new MethodNotAllowedError();
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
this.handleError(e, reply);
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
async delete(request, reply) {
|
|
45
|
+
try {
|
|
46
|
+
throw new MethodNotAllowedError();
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
this.handleError(e, reply);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export default UserSessionController;
|
|
54
|
+
export { UserSessionController };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import UserLoginFailMongoRepository from "../repository/mongo/UserLoginFailMongoRepository.js";
|
|
2
|
+
import UserLoginFailService from "../services/UserLoginFailService.js";
|
|
3
|
+
import UserLoginFailSqliteRepository from "../repository/sqlite/UserLoginFailSqliteRepository.js";
|
|
4
|
+
import { COMMON, CommonConfig, DraxConfig } from "@drax/common-back";
|
|
5
|
+
let userService;
|
|
6
|
+
const UserLoginFailServiceFactory = (verbose = false) => {
|
|
7
|
+
if (!userService) {
|
|
8
|
+
let userRepository;
|
|
9
|
+
switch (DraxConfig.getOrLoad(CommonConfig.DbEngine)) {
|
|
10
|
+
case COMMON.DB_ENGINES.MONGODB:
|
|
11
|
+
userRepository = new UserLoginFailMongoRepository();
|
|
12
|
+
break;
|
|
13
|
+
case COMMON.DB_ENGINES.SQLITE:
|
|
14
|
+
const dbFile = DraxConfig.getOrLoad(CommonConfig.SqliteDbFile);
|
|
15
|
+
userRepository = new UserLoginFailSqliteRepository(dbFile, verbose);
|
|
16
|
+
userRepository.build();
|
|
17
|
+
break;
|
|
18
|
+
default:
|
|
19
|
+
throw new Error("DraxConfig.DB_ENGINE must be one of " + Object.values(COMMON.DB_ENGINES).join(", "));
|
|
20
|
+
}
|
|
21
|
+
userService = new UserLoginFailService(userRepository);
|
|
22
|
+
}
|
|
23
|
+
return userService;
|
|
24
|
+
};
|
|
25
|
+
export default UserLoginFailServiceFactory;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import UserSessionMongoRepository from "../repository/mongo/UserSessionMongoRepository.js";
|
|
2
|
+
import UserSessionService from "../services/UserSessionService.js";
|
|
3
|
+
import UserSessionSqliteRepository from "../repository/sqlite/UserSessionSqliteRepository.js";
|
|
4
|
+
import { COMMON, CommonConfig, DraxConfig } from "@drax/common-back";
|
|
5
|
+
let userService;
|
|
6
|
+
const UserSessionServiceFactory = (verbose = false) => {
|
|
7
|
+
if (!userService) {
|
|
8
|
+
let userRepository;
|
|
9
|
+
switch (DraxConfig.getOrLoad(CommonConfig.DbEngine)) {
|
|
10
|
+
case COMMON.DB_ENGINES.MONGODB:
|
|
11
|
+
userRepository = new UserSessionMongoRepository();
|
|
12
|
+
break;
|
|
13
|
+
case COMMON.DB_ENGINES.SQLITE:
|
|
14
|
+
const dbFile = DraxConfig.getOrLoad(CommonConfig.SqliteDbFile);
|
|
15
|
+
userRepository = new UserSessionSqliteRepository(dbFile, verbose);
|
|
16
|
+
userRepository.build();
|
|
17
|
+
break;
|
|
18
|
+
default:
|
|
19
|
+
throw new Error("DraxConfig.DB_ENGINE must be one of " + Object.values(COMMON.DB_ENGINES).join(", "));
|
|
20
|
+
}
|
|
21
|
+
userService = new UserSessionService(userRepository);
|
|
22
|
+
}
|
|
23
|
+
return userService;
|
|
24
|
+
};
|
|
25
|
+
export default UserSessionServiceFactory;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import UserLoginFailRepository from '../../repository/mongo/UserLoginFailMongoRepository';
|
|
2
|
+
import { UserLoginFailService } from '../../services/UserLoginFailService.js';
|
|
3
|
+
import { UserLoginFailBaseSchema } from "../../schemas/UserLoginFailSchema.js";
|
|
4
|
+
class UserLoginFailServiceFactory {
|
|
5
|
+
static get instance() {
|
|
6
|
+
if (!UserLoginFailServiceFactory.service) {
|
|
7
|
+
const repository = new UserLoginFailRepository();
|
|
8
|
+
const schema = UserLoginFailBaseSchema;
|
|
9
|
+
UserLoginFailServiceFactory.service = new UserLoginFailService(repository, schema);
|
|
10
|
+
}
|
|
11
|
+
return UserLoginFailServiceFactory.service;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export default UserLoginFailServiceFactory;
|
|
15
|
+
export { UserLoginFailServiceFactory };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import UserSessionRepository from '../../repository/mongo/UserSessionMongoRepository';
|
|
2
|
+
import { UserSessionService } from '../../services/UserSessionService.js';
|
|
3
|
+
import { UserSessionBaseSchema } from "../../schemas/UserSessionSchema.js";
|
|
4
|
+
class UserSessionServiceFactory {
|
|
5
|
+
static get instance() {
|
|
6
|
+
if (!UserSessionServiceFactory.service) {
|
|
7
|
+
const repository = new UserSessionRepository();
|
|
8
|
+
const schema = UserSessionBaseSchema;
|
|
9
|
+
UserSessionServiceFactory.service = new UserSessionService(repository, schema);
|
|
10
|
+
}
|
|
11
|
+
return UserSessionServiceFactory.service;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export default UserSessionServiceFactory;
|
|
15
|
+
export { UserSessionServiceFactory };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import RoleServiceFactory from "../../factory/RoleServiceFactory.js";
|
|
2
|
-
import {
|
|
2
|
+
import { RolePermissions } from "../../permissions/RolePermissions.js";
|
|
3
3
|
import { ValidationError, ValidationErrorToGraphQLError, UnauthorizedError } from "@drax/common-back";
|
|
4
4
|
import { GraphQLError } from "graphql";
|
|
5
5
|
import { PermissionService } from "../../services/PermissionService.js";
|
|
@@ -7,7 +7,7 @@ export default {
|
|
|
7
7
|
Query: {
|
|
8
8
|
findRoleById: async (_, { id }, { rbac }) => {
|
|
9
9
|
try {
|
|
10
|
-
rbac.assertPermission(
|
|
10
|
+
rbac.assertPermission(RolePermissions.View);
|
|
11
11
|
const roleService = RoleServiceFactory();
|
|
12
12
|
return await roleService.findById(id);
|
|
13
13
|
}
|
|
@@ -20,7 +20,7 @@ export default {
|
|
|
20
20
|
},
|
|
21
21
|
findRoleByName: async (_, { name }, { rbac }) => {
|
|
22
22
|
try {
|
|
23
|
-
rbac.assertPermission(
|
|
23
|
+
rbac.assertPermission(RolePermissions.View);
|
|
24
24
|
const roleService = RoleServiceFactory();
|
|
25
25
|
return await roleService.findByName(name);
|
|
26
26
|
}
|
|
@@ -33,7 +33,7 @@ export default {
|
|
|
33
33
|
},
|
|
34
34
|
fetchRole: async (_, {}, { rbac }) => {
|
|
35
35
|
try {
|
|
36
|
-
rbac.assertPermission(
|
|
36
|
+
rbac.assertPermission(RolePermissions.View);
|
|
37
37
|
const roleService = RoleServiceFactory();
|
|
38
38
|
const roles = await roleService.fetchAll();
|
|
39
39
|
if (rbac.getRole?.childRoles?.length > 0) {
|
|
@@ -53,7 +53,7 @@ export default {
|
|
|
53
53
|
},
|
|
54
54
|
fetchPermissions: async (_, {}, { rbac }) => {
|
|
55
55
|
try {
|
|
56
|
-
rbac.assertPermission(
|
|
56
|
+
rbac.assertPermission(RolePermissions.Permissions);
|
|
57
57
|
return PermissionService.getPermissions();
|
|
58
58
|
}
|
|
59
59
|
catch (e) {
|
|
@@ -65,7 +65,7 @@ export default {
|
|
|
65
65
|
},
|
|
66
66
|
paginateRole: async (_, { options = { page: 1, limit: 5, orderBy: "", order: "asc", search: "", filters: [] } }, { rbac }) => {
|
|
67
67
|
try {
|
|
68
|
-
rbac.assertPermission(
|
|
68
|
+
rbac.assertPermission(RolePermissions.View);
|
|
69
69
|
const roleService = RoleServiceFactory();
|
|
70
70
|
return await roleService.paginate(options);
|
|
71
71
|
}
|
|
@@ -81,7 +81,7 @@ export default {
|
|
|
81
81
|
Mutation: {
|
|
82
82
|
createRole: async (_, { input }, { rbac }) => {
|
|
83
83
|
try {
|
|
84
|
-
rbac.assertPermission(
|
|
84
|
+
rbac.assertPermission(RolePermissions.Create);
|
|
85
85
|
const roleService = RoleServiceFactory();
|
|
86
86
|
return await roleService.create(input);
|
|
87
87
|
}
|
|
@@ -98,7 +98,7 @@ export default {
|
|
|
98
98
|
},
|
|
99
99
|
updateRole: async (_, { id, input }, { rbac }) => {
|
|
100
100
|
try {
|
|
101
|
-
rbac.assertPermission(
|
|
101
|
+
rbac.assertPermission(RolePermissions.Update);
|
|
102
102
|
const roleService = RoleServiceFactory();
|
|
103
103
|
const currentRole = await roleService.findById(id);
|
|
104
104
|
if (currentRole.readonly) {
|
|
@@ -119,7 +119,7 @@ export default {
|
|
|
119
119
|
},
|
|
120
120
|
deleteRole: async (_, { id }, { rbac }) => {
|
|
121
121
|
try {
|
|
122
|
-
rbac.assertPermission(
|
|
122
|
+
rbac.assertPermission(RolePermissions.Delete);
|
|
123
123
|
const roleService = RoleServiceFactory();
|
|
124
124
|
const currentRole = await roleService.findById(id);
|
|
125
125
|
if (currentRole.readonly) {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import TenantServiceFactory from "../../factory/TenantServiceFactory.js";
|
|
2
|
-
import {
|
|
2
|
+
import { TenantPermissions } from "../../permissions/TenantPermissions.js";
|
|
3
3
|
import { ValidationError, ValidationErrorToGraphQLError, UnauthorizedError } from "@drax/common-back";
|
|
4
4
|
import { GraphQLError } from "graphql";
|
|
5
5
|
export default {
|
|
6
6
|
Query: {
|
|
7
7
|
findTenantById: async (_, { id }, { rbac }) => {
|
|
8
8
|
try {
|
|
9
|
-
rbac.assertPermission(
|
|
9
|
+
rbac.assertPermission(TenantPermissions.View);
|
|
10
10
|
const tenantService = TenantServiceFactory();
|
|
11
11
|
return await tenantService.findById(id);
|
|
12
12
|
}
|
|
@@ -19,7 +19,7 @@ export default {
|
|
|
19
19
|
},
|
|
20
20
|
findTenantByName: async (_, { name }, { rbac }) => {
|
|
21
21
|
try {
|
|
22
|
-
rbac.assertPermission(
|
|
22
|
+
rbac.assertPermission(TenantPermissions.View);
|
|
23
23
|
const tenantService = TenantServiceFactory();
|
|
24
24
|
return await tenantService.findByName(name);
|
|
25
25
|
}
|
|
@@ -32,7 +32,7 @@ export default {
|
|
|
32
32
|
},
|
|
33
33
|
fetchTenant: async (_, {}, { rbac }) => {
|
|
34
34
|
try {
|
|
35
|
-
rbac.assertPermission(
|
|
35
|
+
rbac.assertPermission(TenantPermissions.View);
|
|
36
36
|
const tenantService = TenantServiceFactory();
|
|
37
37
|
const tenants = await tenantService.fetchAll();
|
|
38
38
|
if (rbac.getAuthUser.tenantId) {
|
|
@@ -51,7 +51,7 @@ export default {
|
|
|
51
51
|
},
|
|
52
52
|
paginateTenant: async (_, { options = { page: 1, limit: 5, orderBy: "", order: "asc", search: "", filters: [] } }, { rbac }) => {
|
|
53
53
|
try {
|
|
54
|
-
rbac.assertPermission(
|
|
54
|
+
rbac.assertPermission(TenantPermissions.View);
|
|
55
55
|
const tenantService = TenantServiceFactory();
|
|
56
56
|
return await tenantService.paginate(options);
|
|
57
57
|
}
|
|
@@ -67,7 +67,7 @@ export default {
|
|
|
67
67
|
Mutation: {
|
|
68
68
|
createTenant: async (_, { input }, { rbac }) => {
|
|
69
69
|
try {
|
|
70
|
-
rbac.assertPermission(
|
|
70
|
+
rbac.assertPermission(TenantPermissions.Create);
|
|
71
71
|
const tenantService = TenantServiceFactory();
|
|
72
72
|
return await tenantService.create(input);
|
|
73
73
|
}
|
|
@@ -84,7 +84,7 @@ export default {
|
|
|
84
84
|
},
|
|
85
85
|
updateTenant: async (_, { id, input }, { rbac }) => {
|
|
86
86
|
try {
|
|
87
|
-
rbac.assertPermission(
|
|
87
|
+
rbac.assertPermission(TenantPermissions.Update);
|
|
88
88
|
const tenantService = TenantServiceFactory();
|
|
89
89
|
return await tenantService.update(id, input);
|
|
90
90
|
}
|
|
@@ -101,7 +101,7 @@ export default {
|
|
|
101
101
|
},
|
|
102
102
|
deleteTenant: async (_, { id }, { rbac }) => {
|
|
103
103
|
try {
|
|
104
|
-
rbac.assertPermission(
|
|
104
|
+
rbac.assertPermission(TenantPermissions.Delete);
|
|
105
105
|
const tenantService = TenantServiceFactory();
|
|
106
106
|
return await tenantService.delete(id);
|
|
107
107
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import UserApiKeyServiceFactory from "../../factory/UserApiKeyServiceFactory.js";
|
|
2
|
-
import {
|
|
2
|
+
import { UserApiKeyPermissions } from "../../permissions/UserApiKeyPermissions.js";
|
|
3
3
|
import { ValidationError, ValidationErrorToGraphQLError, UnauthorizedError } from "@drax/common-back";
|
|
4
4
|
import { GraphQLError } from "graphql";
|
|
5
5
|
import * as crypto from "node:crypto";
|
|
@@ -9,13 +9,13 @@ export default {
|
|
|
9
9
|
try {
|
|
10
10
|
rbac.assertAuthenticated();
|
|
11
11
|
rbac.assertOrPermissions([
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
UserApiKeyPermissions.View,
|
|
13
|
+
UserApiKeyPermissions.ViewMy
|
|
14
14
|
]);
|
|
15
15
|
if (!Array.isArray(options.filters)) {
|
|
16
16
|
options.filters = [];
|
|
17
17
|
}
|
|
18
|
-
if (!rbac.hasPermission(
|
|
18
|
+
if (!rbac.hasPermission(UserApiKeyPermissions.View)) {
|
|
19
19
|
options.filters.push({ field: "user", operator: "eq", value: rbac.userId });
|
|
20
20
|
}
|
|
21
21
|
const userApiKeyService = UserApiKeyServiceFactory();
|
|
@@ -33,7 +33,7 @@ export default {
|
|
|
33
33
|
Mutation: {
|
|
34
34
|
createUserApiKey: async (_, { input }, { rbac }) => {
|
|
35
35
|
try {
|
|
36
|
-
rbac.assertPermission(
|
|
36
|
+
rbac.assertPermission(UserApiKeyPermissions.Create);
|
|
37
37
|
input.user = rbac.authUser.id;
|
|
38
38
|
input.secret = crypto.randomUUID();
|
|
39
39
|
const userApiKeyService = UserApiKeyServiceFactory(true);
|
|
@@ -52,7 +52,7 @@ export default {
|
|
|
52
52
|
},
|
|
53
53
|
updateUserApiKey: async (_, { id, input }, { rbac }) => {
|
|
54
54
|
try {
|
|
55
|
-
rbac.assertPermission(
|
|
55
|
+
rbac.assertPermission(UserApiKeyPermissions.Update);
|
|
56
56
|
const userApiKeyService = UserApiKeyServiceFactory();
|
|
57
57
|
return await userApiKeyService.update(id, input);
|
|
58
58
|
}
|
|
@@ -69,7 +69,7 @@ export default {
|
|
|
69
69
|
},
|
|
70
70
|
deleteUserApiKey: async (_, { id }, { rbac }) => {
|
|
71
71
|
try {
|
|
72
|
-
rbac.assertPermission(
|
|
72
|
+
rbac.assertPermission(UserApiKeyPermissions.Delete);
|
|
73
73
|
const userApiKeyService = UserApiKeyServiceFactory();
|
|
74
74
|
return await userApiKeyService.delete(id);
|
|
75
75
|
}
|
|
@@ -62,7 +62,9 @@ export default {
|
|
|
62
62
|
auth: async (_, { input }) => {
|
|
63
63
|
try {
|
|
64
64
|
let userService = UserServiceFactory();
|
|
65
|
-
|
|
65
|
+
const userAgent = '';
|
|
66
|
+
const ip = '';
|
|
67
|
+
return await userService.auth(input.username, input.password, { userAgent, ip });
|
|
66
68
|
}
|
|
67
69
|
catch (e) {
|
|
68
70
|
console.error("auth", e);
|
package/dist/index.js
CHANGED
|
@@ -11,6 +11,8 @@ import { UserRoutes } from "./routes/UserRoutes.js";
|
|
|
11
11
|
import { RoleRoutes } from "./routes/RoleRoutes.js";
|
|
12
12
|
import { TenantRoutes } from "./routes/TenantRoutes.js";
|
|
13
13
|
import { UserApiKeyRoutes } from "./routes/UserApiKeyRoutes.js";
|
|
14
|
+
import { UserSessionRoutes } from "./routes/UserSessionRoutes.js";
|
|
15
|
+
import { UserLoginFailRoutes } from "./routes/UserLoginFailRoutes.js";
|
|
14
16
|
import AuthUtils from "./utils/AuthUtils.js";
|
|
15
17
|
import { jwtMiddleware } from "./middleware/jwtMiddleware.js";
|
|
16
18
|
import { rbacMiddleware } from "./middleware/rbacMiddleware.js";
|
|
@@ -22,11 +24,12 @@ import CreateOrUpdateRole from "./setup/CreateOrUpdateRole.js";
|
|
|
22
24
|
import LoadPermissions from "./setup/LoadPermissions.js";
|
|
23
25
|
import LoadIdentityConfigFromEnv from "./setup/LoadIdentityConfigFromEnv.js";
|
|
24
26
|
import RecoveryUserPassword from "./setup/RecoveryUserPassword.js";
|
|
25
|
-
import IdentityPermissions from "./permissions/IdentityPermissions.js";
|
|
26
27
|
import { RolePermissions } from "./permissions/RolePermissions.js";
|
|
27
28
|
import { TenantPermissions } from "./permissions/TenantPermissions.js";
|
|
28
29
|
import { UserPermissions } from "./permissions/UserPermissions.js";
|
|
29
30
|
import { UserApiKeyPermissions } from "./permissions/UserApiKeyPermissions.js";
|
|
31
|
+
import { UserLoginFailPermissions } from "./permissions/UserLoginFailPermissions.js";
|
|
32
|
+
import { UserSessionPermissions } from "./permissions/UserSessionPermissions.js";
|
|
30
33
|
import { UserSchema, UserBaseSchema } from "./schemas/UserSchema.js";
|
|
31
34
|
import { TenantSchema, TenantBaseSchema } from "./schemas/TenantSchema.js";
|
|
32
35
|
import { RoleSchema, RoleBaseSchema } from "./schemas/RoleSchema.js";
|
|
@@ -44,11 +47,11 @@ UserServiceFactory, RoleServiceFactory, TenantServiceFactory,
|
|
|
44
47
|
//GQL
|
|
45
48
|
identityTypeDefs, identityResolvers,
|
|
46
49
|
//API REST
|
|
47
|
-
UserRoutes, RoleRoutes, TenantRoutes, UserApiKeyRoutes, AuthUtils,
|
|
50
|
+
UserRoutes, RoleRoutes, TenantRoutes, UserApiKeyRoutes, UserSessionRoutes, UserLoginFailRoutes, AuthUtils,
|
|
48
51
|
//API MIDDLEWARE
|
|
49
52
|
jwtMiddleware, rbacMiddleware, apiKeyMiddleware,
|
|
50
53
|
//Permissions
|
|
51
|
-
|
|
54
|
+
RolePermissions, TenantPermissions, UserPermissions, UserApiKeyPermissions, UserSessionPermissions, UserLoginFailPermissions,
|
|
52
55
|
//Config
|
|
53
56
|
IdentityConfig,
|
|
54
57
|
//Errors
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/models/RoleModel.js
CHANGED
|
@@ -7,6 +7,8 @@ const RoleMongoSchema = new Schema({
|
|
|
7
7
|
type: String, unique: true, required: true, index: true,
|
|
8
8
|
},
|
|
9
9
|
permissions: [{ type: String, required: true }],
|
|
10
|
+
icon: { type: String, required: false },
|
|
11
|
+
color: { type: String, required: false },
|
|
10
12
|
childRoles: [{
|
|
11
13
|
type: mongoose.Schema.Types.ObjectId,
|
|
12
14
|
ref: 'Role',
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { mongoose } from '@drax/common-back';
|
|
2
|
+
import uniqueValidator from 'mongoose-unique-validator';
|
|
3
|
+
import mongoosePaginate from 'mongoose-paginate-v2';
|
|
4
|
+
const UserLoginFailSchema = new mongoose.Schema({
|
|
5
|
+
username: { type: String, required: false, index: false, unique: false },
|
|
6
|
+
userAgent: { type: String, required: false, index: false, unique: false },
|
|
7
|
+
ip: { type: String, required: false, index: false, unique: false },
|
|
8
|
+
}, { timestamps: true });
|
|
9
|
+
UserLoginFailSchema.plugin(uniqueValidator, { message: 'validation.unique' });
|
|
10
|
+
UserLoginFailSchema.plugin(mongoosePaginate);
|
|
11
|
+
UserLoginFailSchema.virtual("id").get(function () {
|
|
12
|
+
return this._id.toString();
|
|
13
|
+
});
|
|
14
|
+
UserLoginFailSchema.set('toJSON', { getters: true, virtuals: true });
|
|
15
|
+
UserLoginFailSchema.set('toObject', { getters: true, virtuals: true });
|
|
16
|
+
const MODEL_NAME = 'UserLoginFail';
|
|
17
|
+
const COLLECTION_NAME = 'UserLoginFail';
|
|
18
|
+
const UserLoginFailModel = mongoose.model(MODEL_NAME, UserLoginFailSchema, COLLECTION_NAME);
|
|
19
|
+
export { UserLoginFailSchema, UserLoginFailModel };
|
|
20
|
+
export default UserLoginFailModel;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { mongoose } from '@drax/common-back';
|
|
2
|
+
import uniqueValidator from 'mongoose-unique-validator';
|
|
3
|
+
import mongoosePaginate from 'mongoose-paginate-v2';
|
|
4
|
+
const UserSessionSchema = new mongoose.Schema({
|
|
5
|
+
uuid: { type: String, required: true, index: true, unique: false },
|
|
6
|
+
user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true, index: true, unique: false },
|
|
7
|
+
userAgent: { type: String, required: false, index: false, unique: false },
|
|
8
|
+
ip: { type: String, required: false, index: false, unique: false },
|
|
9
|
+
}, { timestamps: true });
|
|
10
|
+
UserSessionSchema.plugin(uniqueValidator, { message: 'validation.unique' });
|
|
11
|
+
UserSessionSchema.plugin(mongoosePaginate);
|
|
12
|
+
UserSessionSchema.virtual("id").get(function () {
|
|
13
|
+
return this._id.toString();
|
|
14
|
+
});
|
|
15
|
+
UserSessionSchema.set('toJSON', { getters: true, virtuals: true });
|
|
16
|
+
UserSessionSchema.set('toObject', { getters: true, virtuals: true });
|
|
17
|
+
const MODEL_NAME = 'UserSession';
|
|
18
|
+
const COLLECTION_NAME = 'UserSession';
|
|
19
|
+
const UserSessionModel = mongoose.model(MODEL_NAME, UserSessionSchema, COLLECTION_NAME);
|
|
20
|
+
export { UserSessionSchema, UserSessionModel };
|
|
21
|
+
export default UserSessionModel;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
var UserLoginFailPermissions;
|
|
2
|
+
(function (UserLoginFailPermissions) {
|
|
3
|
+
UserLoginFailPermissions["View"] = "userloginfail:view";
|
|
4
|
+
UserLoginFailPermissions["ViewAll"] = "userloginfail:viewAll";
|
|
5
|
+
UserLoginFailPermissions["Manage"] = "userloginfail:manage";
|
|
6
|
+
})(UserLoginFailPermissions || (UserLoginFailPermissions = {}));
|
|
7
|
+
export { UserLoginFailPermissions };
|
|
8
|
+
export default UserLoginFailPermissions;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
var UserSessionPermissions;
|
|
2
|
+
(function (UserSessionPermissions) {
|
|
3
|
+
UserSessionPermissions["View"] = "usersession:view";
|
|
4
|
+
UserSessionPermissions["ViewAll"] = "usersession:viewAll";
|
|
5
|
+
UserSessionPermissions["Manage"] = "usersession:manage";
|
|
6
|
+
})(UserSessionPermissions || (UserSessionPermissions = {}));
|
|
7
|
+
export { UserSessionPermissions };
|
|
8
|
+
export default UserSessionPermissions;
|
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
import TenantPermissions from './TenantPermissions';
|
|
2
|
-
import UserPermissions from './UserPermissions';
|
|
3
|
-
import RolePermissions from './RolePermissions';
|
|
4
|
-
import UserApiKeyPermissions from './UserApiKeyPermissions';
|
|
1
|
+
import TenantPermissions from './TenantPermissions.js';
|
|
2
|
+
import UserPermissions from './UserPermissions.js';
|
|
3
|
+
import RolePermissions from './RolePermissions.js';
|
|
4
|
+
import UserApiKeyPermissions from './UserApiKeyPermissions.js';
|
|
5
|
+
import UserLoginFailPermissions from './UserLoginFailPermissions.js';
|
|
6
|
+
import UserSessionPermissions from './UserSessionPermissions.js';
|
|
5
7
|
const permissions = {
|
|
6
8
|
...TenantPermissions,
|
|
7
9
|
...UserPermissions,
|
|
8
10
|
...RolePermissions,
|
|
9
|
-
...UserApiKeyPermissions
|
|
11
|
+
...UserApiKeyPermissions,
|
|
12
|
+
...UserLoginFailPermissions,
|
|
13
|
+
...UserSessionPermissions
|
|
10
14
|
};
|
|
11
15
|
export default permissions;
|
|
12
16
|
export { permissions };
|
package/dist/rbac/Rbac.js
CHANGED
|
@@ -46,7 +46,7 @@ class Rbac {
|
|
|
46
46
|
}
|
|
47
47
|
assertPermission(requiredPermission) {
|
|
48
48
|
this.assertAuthenticated();
|
|
49
|
-
if (!this.hasPermission(requiredPermission)) {
|
|
49
|
+
if (requiredPermission === undefined || !this.hasPermission(requiredPermission)) {
|
|
50
50
|
throw new ForbiddenError();
|
|
51
51
|
}
|
|
52
52
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AbstractMongoRepository } from "@drax/crud-back";
|
|
2
|
+
import { UserLoginFailModel } from "../../models/UserLoginFailModel.js";
|
|
3
|
+
class UserLoginFailMongoRepository extends AbstractMongoRepository {
|
|
4
|
+
constructor() {
|
|
5
|
+
super();
|
|
6
|
+
this._model = UserLoginFailModel;
|
|
7
|
+
this._searchFields = ['agent', 'ip'];
|
|
8
|
+
this._populateFields = [];
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export default UserLoginFailMongoRepository;
|
|
12
|
+
export { UserLoginFailMongoRepository };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AbstractMongoRepository } from "@drax/crud-back";
|
|
2
|
+
import { UserSessionModel } from "../../models/UserSessionModel.js";
|
|
3
|
+
class UserSessionMongoRepository extends AbstractMongoRepository {
|
|
4
|
+
constructor() {
|
|
5
|
+
super();
|
|
6
|
+
this._model = UserSessionModel;
|
|
7
|
+
this._searchFields = ['uuid', 'agent', 'ip'];
|
|
8
|
+
this._populateFields = ['user'];
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export default UserSessionMongoRepository;
|
|
12
|
+
export { UserSessionMongoRepository };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { AbstractSqliteRepository } from "@drax/crud-back";
|
|
2
|
+
class UserLoginFailSqliteRepository extends AbstractSqliteRepository {
|
|
3
|
+
constructor() {
|
|
4
|
+
super(...arguments);
|
|
5
|
+
this.tableName = 'user_sessions';
|
|
6
|
+
this.searchFields = [];
|
|
7
|
+
this.booleanFields = [];
|
|
8
|
+
this.identifier = '_id';
|
|
9
|
+
this.populateFields = [{ field: 'user', table: 'users', identifier: '_id' }];
|
|
10
|
+
this.tableFields = [
|
|
11
|
+
{ name: "uuid", type: "TEXT", unique: false, primary: false },
|
|
12
|
+
{ name: "user", type: "TEXT", unique: false, primary: false },
|
|
13
|
+
{ name: "agent", type: "TEXT", unique: false, primary: false },
|
|
14
|
+
{ name: "ip", type: "TEXT", unique: false, primary: false },
|
|
15
|
+
{ name: "createdAt", type: "TEXT", unique: false, primary: false },
|
|
16
|
+
{ name: "updatedAt", type: "TEXT", unique: false, primary: false },
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
async prepareData(data) {
|
|
20
|
+
// Transform data before saving to database if needed
|
|
21
|
+
}
|
|
22
|
+
async prepareItem(item) {
|
|
23
|
+
if (item.createdAt && typeof item.createdAt === 'string') {
|
|
24
|
+
item.createdAt = new Date(item.createdAt);
|
|
25
|
+
}
|
|
26
|
+
if (item.updatedAt && typeof item.updatedAt === 'string') {
|
|
27
|
+
item.updatedAt = new Date(item.updatedAt);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export default UserLoginFailSqliteRepository;
|