@drax/identity-back 0.34.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
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
|
+
|
package/src/models/RoleModel.ts
CHANGED
|
@@ -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
|
package/src/permissions/index.ts
CHANGED
|
@@ -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}
|
package/src/routes/UserRoutes.ts
CHANGED
|
@@ -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
|
|
30
|
-
const
|
|
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}
|