@drax/identity-back 0.36.0 → 0.37.2

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
package/src/index.ts CHANGED
@@ -14,6 +14,8 @@ import {UserRoutes} from "./routes/UserRoutes.js";
14
14
  import {RoleRoutes} from "./routes/RoleRoutes.js";
15
15
  import {TenantRoutes} from "./routes/TenantRoutes.js";
16
16
  import {UserApiKeyRoutes} from "./routes/UserApiKeyRoutes.js";
17
+ import {UserSessionRoutes} from "./routes/UserSessionRoutes.js";
18
+ import {UserLoginFailRoutes} from "./routes/UserLoginFailRoutes.js";
17
19
 
18
20
  import AuthUtils from "./utils/AuthUtils.js";
19
21
  import {jwtMiddleware} from "./middleware/jwtMiddleware.js";
@@ -35,12 +37,12 @@ import type {IUserRepository} from "./interfaces/IUserRepository";
35
37
  import type {IUserApiKeyRepository} from "./interfaces/IUserApiKeyRepository";
36
38
 
37
39
 
38
- import IdentityPermissions from "./permissions/IdentityPermissions.js";
39
-
40
40
  import {RolePermissions} from "./permissions/RolePermissions.js";
41
41
  import {TenantPermissions} from "./permissions/TenantPermissions.js";
42
42
  import {UserPermissions} from "./permissions/UserPermissions.js";
43
43
  import {UserApiKeyPermissions} from "./permissions/UserApiKeyPermissions.js";
44
+ import {UserLoginFailPermissions} from "./permissions/UserLoginFailPermissions.js";
45
+ import {UserSessionPermissions} from "./permissions/UserSessionPermissions.js";
44
46
 
45
47
  import {UserSchema, UserBaseSchema} from "./schemas/UserSchema.js";
46
48
  import {TenantSchema,TenantBaseSchema} from "./schemas/TenantSchema.js";
