@drax/identity-back 0.11.4 → 0.12.1
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/RoleController.js +8 -39
- package/dist/controllers/TenantController.js +1 -28
- package/dist/controllers/UserApiKeyController.js +6 -3
- package/dist/controllers/UserController.js +48 -209
- package/dist/errors/BadCredentialsError.js +12 -0
- package/dist/factory/RoleServiceFactory.js +1 -0
- package/dist/factory/TenantServiceFactory.js +1 -0
- package/dist/factory/UserApiKeyServiceFactory.js +5 -4
- package/dist/factory/UserServiceFactory.js +1 -0
- package/dist/graphql/resolvers/role.resolvers.js +2 -2
- package/dist/graphql/resolvers/tenant.resolvers.js +2 -2
- package/dist/graphql/resolvers/user-api-key.resolvers.js +2 -2
- package/dist/graphql/resolvers/user.resolvers.js +1 -1
- package/dist/graphql/types/userApiKey.graphql +1 -0
- package/dist/index.js +6 -0
- package/dist/middleware/apiKeyMiddleware.js +2 -2
- package/dist/models/RoleModel.js +10 -7
- package/dist/models/TenantModel.js +11 -8
- package/dist/models/UserApiKeyModel.js +15 -7
- package/dist/models/UserGroupModel.js +7 -7
- package/dist/models/UserModel.js +10 -8
- package/dist/permissions/UserApiKeyPermissions.js +2 -1
- package/dist/rbac/Rbac.js +10 -8
- package/dist/repository/mongo/RoleMongoRepository.js +20 -65
- package/dist/repository/mongo/TenantMongoRepository.js +18 -66
- package/dist/repository/mongo/UserApiKeyMongoRepository.js +29 -44
- package/dist/repository/mongo/UserMongoRepository.js +56 -85
- package/dist/repository/sqlite/RoleSqliteRepository.js +30 -115
- package/dist/repository/sqlite/TenantSqliteRepository.js +15 -105
- package/dist/repository/sqlite/UserApiKeySqliteRepository.js +42 -115
- package/dist/repository/sqlite/UserSqliteRepository.js +49 -130
- package/dist/routes/RoleRoutes.js +35 -10
- package/dist/routes/TenantRoutes.js +18 -9
- package/dist/routes/UserApiKeyRoutes.js +20 -4
- package/dist/routes/UserRoutes.js +92 -17
- package/dist/schemas/LoginSchema.js +9 -0
- package/dist/schemas/PasswordSchema.js +12 -0
- package/dist/schemas/RegisterSchema.js +19 -0
- package/dist/schemas/RoleSchema.js +23 -0
- package/dist/schemas/TenantSchema.js +13 -0
- package/dist/schemas/UserApiKeySchema.js +14 -0
- package/dist/schemas/UserSchema.js +39 -0
- package/dist/services/PermissionService.js +5 -5
- package/dist/services/RoleService.js +6 -6
- package/dist/services/TenantService.js +6 -6
- package/dist/services/UserApiKeyService.js +5 -5
- package/dist/services/UserService.js +14 -14
- package/dist/setup/CreateOrUpdateRole.js +5 -2
- package/dist/setup/CreateUserIfNotExist.js +3 -1
- package/dist/setup/RecoveryUserPassword.js +1 -1
- package/dist/zod/EndpointZod.js +9 -0
- package/dist/zod/TenantSchema.js +12 -0
- package/dist/zod/TenantZod.js +5 -3
- package/dist/zod/UserApiKeyZod.js +7 -3
- package/package.json +10 -9
- package/src/controllers/RoleController.ts +8 -36
- package/src/controllers/TenantController.ts +2 -25
- package/src/controllers/UserApiKeyController.ts +8 -3
- package/src/controllers/UserController.ts +50 -183
- package/src/errors/BadCredentialsError.ts +18 -1
- package/src/factory/RoleServiceFactory.ts +1 -0
- package/src/factory/TenantServiceFactory.ts +1 -0
- package/src/factory/UserApiKeyServiceFactory.ts +5 -4
- package/src/factory/UserServiceFactory.ts +1 -0
- package/src/graphql/resolvers/role.resolvers.ts +3 -2
- package/src/graphql/resolvers/tenant.resolvers.ts +3 -2
- package/src/graphql/resolvers/user-api-key.resolvers.ts +3 -2
- package/src/graphql/resolvers/user.resolvers.ts +2 -1
- package/src/graphql/types/userApiKey.graphql +1 -0
- package/src/index.ts +16 -0
- package/src/interfaces/ITenantRepository.ts +2 -2
- package/src/interfaces/IUserApiKeyRepository.ts +2 -2
- package/src/interfaces/IUserRepository.ts +3 -2
- package/src/middleware/apiKeyMiddleware.ts +2 -2
- package/src/models/RoleModel.ts +12 -7
- package/src/models/TenantModel.ts +13 -8
- package/src/models/UserApiKeyModel.ts +17 -7
- package/src/models/UserGroupModel.ts +7 -7
- package/src/models/UserModel.ts +10 -8
- package/src/permissions/UserApiKeyPermissions.ts +2 -1
- package/src/rbac/Rbac.ts +12 -9
- package/src/repository/mongo/RoleMongoRepository.ts +23 -94
- package/src/repository/mongo/TenantMongoRepository.ts +19 -98
- package/src/repository/mongo/UserApiKeyMongoRepository.ts +31 -53
- package/src/repository/mongo/UserMongoRepository.ts +71 -130
- package/src/repository/sqlite/RoleSqliteRepository.ts +37 -146
- package/src/repository/sqlite/TenantSqliteRepository.ts +16 -156
- package/src/repository/sqlite/UserApiKeySqliteRepository.ts +46 -149
- package/src/repository/sqlite/UserSqliteRepository.ts +59 -173
- package/src/routes/RoleRoutes.ts +35 -12
- package/src/routes/TenantRoutes.ts +25 -9
- package/src/routes/UserApiKeyRoutes.ts +23 -7
- package/src/routes/UserRoutes.ts +117 -34
- package/src/schemas/LoginSchema.ts +12 -0
- package/src/schemas/PasswordSchema.ts +16 -0
- package/src/{zod/UserZod.ts → schemas/RegisterSchema.ts} +7 -10
- package/src/schemas/RoleSchema.ts +29 -0
- package/src/schemas/TenantSchema.ts +22 -0
- package/src/{zod/UserApiKeyZod.ts → schemas/UserApiKeySchema.ts} +8 -3
- package/src/schemas/UserSchema.ts +57 -0
- package/src/services/PermissionService.ts +6 -5
- package/src/services/RoleService.ts +6 -6
- package/src/services/TenantService.ts +10 -10
- package/src/services/UserApiKeyService.ts +5 -5
- package/src/services/UserService.ts +15 -16
- package/src/setup/CreateOrUpdateRole.ts +7 -4
- package/src/setup/CreateUserIfNotExist.ts +5 -3
- package/src/setup/RecoveryUserPassword.ts +1 -1
- package/test/data-obj/apikey/root-mongo-user-apikey.ts +2 -1
- package/test/data-obj/roles/admin-sqlite-role.ts +2 -2
- package/test/data-obj/roles/operator-sqlite-role.ts +1 -1
- package/test/data-obj/tenants/company-sqlite-tenant.ts +6 -0
- package/test/data-obj/users/root-sqlite-user.ts +2 -2
- package/test/initializers/RoleSqliteInitializer.ts +1 -1
- package/test/repository/mongo/role-mongo-repository.test.ts +3 -3
- package/test/repository/mongo/user-apikey-mongo-repository.test.ts +5 -4
- package/test/repository/mongo/user-mongo-repository.test.ts +4 -4
- package/test/repository/sqlite/role-sqlite-repository.test.ts +21 -9
- package/test/repository/sqlite/tenant-sqlite-repository.test.ts +74 -0
- package/test/repository/sqlite/user-sqlite-repository.test.ts +15 -9
- package/test/routes/data/admin-role.ts +10 -0
- package/test/routes/data/root-user.ts +13 -0
- package/test/routes/helpers/CreateRootUserAndAdminRole.ts +17 -0
- package/test/routes/helpers/FastifyTestServerFactory.ts +34 -0
- package/test/routes/helpers/InitializePermissions.ts +23 -0
- package/test/routes/helpers/SetupIdentityDrax.ts +22 -0
- package/test/routes/tenant-route.test.ts +336 -0
- package/test/routes/user-route.test.ts +186 -0
- package/test/schemas/lab-schema.test.ts +110 -0
- package/test/service/mock-service.test.ts +3 -3
- package/test/service/role-service.test.ts +3 -3
- package/test/service/user-service.test.ts +16 -25
- package/test.db +0 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/types/controllers/RoleController.d.ts +0 -1
- package/types/controllers/RoleController.d.ts.map +1 -1
- package/types/controllers/TenantController.d.ts +0 -1
- package/types/controllers/TenantController.d.ts.map +1 -1
- package/types/controllers/UserApiKeyController.d.ts.map +1 -1
- package/types/controllers/UserController.d.ts +11 -4
- package/types/controllers/UserController.d.ts.map +1 -1
- package/types/errors/BadCredentialsError.d.ts +9 -1
- package/types/errors/BadCredentialsError.d.ts.map +1 -1
- package/types/factory/RoleServiceFactory.d.ts.map +1 -1
- package/types/factory/TenantServiceFactory.d.ts.map +1 -1
- package/types/factory/UserApiKeyServiceFactory.d.ts.map +1 -1
- package/types/factory/UserServiceFactory.d.ts.map +1 -1
- package/types/graphql/resolvers/role.resolvers.d.ts +3 -9
- package/types/graphql/resolvers/role.resolvers.d.ts.map +1 -1
- package/types/graphql/resolvers/tenant.resolvers.d.ts +3 -9
- package/types/graphql/resolvers/tenant.resolvers.d.ts.map +1 -1
- package/types/graphql/resolvers/user-api-key.resolvers.d.ts +3 -9
- package/types/graphql/resolvers/user-api-key.resolvers.d.ts.map +1 -1
- package/types/graphql/resolvers/user.resolvers.d.ts +3 -9
- package/types/graphql/resolvers/user.resolvers.d.ts.map +1 -1
- package/types/index.d.ts +5 -1
- package/types/index.d.ts.map +1 -1
- package/types/interfaces/ITenantRepository.d.ts +2 -2
- package/types/interfaces/ITenantRepository.d.ts.map +1 -1
- package/types/interfaces/IUserApiKeyRepository.d.ts +2 -2
- package/types/interfaces/IUserApiKeyRepository.d.ts.map +1 -1
- package/types/interfaces/IUserRepository.d.ts +3 -2
- package/types/interfaces/IUserRepository.d.ts.map +1 -1
- package/types/models/RoleModel.d.ts +7 -7
- package/types/models/RoleModel.d.ts.map +1 -1
- package/types/models/TenantModel.d.ts +7 -7
- package/types/models/TenantModel.d.ts.map +1 -1
- package/types/models/UserApiKeyModel.d.ts +7 -7
- package/types/models/UserApiKeyModel.d.ts.map +1 -1
- package/types/models/UserGroupModel.d.ts +2 -2
- package/types/models/UserGroupModel.d.ts.map +1 -1
- package/types/models/UserModel.d.ts +7 -7
- package/types/models/UserModel.d.ts.map +1 -1
- package/types/permissions/UserApiKeyPermissions.d.ts +2 -1
- package/types/permissions/UserApiKeyPermissions.d.ts.map +1 -1
- package/types/permissions/index.d.ts +1 -0
- package/types/permissions/index.d.ts.map +1 -1
- package/types/rbac/Rbac.d.ts +1 -1
- package/types/rbac/Rbac.d.ts.map +1 -1
- package/types/repository/mongo/RoleMongoRepository.d.ts +9 -11
- package/types/repository/mongo/RoleMongoRepository.d.ts.map +1 -1
- package/types/repository/mongo/TenantMongoRepository.d.ts +8 -11
- package/types/repository/mongo/TenantMongoRepository.d.ts.map +1 -1
- package/types/repository/mongo/UserApiKeyMongoRepository.d.ts +12 -5
- package/types/repository/mongo/UserApiKeyMongoRepository.d.ts.map +1 -1
- package/types/repository/mongo/UserMongoRepository.d.ts +11 -12
- package/types/repository/mongo/UserMongoRepository.d.ts.map +1 -1
- package/types/repository/sqlite/RoleSqliteRepository.d.ts +14 -14
- package/types/repository/sqlite/RoleSqliteRepository.d.ts.map +1 -1
- package/types/repository/sqlite/TenantSqliteRepository.d.ts +12 -14
- package/types/repository/sqlite/TenantSqliteRepository.d.ts.map +1 -1
- package/types/repository/sqlite/UserApiKeySqliteRepository.d.ts +15 -11
- package/types/repository/sqlite/UserApiKeySqliteRepository.d.ts.map +1 -1
- package/types/repository/sqlite/UserSqliteRepository.d.ts +15 -12
- package/types/repository/sqlite/UserSqliteRepository.d.ts.map +1 -1
- package/types/routes/RoleRoutes.d.ts.map +1 -1
- package/types/routes/TenantRoutes.d.ts.map +1 -1
- package/types/routes/UserApiKeyRoutes.d.ts.map +1 -1
- package/types/routes/UserRoutes.d.ts.map +1 -1
- package/types/schemas/LoginSchema.d.ts +20 -0
- package/types/schemas/LoginSchema.d.ts.map +1 -0
- package/types/schemas/PasswordSchema.d.ts +27 -0
- package/types/schemas/PasswordSchema.d.ts.map +1 -0
- package/types/schemas/RegisterSchema.d.ts +32 -0
- package/types/schemas/RegisterSchema.d.ts.map +1 -0
- package/types/schemas/RoleSchema.d.ts +67 -0
- package/types/schemas/RoleSchema.d.ts.map +1 -0
- package/types/schemas/TenantSchema.d.ts +29 -0
- package/types/schemas/TenantSchema.d.ts.map +1 -0
- package/types/schemas/UserApiKeySchema.d.ts +39 -0
- package/types/schemas/UserApiKeySchema.d.ts.map +1 -0
- package/types/schemas/UserSchema.d.ts +161 -0
- package/types/schemas/UserSchema.d.ts.map +1 -0
- package/types/services/PermissionService.d.ts +1 -0
- package/types/services/PermissionService.d.ts.map +1 -1
- package/types/services/TenantService.d.ts +3 -3
- package/types/services/TenantService.d.ts.map +1 -1
- package/types/services/UserService.d.ts.map +1 -1
- package/types/setup/CreateOrUpdateRole.d.ts +2 -2
- package/types/setup/CreateOrUpdateRole.d.ts.map +1 -1
- package/types/setup/CreateUserIfNotExist.d.ts +2 -2
- package/types/setup/CreateUserIfNotExist.d.ts.map +1 -1
- package/types/zod/EndpointZod.d.ts +20 -0
- package/types/zod/EndpointZod.d.ts.map +1 -0
- package/types/zod/TenantSchema.d.ts +26 -0
- package/types/zod/TenantSchema.d.ts.map +1 -0
- package/types/zod/TenantZod.d.ts +13 -3
- package/types/zod/TenantZod.d.ts.map +1 -1
- package/types/zod/UserApiKeyZod.d.ts +23 -3
- package/types/zod/UserApiKeyZod.d.ts.map +1 -1
- package/types/zod/UserZod.d.ts +6 -6
- package/src/zod/RoleZod.ts +0 -14
- package/src/zod/TenantZod.ts +0 -14
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { UserModel } from "../../models/UserModel.js";
|
|
2
|
-
import { mongoose,
|
|
3
|
-
import { MongoServerError } from "mongodb";
|
|
2
|
+
import { mongoose, MongooseValidationErrorToValidationError, MongooseQueryFilter, MongooseSort, ValidationError, MongooseCastErrorToValidationError } from "@drax/common-back";
|
|
4
3
|
import RoleMongoRepository from "./RoleMongoRepository.js";
|
|
5
|
-
|
|
4
|
+
import { AbstractMongoRepository } from "@drax/crud-back";
|
|
5
|
+
class UserMongoRepository extends AbstractMongoRepository {
|
|
6
6
|
constructor() {
|
|
7
|
+
super();
|
|
7
8
|
this._searchFields = ['name', 'username', 'email', 'phone'];
|
|
9
|
+
this._populateFields = ['role', 'tenant'];
|
|
10
|
+
this._model = UserModel;
|
|
11
|
+
this._lean = false;
|
|
8
12
|
this.roleRepository = new RoleMongoRepository();
|
|
9
13
|
}
|
|
10
14
|
async create(userData) {
|
|
@@ -14,100 +18,76 @@ class UserMongoRepository {
|
|
|
14
18
|
}
|
|
15
19
|
const user = new UserModel(userData);
|
|
16
20
|
await user.save();
|
|
17
|
-
await user.populate(
|
|
21
|
+
await user.populate(this._populateFields);
|
|
18
22
|
return user;
|
|
19
23
|
}
|
|
20
24
|
catch (e) {
|
|
21
25
|
if (e instanceof mongoose.Error.ValidationError) {
|
|
22
|
-
throw
|
|
26
|
+
throw MongooseValidationErrorToValidationError(e);
|
|
23
27
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
async update(id, userData) {
|
|
28
|
-
try {
|
|
29
|
-
const user = await UserModel.findOneAndUpdate({ _id: id }, userData, { new: true }).populate(['role', 'tenant']).exec();
|
|
30
|
-
return user;
|
|
31
|
-
}
|
|
32
|
-
catch (e) {
|
|
33
|
-
if (e instanceof mongoose.Error.ValidationError) {
|
|
34
|
-
throw MongooseErrorToValidationError(e);
|
|
35
|
-
}
|
|
36
|
-
if (e instanceof MongoServerError || e.name === 'MongoServerError') {
|
|
37
|
-
throw MongoServerErrorToValidationError(e);
|
|
38
|
-
}
|
|
39
|
-
throw e;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
async updatePartial(id, data) {
|
|
43
|
-
try {
|
|
44
|
-
const item = await UserModel.findOneAndUpdate({ _id: id }, data, { new: true }).populate(['role', 'tenant']).exec();
|
|
45
|
-
return item;
|
|
46
|
-
}
|
|
47
|
-
catch (e) {
|
|
48
|
-
if (e instanceof mongoose.Error.ValidationError) {
|
|
49
|
-
throw MongooseErrorToValidationError(e);
|
|
28
|
+
if (e instanceof mongoose.Error.CastError) {
|
|
29
|
+
throw MongooseCastErrorToValidationError(e);
|
|
50
30
|
}
|
|
51
31
|
throw e;
|
|
52
32
|
}
|
|
53
33
|
}
|
|
54
|
-
async delete(id) {
|
|
55
|
-
const result = await UserModel.deleteOne({ _id: id }).exec();
|
|
56
|
-
return result.deletedCount == 1;
|
|
57
|
-
}
|
|
58
|
-
async findById(id) {
|
|
59
|
-
const user = await UserModel.findById(id).populate(['role', 'tenant']).exec();
|
|
60
|
-
return user;
|
|
61
|
-
}
|
|
62
34
|
async findByUsername(username) {
|
|
63
|
-
const user = await UserModel
|
|
35
|
+
const user = await UserModel
|
|
36
|
+
.findOne({ username: username })
|
|
37
|
+
.populate(['role', 'tenant'])
|
|
38
|
+
.lean(this._lean)
|
|
39
|
+
.exec();
|
|
64
40
|
return user;
|
|
65
41
|
}
|
|
66
42
|
async findByUsernameWithPassword(username) {
|
|
67
|
-
const user = await UserModel
|
|
43
|
+
const user = await UserModel
|
|
44
|
+
.findOne({ username: username })
|
|
45
|
+
.select('+password')
|
|
46
|
+
.populate(['role', 'tenant'])
|
|
47
|
+
.lean(this._lean)
|
|
48
|
+
.exec();
|
|
49
|
+
return user;
|
|
50
|
+
}
|
|
51
|
+
async findByIdWithPassword(id) {
|
|
52
|
+
const user = await UserModel.findById(id)
|
|
53
|
+
.select('+password')
|
|
54
|
+
.populate(['role', 'tenant'])
|
|
55
|
+
.lean(this._lean)
|
|
56
|
+
.exec();
|
|
68
57
|
return user;
|
|
69
58
|
}
|
|
70
59
|
async findByEmail(email) {
|
|
71
|
-
const user = await UserModel
|
|
60
|
+
const user = await UserModel
|
|
61
|
+
.findOne({ email: email })
|
|
62
|
+
.populate(['role', 'tenant'])
|
|
63
|
+
.lean(this._lean)
|
|
64
|
+
.exec();
|
|
72
65
|
return user;
|
|
73
66
|
}
|
|
74
67
|
async findByEmailCode(code) {
|
|
75
|
-
const user = await UserModel
|
|
68
|
+
const user = await UserModel
|
|
69
|
+
.findOne({ emailCode: { $eq: code }, emailVerified: { $eq: false } })
|
|
70
|
+
.populate(['role', 'tenant'])
|
|
71
|
+
.lean(this._lean)
|
|
72
|
+
.exec();
|
|
76
73
|
return user;
|
|
77
74
|
}
|
|
78
75
|
async findByPhoneCode(code) {
|
|
79
|
-
const user = await UserModel
|
|
76
|
+
const user = await UserModel
|
|
77
|
+
.findOne({ phoneCode: { $eq: code }, phoneVerified: { $eq: false } })
|
|
78
|
+
.populate(['role', 'tenant'])
|
|
79
|
+
.lean(this._lean)
|
|
80
|
+
.exec();
|
|
80
81
|
return user;
|
|
81
82
|
}
|
|
82
83
|
async findByRecoveryCode(code) {
|
|
83
|
-
const user = await UserModel
|
|
84
|
+
const user = await UserModel
|
|
85
|
+
.findOne({ recoveryCode: { $eq: code }, active: { $eq: true } })
|
|
86
|
+
.populate(['role', 'tenant'])
|
|
87
|
+
.lean(this._lean)
|
|
88
|
+
.exec();
|
|
84
89
|
return user;
|
|
85
90
|
}
|
|
86
|
-
async paginate({ page = 1, limit = 5, orderBy = '', order = false, search = '', filters = [] }) {
|
|
87
|
-
const query = {};
|
|
88
|
-
if (search) {
|
|
89
|
-
query['$or'] = this._searchFields.map(field => ({ [field]: new RegExp(search.toString(), 'i') }));
|
|
90
|
-
}
|
|
91
|
-
MongooseQueryFilter.applyFilters(query, filters);
|
|
92
|
-
const sort = MongooseSort.applySort(orderBy, order);
|
|
93
|
-
const options = { populate: ['role', 'tenant'], page, limit, sort };
|
|
94
|
-
const userPaginated = await UserModel.paginate(query, options);
|
|
95
|
-
return {
|
|
96
|
-
page: page,
|
|
97
|
-
limit: limit,
|
|
98
|
-
total: userPaginated.totalDocs,
|
|
99
|
-
items: userPaginated.docs
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
async search(value, limit = 1000, filters = []) {
|
|
103
|
-
const query = {};
|
|
104
|
-
if (value) {
|
|
105
|
-
query['$or'] = this._searchFields.map(field => ({ [field]: new RegExp(value.toString(), 'i') }));
|
|
106
|
-
}
|
|
107
|
-
MongooseQueryFilter.applyFilters(query, filters);
|
|
108
|
-
const items = await UserModel.find(query).limit(limit).exec();
|
|
109
|
-
return items;
|
|
110
|
-
}
|
|
111
91
|
async changePassword(id, password) {
|
|
112
92
|
try {
|
|
113
93
|
await UserModel.findOneAndUpdate({ _id: id }, { password }).exec();
|
|
@@ -128,24 +108,15 @@ class UserMongoRepository {
|
|
|
128
108
|
return false;
|
|
129
109
|
}
|
|
130
110
|
}
|
|
131
|
-
async find({ limit = 0, orderBy = '', order = false, search = '', filters = [] }) {
|
|
132
|
-
const query = {};
|
|
133
|
-
if (search) {
|
|
134
|
-
query['$or'] = [
|
|
135
|
-
{ name: new RegExp(search, 'i') },
|
|
136
|
-
];
|
|
137
|
-
}
|
|
138
|
-
MongooseQueryFilter.applyFilters(query, filters);
|
|
139
|
-
const sort = MongooseSort.applySort(orderBy, order);
|
|
140
|
-
return await UserModel.find(query).populate(['role', 'tenant']).limit(limit).sort(sort);
|
|
141
|
-
}
|
|
142
111
|
async findCursor({ limit = 0, orderBy = '', order = false, search = '', filters = [] }) {
|
|
143
|
-
console.log("RoleMongoRepository.findCursor called");
|
|
144
112
|
const query = {};
|
|
145
113
|
if (search) {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
114
|
+
if (mongoose.Types.ObjectId.isValid(search)) {
|
|
115
|
+
query['_id'] = new mongoose.Types.ObjectId(search);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
query['$or'] = this._searchFields.map(field => ({ [field]: new RegExp(search.toString(), 'i') }));
|
|
119
|
+
}
|
|
149
120
|
}
|
|
150
121
|
MongooseQueryFilter.applyFilters(query, filters);
|
|
151
122
|
const sort = MongooseSort.applySort(orderBy, order);
|
|
@@ -1,25 +1,23 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
import { SqliteErrorToValidationError, SqliteTableBuilder, SqlQueryFilter, SqlSort } from "@drax/common-back";
|
|
4
|
-
const tableFields = [
|
|
5
|
-
{ name: "name", type: "TEXT", unique: true, primary: false },
|
|
6
|
-
{ name: "permissions", type: "TEXT", unique: false, primary: false },
|
|
7
|
-
{ name: "childRoles", type: "TEXT", unique: false, primary: false },
|
|
8
|
-
{ name: "readonly", type: "INTEGER", unique: false, primary: false },
|
|
9
|
-
{ name: "createdAt", type: "TEXT", unique: false, primary: false },
|
|
10
|
-
{ name: "updatedAt", type: "TEXT", unique: false, primary: false },
|
|
11
|
-
];
|
|
12
|
-
class RoleSqliteRepository {
|
|
1
|
+
import { AbstractSqliteRepository } from "@drax/crud-back";
|
|
2
|
+
class RoleSqliteRepository extends AbstractSqliteRepository {
|
|
13
3
|
constructor(dataBaseFile, verbose = false) {
|
|
14
|
-
|
|
15
|
-
this.
|
|
16
|
-
this.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
4
|
+
super(dataBaseFile, verbose);
|
|
5
|
+
this.tableName = 'roles';
|
|
6
|
+
this.searchFields = [];
|
|
7
|
+
this.booleanFields = [];
|
|
8
|
+
this.identifier = '_id';
|
|
9
|
+
this.populateFields = [];
|
|
10
|
+
this.tableFields = [
|
|
11
|
+
{ name: "name", type: "TEXT", unique: true, primary: false },
|
|
12
|
+
{ name: "permissions", type: "TEXT", unique: false, primary: false },
|
|
13
|
+
{ name: "childRoles", type: "TEXT", unique: false, primary: false },
|
|
14
|
+
{ name: "readonly", type: "INTEGER", unique: false, primary: false },
|
|
15
|
+
{ name: "createdAt", type: "TEXT", unique: false, primary: false },
|
|
16
|
+
{ name: "updatedAt", type: "TEXT", unique: false, primary: false },
|
|
17
|
+
];
|
|
18
|
+
this.tableName = 'roles';
|
|
19
|
+
}
|
|
20
|
+
async prepareData(roleData) {
|
|
23
21
|
roleData.readonly = roleData.readonly ? 1 : 0;
|
|
24
22
|
if (roleData.permissions && Array.isArray(roleData.permissions)) {
|
|
25
23
|
roleData.permissions = roleData.permissions.join(",");
|
|
@@ -28,116 +26,33 @@ class RoleSqliteRepository {
|
|
|
28
26
|
roleData.childRoles = roleData.childRoles.join(",");
|
|
29
27
|
}
|
|
30
28
|
}
|
|
31
|
-
async
|
|
32
|
-
try {
|
|
33
|
-
if (!roleData.id) {
|
|
34
|
-
roleData.id = randomUUID();
|
|
35
|
-
}
|
|
36
|
-
this.normalizeData(roleData);
|
|
37
|
-
roleData.createdAt = (new Date().toISOString());
|
|
38
|
-
const fields = Object.keys(roleData)
|
|
39
|
-
.map(field => `${field}`)
|
|
40
|
-
.join(', ');
|
|
41
|
-
const values = Object.keys(roleData)
|
|
42
|
-
.map(field => `@${field}`)
|
|
43
|
-
.join(', ');
|
|
44
|
-
const stmt = this.db.prepare(`INSERT INTO roles (${fields}) VALUES (${values})`);
|
|
45
|
-
stmt.run(roleData);
|
|
46
|
-
return this.findById(roleData.id);
|
|
47
|
-
}
|
|
48
|
-
catch (e) {
|
|
49
|
-
console.log(e);
|
|
50
|
-
throw SqliteErrorToValidationError(e, roleData);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
async update(id, roleData) {
|
|
54
|
-
try {
|
|
55
|
-
this.normalizeData(roleData);
|
|
56
|
-
roleData.updatedAt = (new Date().toISOString());
|
|
57
|
-
const setClauses = Object.keys(roleData)
|
|
58
|
-
.map(field => `${field} = @${field}`)
|
|
59
|
-
.join(', ');
|
|
60
|
-
roleData.id = id;
|
|
61
|
-
const stmt = this.db.prepare(`UPDATE roles SET ${setClauses} WHERE id = @id `);
|
|
62
|
-
stmt.run(roleData);
|
|
63
|
-
return this.findById(id);
|
|
64
|
-
}
|
|
65
|
-
catch (e) {
|
|
66
|
-
console.log(e);
|
|
67
|
-
throw SqliteErrorToValidationError(e, roleData);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
async paginate({ page = 1, limit = 5, orderBy = '', order = false, search = '', filters = [] }) {
|
|
71
|
-
const offset = page > 1 ? (page - 1) * limit : 0;
|
|
72
|
-
let where = "";
|
|
73
|
-
if (search) {
|
|
74
|
-
where = ` WHERE name LIKE '%${search}%'`;
|
|
75
|
-
}
|
|
76
|
-
where = SqlQueryFilter.applyFilters(where, filters);
|
|
77
|
-
const sort = SqlSort.applySort(orderBy, order);
|
|
78
|
-
const rCount = this.db.prepare('SELECT COUNT(*) as count FROM roles' + where).get();
|
|
79
|
-
where += sort;
|
|
80
|
-
const roles = this.db.prepare('SELECT * FROM roles ' + where + ' LIMIT ? OFFSET ?').all([limit, offset]);
|
|
81
|
-
for (const role of roles) {
|
|
82
|
-
await this.populateRole(role);
|
|
83
|
-
}
|
|
84
|
-
return {
|
|
85
|
-
page: page,
|
|
86
|
-
limit: limit,
|
|
87
|
-
total: rCount.count,
|
|
88
|
-
items: roles
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
async delete(id) {
|
|
92
|
-
const stmt = this.db.prepare('DELETE FROM roles WHERE id = ?');
|
|
93
|
-
stmt.run(id);
|
|
94
|
-
return true;
|
|
95
|
-
}
|
|
96
|
-
async deleteAll() {
|
|
97
|
-
const stmt = this.db.prepare('DELETE FROM roles');
|
|
98
|
-
stmt.run();
|
|
99
|
-
return true;
|
|
100
|
-
}
|
|
101
|
-
async findById(id) {
|
|
102
|
-
const role = this.db.prepare('SELECT * FROM roles WHERE id = ?').get(id);
|
|
29
|
+
async prepareItem(role) {
|
|
103
30
|
if (role) {
|
|
104
|
-
|
|
31
|
+
role.permissions = role && role.permissions ? role.permissions.split(",") : [];
|
|
32
|
+
role.childRoles = role && role.childRoles ? role.childRoles.split(",") : [];
|
|
33
|
+
const childRoles = [];
|
|
34
|
+
for (const childRoleId of role.childRoles) {
|
|
35
|
+
const childRole = await this.findWithoutPopulateById(childRoleId);
|
|
36
|
+
childRoles.push(childRole);
|
|
37
|
+
}
|
|
38
|
+
role.childRoles = childRoles;
|
|
105
39
|
return role;
|
|
106
40
|
}
|
|
107
|
-
return undefined;
|
|
108
41
|
}
|
|
109
42
|
async findByName(name) {
|
|
110
43
|
const role = this.db.prepare('SELECT * FROM roles WHERE name = ?').get(name);
|
|
111
44
|
if (role) {
|
|
112
|
-
await this.
|
|
45
|
+
await this.decorate(role);
|
|
113
46
|
return role;
|
|
114
47
|
}
|
|
115
48
|
return undefined;
|
|
116
49
|
}
|
|
117
|
-
async fetchAll() {
|
|
118
|
-
const roles = this.db.prepare('SELECT * FROM roles').all();
|
|
119
|
-
for (const role of roles) {
|
|
120
|
-
await this.populateRole(role);
|
|
121
|
-
}
|
|
122
|
-
return roles;
|
|
123
|
-
}
|
|
124
50
|
async findWithoutPopulateById(id) {
|
|
125
|
-
const role = this.db.prepare(
|
|
51
|
+
const role = this.db.prepare(`SELECT * FROM roles WHERE ${this.identifier} = ?`).get(id);
|
|
126
52
|
if (role) {
|
|
127
53
|
return role;
|
|
128
54
|
}
|
|
129
55
|
return undefined;
|
|
130
56
|
}
|
|
131
|
-
async populateRole(role) {
|
|
132
|
-
role.permissions = role.permissions ? role.permissions.split(",") : [];
|
|
133
|
-
role.childRoles = role.childRoles ? role.childRoles.split(",") : [];
|
|
134
|
-
const childRoles = [];
|
|
135
|
-
for (const childRoleId of role.childRoles) {
|
|
136
|
-
const childRole = await this.findWithoutPopulateById(childRoleId);
|
|
137
|
-
childRoles.push(childRole);
|
|
138
|
-
}
|
|
139
|
-
role.childRoles = childRoles;
|
|
140
|
-
return role;
|
|
141
|
-
}
|
|
142
57
|
}
|
|
143
58
|
export default RoleSqliteRepository;
|
|
@@ -1,111 +1,21 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
table() {
|
|
16
|
-
const builder = new SqliteTableBuilder(this.dataBaseFile, 'tenants', tableFields, false);
|
|
17
|
-
builder.build('id');
|
|
18
|
-
}
|
|
19
|
-
async create(tenantData) {
|
|
20
|
-
try {
|
|
21
|
-
if (!tenantData.id) {
|
|
22
|
-
tenantData.id = randomUUID();
|
|
23
|
-
}
|
|
24
|
-
tenantData.createdAt = (new Date().toISOString());
|
|
25
|
-
const fields = Object.keys(tenantData)
|
|
26
|
-
.map(field => `${field}`)
|
|
27
|
-
.join(', ');
|
|
28
|
-
const values = Object.keys(tenantData)
|
|
29
|
-
.map(field => `@${field}`)
|
|
30
|
-
.join(', ');
|
|
31
|
-
const stmt = this.db.prepare(`INSERT INTO tenants (${fields}) VALUES (${values})`);
|
|
32
|
-
stmt.run(tenantData);
|
|
33
|
-
return this.findById(tenantData.id);
|
|
34
|
-
}
|
|
35
|
-
catch (e) {
|
|
36
|
-
console.log(e);
|
|
37
|
-
throw SqliteErrorToValidationError(e, tenantData);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
async findById(id) {
|
|
41
|
-
const tenant = this.db.prepare('SELECT * FROM tenants WHERE id = ?').get(id);
|
|
42
|
-
return tenant;
|
|
1
|
+
import { AbstractSqliteRepository } from "@drax/crud-back";
|
|
2
|
+
class TenantSqliteRepository extends AbstractSqliteRepository {
|
|
3
|
+
constructor() {
|
|
4
|
+
super(...arguments);
|
|
5
|
+
this.tableName = 'tenants';
|
|
6
|
+
this.searchFields = [];
|
|
7
|
+
this.booleanFields = [];
|
|
8
|
+
this.identifier = '_id';
|
|
9
|
+
this.populateFields = [];
|
|
10
|
+
this.tableFields = [
|
|
11
|
+
{ name: "name", type: "TEXT", unique: false, primary: false },
|
|
12
|
+
{ name: "createdAt", type: "TEXT", unique: false, primary: false },
|
|
13
|
+
{ name: "updatedAt", type: "TEXT", unique: false, primary: false },
|
|
14
|
+
];
|
|
43
15
|
}
|
|
44
16
|
async findByName(name) {
|
|
45
|
-
const tenant = this.db.prepare(
|
|
17
|
+
const tenant = this.db.prepare(`SELECT * FROM ${this.tableName} WHERE name = ?`).get(name);
|
|
46
18
|
return tenant;
|
|
47
19
|
}
|
|
48
|
-
async update(id, tenantData) {
|
|
49
|
-
try {
|
|
50
|
-
tenantData.updatedAt = (new Date().toISOString());
|
|
51
|
-
const setClauses = Object.keys(tenantData)
|
|
52
|
-
.map(field => `${field} = @${field}`)
|
|
53
|
-
.join(', ');
|
|
54
|
-
tenantData.id = id;
|
|
55
|
-
const stmt = this.db.prepare(`UPDATE tenants SET ${setClauses} WHERE id = @id `);
|
|
56
|
-
stmt.run(tenantData);
|
|
57
|
-
return this.findById(id);
|
|
58
|
-
}
|
|
59
|
-
catch (e) {
|
|
60
|
-
console.log(e);
|
|
61
|
-
throw SqliteErrorToValidationError(e, tenantData);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
async delete(id) {
|
|
65
|
-
const stmt = this.db.prepare('DELETE FROM tenants WHERE id = ?');
|
|
66
|
-
stmt.run(id);
|
|
67
|
-
return true;
|
|
68
|
-
}
|
|
69
|
-
async deleteAll() {
|
|
70
|
-
const stmt = this.db.prepare('DELETE FROM tenants');
|
|
71
|
-
stmt.run();
|
|
72
|
-
return true;
|
|
73
|
-
}
|
|
74
|
-
async fetchAll() {
|
|
75
|
-
const tenants = this.db.prepare('SELECT * FROM tenants').all();
|
|
76
|
-
for (const tenant of tenants) {
|
|
77
|
-
tenant.permissions = tenant.permissions ? tenant.permissions.split(",") : [];
|
|
78
|
-
}
|
|
79
|
-
return tenants;
|
|
80
|
-
}
|
|
81
|
-
async paginate({ page = 1, limit = 5, orderBy = '', order = false, search = '', filters = [] }) {
|
|
82
|
-
const offset = page > 1 ? (page - 1) * limit : 0;
|
|
83
|
-
let where = "";
|
|
84
|
-
if (search) {
|
|
85
|
-
where = ` WHERE name LIKE '%${search}%'`;
|
|
86
|
-
}
|
|
87
|
-
where = SqlQueryFilter.applyFilters(where, filters);
|
|
88
|
-
const sort = SqlSort.applySort(orderBy, order);
|
|
89
|
-
const rCount = this.db.prepare('SELECT COUNT(*) as count FROM tenants' + where).get();
|
|
90
|
-
where += sort;
|
|
91
|
-
const tenants = this.db.prepare('SELECT * FROM tenants ' + where + ' LIMIT ? OFFSET ?').all([limit, offset]);
|
|
92
|
-
return {
|
|
93
|
-
page: page,
|
|
94
|
-
limit: limit,
|
|
95
|
-
total: rCount.count,
|
|
96
|
-
items: tenants
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
async find({ limit = 0, orderBy = '', order = false, search = '', filters = [] }) {
|
|
100
|
-
let where = "";
|
|
101
|
-
if (search) {
|
|
102
|
-
where = ` WHERE name LIKE '%${search}%'`;
|
|
103
|
-
}
|
|
104
|
-
where = SqlQueryFilter.applyFilters(where, filters);
|
|
105
|
-
const sort = SqlSort.applySort(orderBy, order);
|
|
106
|
-
where += sort;
|
|
107
|
-
const tenants = this.db.prepare('SELECT * FROM tenants ' + where).all();
|
|
108
|
-
return tenants;
|
|
109
|
-
}
|
|
110
20
|
}
|
|
111
21
|
export default TenantSqliteRepository;
|
|
@@ -1,135 +1,62 @@
|
|
|
1
1
|
import sqlite from "better-sqlite3";
|
|
2
|
-
import { randomUUID } from "node:crypto";
|
|
3
|
-
import { SqliteErrorToValidationError, SqliteTableBuilder, SqlQueryFilter, SqlSort } from "@drax/common-back";
|
|
4
2
|
import UserSqliteRepository from "./UserSqliteRepository.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
{ name: "name", type: "TEXT", unique: false, primary: false },
|
|
8
|
-
{ name: "user", type: "TEXT", unique: false, primary: false },
|
|
9
|
-
{ name: "ipv4", type: "TEXT", unique: false, primary: false },
|
|
10
|
-
{ name: "ipv6", type: "TEXT", unique: false, primary: false },
|
|
11
|
-
{ name: "createdAt", type: "TEXT", unique: false, primary: false }
|
|
12
|
-
];
|
|
13
|
-
class UserApiKeySqliteRepository {
|
|
3
|
+
import { AbstractSqliteRepository } from "@drax/crud-back";
|
|
4
|
+
class UserApiKeySqliteRepository extends AbstractSqliteRepository {
|
|
14
5
|
constructor(dataBaseFile, verbose = false) {
|
|
6
|
+
super(dataBaseFile, verbose);
|
|
7
|
+
this.tableName = 'user_api_keys';
|
|
8
|
+
this.searchFields = [];
|
|
9
|
+
this.booleanFields = [];
|
|
10
|
+
this.identifier = '_id';
|
|
11
|
+
this.populateFields = [];
|
|
12
|
+
this.tableFields = [
|
|
13
|
+
{ name: "secret", type: "TEXT", unique: true, primary: false },
|
|
14
|
+
{ name: "name", type: "TEXT", unique: false, primary: false },
|
|
15
|
+
{ name: "user", type: "TEXT", unique: false, primary: false },
|
|
16
|
+
{ name: "ipv4", type: "TEXT", unique: false, primary: false },
|
|
17
|
+
{ name: "ipv6", type: "TEXT", unique: false, primary: false },
|
|
18
|
+
{ name: "createdBy", type: "TEXT", unique: false, primary: false },
|
|
19
|
+
{ name: "createdAt", type: "TEXT", unique: false, primary: false }
|
|
20
|
+
];
|
|
15
21
|
this.dataBaseFile = dataBaseFile;
|
|
16
22
|
this.userRepository = new UserSqliteRepository(dataBaseFile, verbose);
|
|
17
23
|
this.db = new sqlite(dataBaseFile, { verbose: verbose ? console.log : null });
|
|
18
|
-
this.table();
|
|
19
24
|
}
|
|
20
25
|
async findUserById(id) {
|
|
21
26
|
return await this.userRepository.findById(id);
|
|
22
27
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
async create(userApiKeyData) {
|
|
28
|
-
try {
|
|
29
|
-
if (!userApiKeyData.id) {
|
|
30
|
-
userApiKeyData.id = randomUUID();
|
|
31
|
-
}
|
|
32
|
-
if (userApiKeyData.ipv4 && Array.isArray(userApiKeyData.ipv4) && userApiKeyData.ipv4.length > 0) {
|
|
33
|
-
userApiKeyData.ipv4 = userApiKeyData.ipv4.join(',');
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
userApiKeyData.ipv4 = "";
|
|
37
|
-
}
|
|
38
|
-
if (userApiKeyData.ipv6 && Array.isArray(userApiKeyData.ipv6) && userApiKeyData.ipv6.length > 0) {
|
|
39
|
-
userApiKeyData.ipv6 = userApiKeyData.ipv6.join(',');
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
userApiKeyData.ipv6 = "";
|
|
43
|
-
}
|
|
44
|
-
userApiKeyData.createdAt = (new Date().toISOString());
|
|
45
|
-
const fields = Object.keys(userApiKeyData)
|
|
46
|
-
.map(field => `${field}`)
|
|
47
|
-
.join(', ');
|
|
48
|
-
const values = Object.keys(userApiKeyData)
|
|
49
|
-
.map(field => `@${field}`)
|
|
50
|
-
.join(', ');
|
|
51
|
-
const stmt = this.db.prepare(`INSERT INTO user_api_keys (${fields})
|
|
52
|
-
VALUES (${values})`);
|
|
53
|
-
stmt.run(userApiKeyData);
|
|
54
|
-
return this.findById(userApiKeyData.id);
|
|
28
|
+
async prepareItem(item) {
|
|
29
|
+
if (item && item.user) {
|
|
30
|
+
item.user = await this.findUserById(item.user);
|
|
55
31
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
throw SqliteErrorToValidationError(e, userApiKeyData);
|
|
32
|
+
if (item && item.createdBy) {
|
|
33
|
+
item.createdBy = await this.findUserById(item.createdBy);
|
|
59
34
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const userApiKey = this.db.prepare('SELECT * FROM user_api_keys WHERE id = ?').get(id);
|
|
63
|
-
userApiKey.ipv4 = userApiKey.ipv4 != "" ? userApiKey.ipv4.split(',') : [];
|
|
64
|
-
userApiKey.ipv6 = userApiKey.ipv6 != "" ? userApiKey.ipv6.split(',') : [];
|
|
65
|
-
userApiKey.user = await this.findUserById(userApiKey.user);
|
|
66
|
-
return userApiKey;
|
|
67
|
-
}
|
|
68
|
-
async findBySecret(secret) {
|
|
69
|
-
const userApiKey = this.db.prepare('SELECT * FROM user_api_keys WHERE secret = ?').get(secret);
|
|
70
|
-
userApiKey.ipv4 = userApiKey.ipv4 != "" ? userApiKey.ipv4.split(',') : [];
|
|
71
|
-
userApiKey.ipv6 = userApiKey.ipv6 != "" ? userApiKey.ipv6.split(',') : [];
|
|
72
|
-
userApiKey.user = await this.findUserById(userApiKey.user);
|
|
73
|
-
return userApiKey;
|
|
74
|
-
}
|
|
75
|
-
async update(id, userApiKeyData) {
|
|
76
|
-
try {
|
|
77
|
-
if (userApiKeyData.ipv4 && Array.isArray(userApiKeyData.ipv4) && userApiKeyData.ipv4.length > 0) {
|
|
78
|
-
userApiKeyData.ipv4 = userApiKeyData.ipv4.join(',');
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
userApiKeyData.ipv4 = "";
|
|
82
|
-
}
|
|
83
|
-
if (userApiKeyData.ipv6 && Array.isArray(userApiKeyData.ipv6) && userApiKeyData.ipv6.length > 0) {
|
|
84
|
-
userApiKeyData.ipv6 = userApiKeyData.ipv6.join(',');
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
userApiKeyData.ipv6 = "";
|
|
88
|
-
}
|
|
89
|
-
delete userApiKeyData.secret;
|
|
90
|
-
const setClauses = Object.keys(userApiKeyData)
|
|
91
|
-
.map(field => `${field} = @${field}`)
|
|
92
|
-
.join(', ');
|
|
93
|
-
userApiKeyData.id = id;
|
|
94
|
-
const stmt = this.db.prepare(`UPDATE user_api_keys
|
|
95
|
-
SET ${setClauses}
|
|
96
|
-
WHERE id = @id `);
|
|
97
|
-
stmt.run(userApiKeyData);
|
|
98
|
-
return this.findById(id);
|
|
35
|
+
if (item && item.ipv4) {
|
|
36
|
+
item.ipv4 = item.ipv4 != "" ? item.ipv4.split(',') : [];
|
|
99
37
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
throw SqliteErrorToValidationError(e, userApiKeyData);
|
|
38
|
+
if (item && item.ipv6) {
|
|
39
|
+
item.ipv6 = item.ipv6 != "" ? item.ipv6.split(',') : [];
|
|
103
40
|
}
|
|
104
41
|
}
|
|
105
|
-
async
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const offset = page > 1 ? (page - 1) * limit : 0;
|
|
112
|
-
let where = "";
|
|
113
|
-
if (search) {
|
|
114
|
-
where = ` WHERE name LIKE '%${search}%'`;
|
|
42
|
+
async prepareData(userApiKeyData) {
|
|
43
|
+
if (userApiKeyData.ipv4 && Array.isArray(userApiKeyData.ipv4) && userApiKeyData.ipv4.length > 0) {
|
|
44
|
+
userApiKeyData.ipv4 = userApiKeyData.ipv4.join(',');
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
userApiKeyData.ipv4 = "";
|
|
115
48
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
console.log("where", where);
|
|
119
|
-
const rCount = this.db.prepare('SELECT COUNT(*) as count FROM user_api_keys' + where).get();
|
|
120
|
-
where += sort;
|
|
121
|
-
const userApiKeys = this.db.prepare('SELECT * FROM user_api_keys ' + where + ' LIMIT ? OFFSET ?').all([limit, offset]);
|
|
122
|
-
for (const userApiKey of userApiKeys) {
|
|
123
|
-
userApiKey.ipv4 = userApiKey.ipv4 != "" ? userApiKey.ipv4.split(',') : [];
|
|
124
|
-
userApiKey.ipv6 = userApiKey.ipv6 != "" ? userApiKey.ipv6.split(',') : [];
|
|
125
|
-
userApiKey.user = await this.findUserById(userApiKey.user);
|
|
49
|
+
if (userApiKeyData.ipv6 && Array.isArray(userApiKeyData.ipv6) && userApiKeyData.ipv6.length > 0) {
|
|
50
|
+
userApiKeyData.ipv6 = userApiKeyData.ipv6.join(',');
|
|
126
51
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
52
|
+
else {
|
|
53
|
+
userApiKeyData.ipv6 = "";
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async findBySecret(secret) {
|
|
57
|
+
const userApiKey = this.db.prepare('SELECT * FROM user_api_keys WHERE secret = ?').get(secret);
|
|
58
|
+
await this.decorate(userApiKey);
|
|
59
|
+
return userApiKey;
|
|
133
60
|
}
|
|
134
61
|
}
|
|
135
62
|
export default UserApiKeySqliteRepository;
|