@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.
Files changed (137) hide show
  1. package/dist/controllers/UserController.js +5 -1
  2. package/dist/controllers/UserLoginFailController.js +54 -0
  3. package/dist/controllers/UserSessionController.js +54 -0
  4. package/dist/factory/UserLoginFailServiceFactory.js +25 -0
  5. package/dist/factory/UserSessionServiceFactory.js +25 -0
  6. package/dist/factory/services/UserLoginFailServiceFactory.js +15 -0
  7. package/dist/factory/services/UserSessionServiceFactory.js +15 -0
  8. package/dist/graphql/resolvers/role.resolvers.js +9 -9
  9. package/dist/graphql/resolvers/tenant.resolvers.js +8 -8
  10. package/dist/graphql/resolvers/user-api-key.resolvers.js +7 -7
  11. package/dist/graphql/resolvers/user.resolvers.js +3 -1
  12. package/dist/index.js +6 -3
  13. package/dist/interfaces/IUserLoginFail.js +1 -0
  14. package/dist/interfaces/IUserLoginFailRepository.js +1 -0
  15. package/dist/interfaces/IUserSession.js +1 -0
  16. package/dist/interfaces/IUserSessionRepository.js +1 -0
  17. package/dist/models/RoleModel.js +2 -0
  18. package/dist/models/UserLoginFailModel.js +20 -0
  19. package/dist/models/UserSessionModel.js +21 -0
  20. package/dist/permissions/UserLoginFailPermissions.js +8 -0
  21. package/dist/permissions/UserSessionPermissions.js +8 -0
  22. package/dist/permissions/index.js +9 -5
  23. package/dist/rbac/Rbac.js +1 -1
  24. package/dist/repository/mongo/UserLoginFailMongoRepository.js +12 -0
  25. package/dist/repository/mongo/UserSessionMongoRepository.js +12 -0
  26. package/dist/repository/sqlite/UserLoginFailSqliteRepository.js +31 -0
  27. package/dist/repository/sqlite/UserSessionSqliteRepository.js +31 -0
  28. package/dist/routes/UserLoginFailRoutes.js +12 -0
  29. package/dist/routes/UserRoutes.js +1 -0
  30. package/dist/routes/UserSessionRoutes.js +12 -0
  31. package/dist/schemas/RoleSchema.js +4 -0
  32. package/dist/schemas/UserLoginFailSchema.js +13 -0
  33. package/dist/schemas/UserSchema.js +2 -0
  34. package/dist/schemas/UserSessionSchema.js +15 -0
  35. package/dist/services/UserLoginFailService.js +8 -0
  36. package/dist/services/UserService.js +18 -3
  37. package/dist/services/UserSessionService.js +8 -0
  38. package/package.json +7 -7
  39. package/src/controllers/UserController.ts +6 -1
  40. package/src/controllers/UserLoginFailController.ts +64 -0
  41. package/src/controllers/UserSessionController.ts +64 -0
  42. package/src/factory/UserLoginFailServiceFactory.ts +31 -0
  43. package/src/factory/UserSessionServiceFactory.ts +31 -0
  44. package/src/graphql/resolvers/role.resolvers.ts +9 -9
  45. package/src/graphql/resolvers/tenant.resolvers.ts +8 -8
  46. package/src/graphql/resolvers/user-api-key.resolvers.ts +7 -7
  47. package/src/graphql/resolvers/user.resolvers.ts +3 -1
  48. package/src/index.ts +8 -3
  49. package/src/interfaces/IUserLoginFailRepository.ts +11 -0
  50. package/src/interfaces/IUserSessionRepository.ts +11 -0
  51. package/src/models/RoleModel.ts +2 -0
  52. package/src/models/UserLoginFailModel.ts +34 -0
  53. package/src/models/UserSessionModel.ts +36 -0
  54. package/src/permissions/UserLoginFailPermissions.ts +12 -0
  55. package/src/permissions/UserSessionPermissions.ts +12 -0
  56. package/src/permissions/index.ts +9 -5
  57. package/src/rbac/Rbac.ts +1 -1
  58. package/src/repository/mongo/UserLoginFailMongoRepository.ts +21 -0
  59. package/src/repository/mongo/UserSessionMongoRepository.ts +21 -0
  60. package/src/repository/sqlite/RoleSqliteRepository.ts +0 -7
  61. package/src/repository/sqlite/UserLoginFailSqliteRepository.ts +44 -0
  62. package/src/repository/sqlite/UserSessionSqliteRepository.ts +44 -0
  63. package/src/routes/UserLoginFailRoutes.ts +20 -0
  64. package/src/routes/UserRoutes.ts +2 -0
  65. package/src/routes/UserSessionRoutes.ts +20 -0
  66. package/src/schemas/RoleSchema.ts +4 -0
  67. package/src/schemas/UserLoginFailSchema.ts +18 -0
  68. package/src/schemas/UserSchema.ts +2 -0
  69. package/src/schemas/UserSessionSchema.ts +20 -0
  70. package/src/services/UserLoginFailService.ts +16 -0
  71. package/src/services/UserService.ts +18 -3
  72. package/src/services/UserSessionService.ts +16 -0
  73. package/tsconfig.tsbuildinfo +1 -1
  74. package/types/controllers/UserController.d.ts.map +1 -1
  75. package/types/controllers/UserLoginFailController.d.ts +13 -0
  76. package/types/controllers/UserLoginFailController.d.ts.map +1 -0
  77. package/types/controllers/UserSessionController.d.ts +13 -0
  78. package/types/controllers/UserSessionController.d.ts.map +1 -0
  79. package/types/factory/UserLoginFailServiceFactory.d.ts +4 -0
  80. package/types/factory/UserLoginFailServiceFactory.d.ts.map +1 -0
  81. package/types/factory/UserSessionServiceFactory.d.ts +4 -0
  82. package/types/factory/UserSessionServiceFactory.d.ts.map +1 -0
  83. package/types/factory/services/UserLoginFailServiceFactory.d.ts +8 -0
  84. package/types/factory/services/UserLoginFailServiceFactory.d.ts.map +1 -0
  85. package/types/factory/services/UserSessionServiceFactory.d.ts +8 -0
  86. package/types/factory/services/UserSessionServiceFactory.d.ts.map +1 -0
  87. package/types/graphql/resolvers/user.resolvers.d.ts.map +1 -1
  88. package/types/index.d.ts +5 -2
  89. package/types/index.d.ts.map +1 -1
  90. package/types/interfaces/IUserLoginFail.d.ts +17 -0
  91. package/types/interfaces/IUserLoginFail.d.ts.map +1 -0
  92. package/types/interfaces/IUserLoginFailRepository.d.ts +6 -0
  93. package/types/interfaces/IUserLoginFailRepository.d.ts.map +1 -0
  94. package/types/interfaces/IUserSession.d.ts +19 -0
  95. package/types/interfaces/IUserSession.d.ts.map +1 -0
  96. package/types/interfaces/IUserSessionRepository.d.ts +6 -0
  97. package/types/interfaces/IUserSessionRepository.d.ts.map +1 -0
  98. package/types/models/RoleModel.d.ts.map +1 -1
  99. package/types/models/UserLoginFailModel.d.ts +15 -0
  100. package/types/models/UserLoginFailModel.d.ts.map +1 -0
  101. package/types/models/UserSessionModel.d.ts +15 -0
  102. package/types/models/UserSessionModel.d.ts.map +1 -0
  103. package/types/permissions/UserLoginFailPermissions.d.ts +8 -0
  104. package/types/permissions/UserLoginFailPermissions.d.ts.map +1 -0
  105. package/types/permissions/UserSessionPermissions.d.ts +8 -0
  106. package/types/permissions/UserSessionPermissions.d.ts.map +1 -0
  107. package/types/permissions/index.d.ts +7 -5
  108. package/types/permissions/index.d.ts.map +1 -1
  109. package/types/repository/mongo/UserLoginFailMongoRepository.d.ts +9 -0
  110. package/types/repository/mongo/UserLoginFailMongoRepository.d.ts.map +1 -0
  111. package/types/repository/mongo/UserSessionMongoRepository.d.ts +9 -0
  112. package/types/repository/mongo/UserSessionMongoRepository.d.ts.map +1 -0
  113. package/types/repository/sqlite/RoleSqliteRepository.d.ts.map +1 -1
  114. package/types/repository/sqlite/UserLoginFailSqliteRepository.d.ts +23 -0
  115. package/types/repository/sqlite/UserLoginFailSqliteRepository.d.ts.map +1 -0
  116. package/types/repository/sqlite/UserSessionSqliteRepository.d.ts +23 -0
  117. package/types/repository/sqlite/UserSessionSqliteRepository.d.ts.map +1 -0
  118. package/types/routes/UserLoginFailRoutes.d.ts +4 -0
  119. package/types/routes/UserLoginFailRoutes.d.ts.map +1 -0
  120. package/types/routes/UserRoutes.d.ts.map +1 -1
  121. package/types/routes/UserSessionRoutes.d.ts +4 -0
  122. package/types/routes/UserSessionRoutes.d.ts.map +1 -0
  123. package/types/schemas/RoleSchema.d.ts +24 -10
  124. package/types/schemas/RoleSchema.d.ts.map +1 -1
  125. package/types/schemas/UserLoginFailSchema.d.ts +37 -0
  126. package/types/schemas/UserLoginFailSchema.d.ts.map +1 -0
  127. package/types/schemas/UserSchema.d.ts +31 -21
  128. package/types/schemas/UserSchema.d.ts.map +1 -1
  129. package/types/schemas/UserSessionSchema.d.ts +59 -0
  130. package/types/schemas/UserSessionSchema.d.ts.map +1 -0
  131. package/types/services/UserLoginFailService.d.ts +10 -0
  132. package/types/services/UserLoginFailService.d.ts.map +1 -0
  133. package/types/services/UserService.d.ts +4 -1
  134. package/types/services/UserService.d.ts.map +1 -1
  135. package/types/services/UserSessionService.d.ts +10 -0
  136. package/types/services/UserSessionService.d.ts.map +1 -0
  137. 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 { IdentityPermissions } from "../../permissions/IdentityPermissions.js";
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(IdentityPermissions.ViewRole);
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(IdentityPermissions.ViewRole);
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(IdentityPermissions.ViewRole);
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(IdentityPermissions.PermissionsRole);
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(IdentityPermissions.ViewRole);
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(IdentityPermissions.CreateRole);
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(IdentityPermissions.UpdateRole);
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(IdentityPermissions.DeleteRole);
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 { IdentityPermissions } from "../../permissions/IdentityPermissions.js";
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(IdentityPermissions.ViewTenant);
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(IdentityPermissions.ViewTenant);
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(IdentityPermissions.ViewTenant);
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(IdentityPermissions.ViewTenant);
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(IdentityPermissions.CreateTenant);
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(IdentityPermissions.UpdateTenant);
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(IdentityPermissions.DeleteTenant);
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 { IdentityPermissions } from "../../permissions/IdentityPermissions.js";
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
- IdentityPermissions.ViewUserApiKey,
13
- IdentityPermissions.ViewMyUserApiKey
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(IdentityPermissions.ViewUserApiKey)) {
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(IdentityPermissions.CreateUserApiKey);
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(IdentityPermissions.UpdateUserApiKey);
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(IdentityPermissions.DeleteUserApiKey);
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
- return await userService.auth(input.username, input.password);
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
- IdentityPermissions, RolePermissions, TenantPermissions, UserPermissions, UserApiKeyPermissions,
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 {};
@@ -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;