@@ -93,6 +95,8 @@ export {
93
95
  RoleRoutes,
94
96
  TenantRoutes,
95
97
  UserApiKeyRoutes,
98
+ UserSessionRoutes,
99
+ UserLoginFailRoutes,
96
100
 
97
101
  AuthUtils,
98
102
 
@@ -102,11 +106,12 @@ export {
102
106
  apiKeyMiddleware,
103
107
 
104
108
  //Permissions
105
- IdentityPermissions,
106
109
  RolePermissions,
107
110
  TenantPermissions,
108
111
  UserPermissions,
109
112
  UserApiKeyPermissions,
113
+ UserSessionPermissions,
114
+ UserLoginFailPermissions,
110
115
 
111
116
  //Config
112
117
  IdentityConfig,
@@ -0,0 +1,11 @@
1
+
2
+ import {IUserLoginFail, IUserLoginFailBase} from '@drax/identity-share'
3
+ import {IDraxCrudRepository} from "@drax/crud-share";
4
+
5
+ interface IUserLoginFailRepository extends IDraxCrudRepository<IUserLoginFail, IUserLoginFailBase, IUserLoginFailBase>{
6
+
7
+ }
8
+
9
+ export {IUserLoginFailRepository}
10
+
11
+
@@ -0,0 +1,11 @@
1
+
2
+ import {IUserSession, IUserSessionBase} from '@drax/identity-share'
3
+ import {IDraxCrudRepository} from "@drax/crud-share";
4
+
5
+ interface IUserSessionRepository extends IDraxCrudRepository<IUserSession, IUserSessionBase, IUserSessionBase>{
6
+
7
+ }
8
+
9
+ export {IUserSessionRepository}
10
+
11
+
@@ -11,6 +11,8 @@ const RoleMongoSchema = new Schema<IRole>({
11
11
  type: String, unique: true, required: true, index: true,
12
12
  },
13
13
  permissions: [{type: String, required: true}],
14
+ icon: {type: String, required: false},
15
+ color: {type: String, required: false},
14
16
  childRoles: [{
15
17
  type: mongoose.Schema.Types.ObjectId,
16
18
  ref: 'Role',
@@ -0,0 +1,34 @@
1
+ import {mongoose} from '@drax/common-back';
2
+ import {PaginateModel} from "mongoose";
3
+ import uniqueValidator from 'mongoose-unique-validator';
4
+ import mongoosePaginate from 'mongoose-paginate-v2'
5
+ import type {IUserLoginFail} from '@drax/identity-share'
6
+
7
+ const UserLoginFailSchema = new mongoose.Schema<IUserLoginFail>({
8
+ username: {type: String, required: false, index: false, unique: false },
9
+ userAgent: {type: String, required: false, index: false, unique: false },
10
+ ip: {type: String, required: false, index: false, unique: false },
11
+ }, {timestamps: true});
12
+
13
+ UserLoginFailSchema.plugin(uniqueValidator, {message: 'validation.unique'});
14
+ UserLoginFailSchema.plugin(mongoosePaginate);
15
+
16
+ UserLoginFailSchema.virtual("id").get(function () {
17
+ return this._id.toString();
18
+ });
19
+
20
+
21
+ UserLoginFailSchema.set('toJSON', {getters: true, virtuals: true});
22
+
23
+ UserLoginFailSchema.set('toObject', {getters: true, virtuals: true});
24
+
25
+ const MODEL_NAME = 'UserLoginFail';
26
+ const COLLECTION_NAME = 'UserLoginFail';
27
+ const UserLoginFailModel = mongoose.model<IUserLoginFail, PaginateModel<IUserLoginFail>>(MODEL_NAME, UserLoginFailSchema,COLLECTION_NAME);
28
+
29
+ export {
30
+ UserLoginFailSchema,
31
+ UserLoginFailModel
32
+ }
33
+
34
+ export default UserLoginFailModel
@@ -0,0 +1,36 @@
1
+
2
+ import {mongoose} from '@drax/common-back';
3
+ import {PaginateModel} from "mongoose";
4
+ import uniqueValidator from 'mongoose-unique-validator';
5
+ import mongoosePaginate from 'mongoose-paginate-v2'
6
+ import type {IUserSession} from '@drax/identity-share'
7
+
8
+ const UserSessionSchema = new mongoose.Schema<IUserSession>({
9
+ uuid: {type: String, required: true, index: true, unique: false },
10
+ user: {type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true, index: true, unique: false },
11
+ userAgent: {type: String, required: false, index: false, unique: false },
12
+ ip: {type: String, required: false, index: false, unique: false },
13
+ }, {timestamps: true});
14
+
15
+ UserSessionSchema.plugin(uniqueValidator, {message: 'validation.unique'});
16
+ UserSessionSchema.plugin(mongoosePaginate);
17
+
18
+ UserSessionSchema.virtual("id").get(function () {
19
+ return this._id.toString();
20
+ });
21
+
22
+
23
+ UserSessionSchema.set('toJSON', {getters: true, virtuals: true});
24
+
25
+ UserSessionSchema.set('toObject', {getters: true, virtuals: true});
26
+
27
+ const MODEL_NAME = 'UserSession';
28
+ const COLLECTION_NAME = 'UserSession';
29
+ const UserSessionModel = mongoose.model<IUserSession, PaginateModel<IUserSession>>(MODEL_NAME, UserSessionSchema,COLLECTION_NAME);
30
+
31
+ export {
32
+ UserSessionSchema,
33
+ UserSessionModel
34
+ }
35
+
36
+ export default UserSessionModel
@@ -0,0 +1,12 @@
1
+
2
+ enum UserLoginFailPermissions {
3
+
4
+ View = "userloginfail:view",
5
+ ViewAll = "userloginfail:viewAll",
6
+ Manage = "userloginfail:manage"
7
+
8
+ }
9
+
10
+ export { UserLoginFailPermissions };
11
+ export default UserLoginFailPermissions;
12
+
@@ -0,0 +1,12 @@
1
+
2
+ enum UserSessionPermissions {
3
+
4
+ View = "usersession:view",
5
+ ViewAll = "usersession:viewAll",
6
+ Manage = "usersession:manage"
7
+
8
+ }
9
+
10
+ export { UserSessionPermissions };
11
+ export default UserSessionPermissions;
12
+
@@ -1,13 +1,17 @@
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
 
6
8
  const permissions = {
7
9
  ...TenantPermissions,
8
10
  ...UserPermissions,
9
11
  ...RolePermissions,
10
- ...UserApiKeyPermissions
12
+ ...UserApiKeyPermissions,
13
+ ...UserLoginFailPermissions,
14
+ ...UserSessionPermissions
11
15
  };
12
16
 
13
17
 
package/src/rbac/Rbac.ts CHANGED
@@ -63,7 +63,7 @@ class Rbac implements IRbac{
63
63
 
64
64
  assertPermission(requiredPermission: string) {
65
65
  this.assertAuthenticated()
66
- if (!this.hasPermission(requiredPermission)) {
66
+ if (requiredPermission === undefined || !this.hasPermission(requiredPermission)) {
67
67
  throw new ForbiddenError()
68
68
  }
69
69
  }
@@ -0,0 +1,21 @@
1
+
2
+ import {AbstractMongoRepository} from "@drax/crud-back";
3
+ import {UserLoginFailModel} from "../../models/UserLoginFailModel.js";
4
+ import type {IUserLoginFailRepository} from '../../interfaces/IUserLoginFailRepository'
5
+ import type {IUserLoginFail, IUserLoginFailBase} from "@drax/identity-share";
6
+
7
+
8
+ class UserLoginFailMongoRepository extends AbstractMongoRepository<IUserLoginFail, IUserLoginFailBase, IUserLoginFailBase> implements IUserLoginFailRepository {
9
+
10
+ constructor() {
11
+ super();
12
+ this._model = UserLoginFailModel;
13
+ this._searchFields = ['agent', 'ip'];
14
+ this._populateFields = [];
15
+ }
16
+
17
+ }
18
+
19
+ export default UserLoginFailMongoRepository
20
+ export {UserLoginFailMongoRepository}
21
+
@@ -0,0 +1,21 @@
1
+
2
+ import {AbstractMongoRepository} from "@drax/crud-back";
3
+ import {UserSessionModel} from "../../models/UserSessionModel.js";
4
+ import type {IUserSessionRepository} from '../../interfaces/IUserSessionRepository'
5
+ import type {IUserSession, IUserSessionBase} from "@drax/identity-share";
6
+
7
+
8
+ class UserSessionMongoRepository extends AbstractMongoRepository<IUserSession, IUserSessionBase, IUserSessionBase> implements IUserSessionRepository {
9
+
10
+ constructor() {
11
+ super();
12
+ this._model = UserSessionModel;
13
+ this._searchFields = ['uuid', 'agent', 'ip'];
14
+ this._populateFields = ['user'];
15
+ }
16
+
17
+ }
18
+
19
+ export default UserSessionMongoRepository
20
+ export {UserSessionMongoRepository}
21
+
@@ -1,15 +1,8 @@
1
1
  import {IRoleRepository} from '../../interfaces/IRoleRepository'
2
- import {UUID} from "crypto";
3
- import sqlite from "better-sqlite3";
4
- import {randomUUID} from "node:crypto";
5
- import {IDraxPaginateResult, IDraxPaginateOptions} from "@drax/crud-share";
6
2
  import {IRole, IRoleBase} from "@drax/identity-share";
7
3
  import {AbstractSqliteRepository} from "@drax/crud-back";
8
4
  import {
9
- SqliteErrorToValidationError,
10
5
  SqliteTableField,
11
- SqlQueryFilter,
12
- SqlSort
13
6
  } from "@drax/common-back";
14
7
 
15
8
 
@@ -0,0 +1,44 @@
1
+ import {IUserLoginFail, IUserLoginFailBase} from '@drax/identity-share'
2
+ import {IUserLoginFailRepository} from '../../interfaces/IUserLoginFailRepository'
3
+ import type {SqliteTableField} from "@drax/common-back";
4
+ import {AbstractSqliteRepository} from "@drax/crud-back";
5
+ import UserSqliteRepository from "./UserSqliteRepository.js";
6
+
7
+ class UserLoginFailSqliteRepository extends AbstractSqliteRepository<IUserLoginFail,IUserLoginFailBase,IUserLoginFailBase> implements IUserLoginFailRepository{
8
+
9
+ protected db: any;
10
+ protected tableName: string = 'user_sessions';
11
+ protected dataBaseFile: string;
12
+ protected searchFields: string[] = [];
13
+ protected booleanFields: string[] = [];
14
+ protected identifier: string = '_id';
15
+ protected populateFields = [{field: 'user', table: 'users', identifier: '_id'}]
16
+ protected tableFields: SqliteTableField[] = [
17
+ {name: "uuid", type: "TEXT", unique: false, primary: false},
18
+ {name: "user", type: "TEXT", unique: false, primary: false},
19
+ {name: "agent", type: "TEXT", unique: false, primary: false},
20
+ {name: "ip", type: "TEXT", unique: false, primary: false},
21
+ {name: "createdAt", type: "TEXT", unique: false, primary: false},
22
+ {name: "updatedAt", type: "TEXT", unique: false, primary: false},
23
+ ]
24
+ protected verbose: boolean;
25
+
26
+
27
+
28
+ async prepareData(data: any): Promise<void> {
29
+ // Transform data before saving to database if needed
30
+ }
31
+
32
+ async prepareItem(item: any): Promise<void> {
33
+ if (item.createdAt && typeof item.createdAt === 'string') {
34
+ item.createdAt = new Date(item.createdAt);
35
+ }
36
+
37
+ if (item.updatedAt && typeof item.updatedAt === 'string') {
38
+ item.updatedAt = new Date(item.updatedAt);
39
+ }
40
+ }
41
+
42
+ }
43
+
44
+ export default UserLoginFailSqliteRepository
@@ -0,0 +1,44 @@
1
+ import {IUserSession, IUserSessionBase} from '@drax/identity-share'
2
+ import {IUserSessionRepository} from '../../interfaces/IUserSessionRepository'
3
+ import type {SqliteTableField} from "@drax/common-back";
4
+ import {AbstractSqliteRepository} from "@drax/crud-back";
5
+ import UserSqliteRepository from "./UserSqliteRepository.js";
6
+
7
+ class UserSessionSqliteRepository extends AbstractSqliteRepository<IUserSession,IUserSessionBase,IUserSessionBase> implements IUserSessionRepository{
8
+
9
+
10
+ protected db: any;
11
+ protected tableName: string = 'user_sessions';
12
+ protected dataBaseFile: string;
13
+ protected searchFields: string[] = [];
14
+ protected booleanFields: string[] = [];
15
+ protected identifier: string = '_id';
16
+ protected populateFields = [{field: 'user', table: 'users', identifier: '_id'}]
17
+ protected tableFields: SqliteTableField[] = [
18
+ {name: "uuid", type: "TEXT", unique: false, primary: false},
19
+ {name: "user", type: "TEXT", unique: false, primary: false},
20
+ {name: "agent", type: "TEXT", unique: false, primary: false},
21
+ {name: "ip", type: "TEXT", unique: false, primary: false},
22
+ {name: "createdAt", type: "TEXT", unique: false, primary: false},
23
+ {name: "updatedAt", type: "TEXT", unique: false, primary: false},
24
+ ]
25
+ protected verbose: boolean;
26
+
27
+
28
+ async prepareData(data: any): Promise<void> {
29
+ // Transform data before saving to database if needed
30
+ }
31
+
32
+ async prepareItem(item: any): Promise<void> {
33
+ if (item.createdAt && typeof item.createdAt === 'string') {
34
+ item.createdAt = new Date(item.createdAt);
35
+ }
36
+
37
+ if (item.updatedAt && typeof item.updatedAt === 'string') {
38
+ item.updatedAt = new Date(item.updatedAt);
39
+ }
40
+ }
41
+
42
+ }
43
+
44
+ export default UserSessionSqliteRepository
@@ -0,0 +1,20 @@
1
+
2
+ import UserLoginFailController from "../controllers/UserLoginFailController.js";
3
+ import {CrudSchemaBuilder} from "@drax/crud-back";
4
+ import {UserLoginFailSchema, UserLoginFailBaseSchema} from '../schemas/UserLoginFailSchema.js'
5
+
6
+ async function UserLoginFailRoutes(fastify, options) {
7
+
8
+ const controller: UserLoginFailController = new UserLoginFailController()
9
+ const schemas = new CrudSchemaBuilder(UserLoginFailSchema, UserLoginFailBaseSchema,UserLoginFailBaseSchema, 'UserLoginFail', 'openApi3', ['Identity']);
10
+
11
+ fastify.get('/api/user-login-fails', {schema: schemas.paginateSchema}, (req,rep) => controller.paginate(req,rep))
12
+
13
+ fastify.get('/api/user-login-fails/group-by', {schema: schemas.groupBySchema}, (req,rep) => controller.groupBy(req,rep))
14
+
15
+ fastify.get('/api/user-login-fails/export', {schema: schemas.exportSchema}, (req,rep) => controller.export(req,rep))
16
+
17
+ }
18
+
19
+ export default UserLoginFailRoutes;
20
+ export {UserLoginFailRoutes}
@@ -19,6 +19,8 @@ async function UserRoutes(fastify, options) {
19
19
 
20
20
  fastify.get('/api/users/search', {schema: schemas.searchSchema}, async (req, rep) => await controller.search(req, rep))
21
21
 
22
+ fastify.get('/api/users/group-by', {schema: schemas.groupBySchema}, async (req, rep) => await controller.groupBy(req, rep))
23
+
22
24
  fastify.get('/api/users/export', {schema: schemas.exportSchema}, (req, rep) => controller.export(req, rep))
23
25
 
24
26
  fastify.get('/api/users', {schema: schemas.paginateSchema}, (req, rep) => controller.paginate(req, rep))
@@ -0,0 +1,20 @@
1
+
2
+ import UserSessionController from "../controllers/UserSessionController.js";
3
+ import {CrudSchemaBuilder} from "@drax/crud-back";
4
+ import {UserSessionSchema, UserSessionBaseSchema} from '../schemas/UserSessionSchema.js'
5
+
6
+ async function UserSessionRoutes(fastify, options) {
7
+
8
+ const controller: UserSessionController = new UserSessionController()
9
+ const schemas = new CrudSchemaBuilder(UserSessionSchema, UserSessionBaseSchema,UserSessionBaseSchema, 'UserSession', 'openApi3', ['Identity']);
10
+
11
+ fastify.get('/api/user-sessions', {schema: schemas.paginateSchema}, (req,rep) => controller.paginate(req,rep))
12
+
13
+ fastify.get('/api/user-sessions/group-by', {schema: schemas.groupBySchema}, (req,rep) => controller.groupBy(req,rep))
14
+
15
+ fastify.get('/api/user-sessions/export', {schema: schemas.exportSchema}, (req,rep) => controller.export(req,rep))
16
+
17
+ }
18
+
19
+ export default UserSessionRoutes;
20
+ export {UserSessionRoutes}
@@ -5,6 +5,8 @@ const RoleBaseSchema = object({
5
5
  .min(1, "validation.required")
6
6
  .regex(/^[A-Z]/, "validation.startWithUpperCase"),
7
7
  permissions: array(string()).optional(),
8
+ icon: string().optional(),
9
+ color: string().optional(),
8
10
  childRoles: array(string()).optional(),
9
11
  })
10
12
 
@@ -12,6 +14,8 @@ const RoleSchema = RoleBaseSchema.extend({
12
14
  _id: string(),
13
15
  id: string().optional(),
14
16
  permissions: array(string()).optional(),
17
+ icon: string().optional(),
18
+ color: string().optional(),
15
19
  readonly: boolean(),
16
20
  childRoles: array(object({
17
21
  _id: string(),
@@ -0,0 +1,18 @@
1
+ import {z} from 'zod';
2
+
3
+
4
+ const UserLoginFailBaseSchema = z.object({
5
+ username: z.string().min(1, 'validation.required'),
6
+ userAgent: z.string().optional(),
7
+ ip: z.string().optional(),
8
+
9
+ });
10
+
11
+ const UserLoginFailSchema = UserLoginFailBaseSchema
12
+ .extend({
13
+ _id: z.string(),
14
+ createdAt: z.coerce.date().nullable().optional()
15
+ })
16
+
17
+ export default UserLoginFailSchema;
18
+ export {UserLoginFailSchema, UserLoginFailBaseSchema}
@@ -33,6 +33,8 @@ const UserSchema = UserBaseSchema
33
33
  _id: string(),
34
34
  id: string().optional(),
35
35
  name: string(),
36
+ icon: string().optional(),
37
+ color: string().optional(),
36
38
  permissions: array(string()),
37
39
  childRoles: array(object({_id: string(), name:string()})).optional()
38
40
  }).optional(),
@@ -0,0 +1,20 @@
1
+ import {z} from 'zod';
2
+
3
+
4
+ const UserSessionBaseSchema = z.object({
5
+ uuid: z.string().min(1, 'validation.required'),
6
+ user: z.string().min(1, 'validation.required'),
7
+ userAgent: z.string().optional(),
8
+ ip: z.string().optional(),
9
+
10
+ });
11
+
12
+ const UserSessionSchema = UserSessionBaseSchema
13
+ .extend({
14
+ _id: z.string(),
15
+ user: z.object({_id: z.string(), username: z.string()}),
16
+ createdAt: z.coerce.date().nullable().optional()
17
+ })
18
+
19
+ export default UserSessionSchema;
20
+ export {UserSessionSchema, UserSessionBaseSchema}
@@ -0,0 +1,16 @@
1
+
2
+ import type{IUserLoginFailRepository} from "../interfaces/IUserLoginFailRepository";
3
+ import type {IUserLoginFailBase, IUserLoginFail} from "@drax/identity-share";
4
+ import {AbstractService} from "@drax/crud-back";
5
+ import type {ZodObject, ZodRawShape} from "zod";
6
+
7
+ class UserLoginFailService extends AbstractService<IUserLoginFail, IUserLoginFailBase, IUserLoginFailBase> {
8
+
9
+ constructor(UserLoginFailRepository: IUserLoginFailRepository, schema?: ZodObject<ZodRawShape>) {
10
+ super(UserLoginFailRepository, schema);
11
+ }
12
+
13
+ }
14
+
15
+ export default UserLoginFailService
16
+ export {UserLoginFailService}
@@ -9,6 +9,8 @@ import BadCredentialsError from "../errors/BadCredentialsError.js";
9
9
  import {IDraxPaginateOptions, IDraxPaginateResult} from "@drax/crud-share";
10
10
  import {AbstractService} from "@drax/crud-back";
11
11
  import {randomUUID} from "crypto"
12
+ import UserLoginFailServiceFactory from "../factory/UserLoginFailServiceFactory.js";
13
+ import UserSessionServiceFactory from "../factory/UserSessionServiceFactory.js";
12
14
 
13
15
  class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate> {
14
16
 
@@ -20,16 +22,29 @@ class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate> {
20
22
  console.log("UserService constructor")
21
23
  }
22
24
 
23
- async auth(username: string, password: string) {
25
+ async auth(username: string, password: string, {userAgent, ip}) {
24
26
  let user = null
25
27
  console.log("auth username", username)
26
28
  user = await this.findByUsernameWithPassword(username)
27
29
  if (user && user.active && AuthUtils.checkPassword(password, user.password)) {
28
30
  //TODO: Generar session
29
- const session = randomUUID()
30
- const accessToken = AuthUtils.generateToken(user._id.toString(), user.username, user.role._id, user.tenant?._id, session)
31
+ const sessionUUID = randomUUID()
32
+ const sessionService = UserSessionServiceFactory()
33
+ await sessionService.create({
34
+ user:user._id.toString(),
35
+ uuid: sessionUUID,
36
+ userAgent: userAgent,
37
+ ip: ip
38
+ })
39
+ const accessToken = AuthUtils.generateToken(user._id.toString(), user.username, user.role._id, user.tenant?._id, sessionUUID)
31
40
  return {accessToken: accessToken}
32
41
  } else {
42
+ const userLoginFailService = UserLoginFailServiceFactory()
43
+ await userLoginFailService.create({
44
+ username: username,
45
+ userAgent: userAgent,
46
+ ip: ip
47
+ })
33
48
  throw new BadCredentialsError()
34
49
  }
35
50
  }
@@ -0,0 +1,16 @@
1
+
2
+ import type{IUserSessionRepository} from "../interfaces/IUserSessionRepository";
3
+ import type {IUserSessionBase, IUserSession} from "@drax/identity-share";
4
+ import {AbstractService} from "@drax/crud-back";
5
+ import type {ZodObject, ZodRawShape} from "zod";
6
+
7
+ class UserSessionService extends AbstractService<IUserSession, IUserSessionBase, IUserSessionBase> {
8
+
9
+ constructor(UserSessionRepository: IUserSessionRepository, schema?: ZodObject<ZodRawShape>) {
10
+ super(UserSessionRepository, schema);
11
+ }
12
+
13
+ }
14
+
15
+ export default UserSessionService
16
+ export {UserSessionService}