@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.
Files changed (233) hide show
  1. package/dist/controllers/RoleController.js +8 -39
  2. package/dist/controllers/TenantController.js +1 -28
  3. package/dist/controllers/UserApiKeyController.js +6 -3
  4. package/dist/controllers/UserController.js +48 -209
  5. package/dist/errors/BadCredentialsError.js +12 -0
  6. package/dist/factory/RoleServiceFactory.js +1 -0
  7. package/dist/factory/TenantServiceFactory.js +1 -0
  8. package/dist/factory/UserApiKeyServiceFactory.js +5 -4
  9. package/dist/factory/UserServiceFactory.js +1 -0
  10. package/dist/graphql/resolvers/role.resolvers.js +2 -2
  11. package/dist/graphql/resolvers/tenant.resolvers.js +2 -2
  12. package/dist/graphql/resolvers/user-api-key.resolvers.js +2 -2
  13. package/dist/graphql/resolvers/user.resolvers.js +1 -1
  14. package/dist/graphql/types/userApiKey.graphql +1 -0
  15. package/dist/index.js +6 -0
  16. package/dist/middleware/apiKeyMiddleware.js +2 -2
  17. package/dist/models/RoleModel.js +10 -7
  18. package/dist/models/TenantModel.js +11 -8
  19. package/dist/models/UserApiKeyModel.js +15 -7
  20. package/dist/models/UserGroupModel.js +7 -7
  21. package/dist/models/UserModel.js +10 -8
  22. package/dist/permissions/UserApiKeyPermissions.js +2 -1
  23. package/dist/rbac/Rbac.js +10 -8
  24. package/dist/repository/mongo/RoleMongoRepository.js +20 -65
  25. package/dist/repository/mongo/TenantMongoRepository.js +18 -66
  26. package/dist/repository/mongo/UserApiKeyMongoRepository.js +29 -44
  27. package/dist/repository/mongo/UserMongoRepository.js +56 -85
  28. package/dist/repository/sqlite/RoleSqliteRepository.js +30 -115
  29. package/dist/repository/sqlite/TenantSqliteRepository.js +15 -105
  30. package/dist/repository/sqlite/UserApiKeySqliteRepository.js +42 -115
  31. package/dist/repository/sqlite/UserSqliteRepository.js +49 -130
  32. package/dist/routes/RoleRoutes.js +35 -10
  33. package/dist/routes/TenantRoutes.js +18 -9
  34. package/dist/routes/UserApiKeyRoutes.js +20 -4
  35. package/dist/routes/UserRoutes.js +92 -17
  36. package/dist/schemas/LoginSchema.js +9 -0
  37. package/dist/schemas/PasswordSchema.js +12 -0
  38. package/dist/schemas/RegisterSchema.js +19 -0
  39. package/dist/schemas/RoleSchema.js +23 -0
  40. package/dist/schemas/TenantSchema.js +13 -0
  41. package/dist/schemas/UserApiKeySchema.js +14 -0
  42. package/dist/schemas/UserSchema.js +39 -0
  43. package/dist/services/PermissionService.js +5 -5
  44. package/dist/services/RoleService.js +6 -6
  45. package/dist/services/TenantService.js +6 -6
  46. package/dist/services/UserApiKeyService.js +5 -5
  47. package/dist/services/UserService.js +14 -14
  48. package/dist/setup/CreateOrUpdateRole.js +5 -2
  49. package/dist/setup/CreateUserIfNotExist.js +3 -1
  50. package/dist/setup/RecoveryUserPassword.js +1 -1
  51. package/dist/zod/EndpointZod.js +9 -0
  52. package/dist/zod/TenantSchema.js +12 -0
  53. package/dist/zod/TenantZod.js +5 -3
  54. package/dist/zod/UserApiKeyZod.js +7 -3
  55. package/package.json +10 -9
  56. package/src/controllers/RoleController.ts +8 -36
  57. package/src/controllers/TenantController.ts +2 -25
  58. package/src/controllers/UserApiKeyController.ts +8 -3
  59. package/src/controllers/UserController.ts +50 -183
  60. package/src/errors/BadCredentialsError.ts +18 -1
  61. package/src/factory/RoleServiceFactory.ts +1 -0
  62. package/src/factory/TenantServiceFactory.ts +1 -0
  63. package/src/factory/UserApiKeyServiceFactory.ts +5 -4
  64. package/src/factory/UserServiceFactory.ts +1 -0
  65. package/src/graphql/resolvers/role.resolvers.ts +3 -2
  66. package/src/graphql/resolvers/tenant.resolvers.ts +3 -2
  67. package/src/graphql/resolvers/user-api-key.resolvers.ts +3 -2
  68. package/src/graphql/resolvers/user.resolvers.ts +2 -1
  69. package/src/graphql/types/userApiKey.graphql +1 -0
  70. package/src/index.ts +16 -0
  71. package/src/interfaces/ITenantRepository.ts +2 -2
  72. package/src/interfaces/IUserApiKeyRepository.ts +2 -2
  73. package/src/interfaces/IUserRepository.ts +3 -2
  74. package/src/middleware/apiKeyMiddleware.ts +2 -2
  75. package/src/models/RoleModel.ts +12 -7
  76. package/src/models/TenantModel.ts +13 -8
  77. package/src/models/UserApiKeyModel.ts +17 -7
  78. package/src/models/UserGroupModel.ts +7 -7
  79. package/src/models/UserModel.ts +10 -8
  80. package/src/permissions/UserApiKeyPermissions.ts +2 -1
  81. package/src/rbac/Rbac.ts +12 -9
  82. package/src/repository/mongo/RoleMongoRepository.ts +23 -94
  83. package/src/repository/mongo/TenantMongoRepository.ts +19 -98
  84. package/src/repository/mongo/UserApiKeyMongoRepository.ts +31 -53
  85. package/src/repository/mongo/UserMongoRepository.ts +71 -130
  86. package/src/repository/sqlite/RoleSqliteRepository.ts +37 -146
  87. package/src/repository/sqlite/TenantSqliteRepository.ts +16 -156
  88. package/src/repository/sqlite/UserApiKeySqliteRepository.ts +46 -149
  89. package/src/repository/sqlite/UserSqliteRepository.ts +59 -173
  90. package/src/routes/RoleRoutes.ts +35 -12
  91. package/src/routes/TenantRoutes.ts +25 -9
  92. package/src/routes/UserApiKeyRoutes.ts +23 -7
  93. package/src/routes/UserRoutes.ts +117 -34
  94. package/src/schemas/LoginSchema.ts +12 -0
  95. package/src/schemas/PasswordSchema.ts +16 -0
  96. package/src/{zod/UserZod.ts → schemas/RegisterSchema.ts} +7 -10
  97. package/src/schemas/RoleSchema.ts +29 -0
  98. package/src/schemas/TenantSchema.ts +22 -0
  99. package/src/{zod/UserApiKeyZod.ts → schemas/UserApiKeySchema.ts} +8 -3
  100. package/src/schemas/UserSchema.ts +57 -0
  101. package/src/services/PermissionService.ts +6 -5
  102. package/src/services/RoleService.ts +6 -6
  103. package/src/services/TenantService.ts +10 -10
  104. package/src/services/UserApiKeyService.ts +5 -5
  105. package/src/services/UserService.ts +15 -16
  106. package/src/setup/CreateOrUpdateRole.ts +7 -4
  107. package/src/setup/CreateUserIfNotExist.ts +5 -3
  108. package/src/setup/RecoveryUserPassword.ts +1 -1
  109. package/test/data-obj/apikey/root-mongo-user-apikey.ts +2 -1
  110. package/test/data-obj/roles/admin-sqlite-role.ts +2 -2
  111. package/test/data-obj/roles/operator-sqlite-role.ts +1 -1
  112. package/test/data-obj/tenants/company-sqlite-tenant.ts +6 -0
  113. package/test/data-obj/users/root-sqlite-user.ts +2 -2
  114. package/test/initializers/RoleSqliteInitializer.ts +1 -1
  115. package/test/repository/mongo/role-mongo-repository.test.ts +3 -3
  116. package/test/repository/mongo/user-apikey-mongo-repository.test.ts +5 -4
  117. package/test/repository/mongo/user-mongo-repository.test.ts +4 -4
  118. package/test/repository/sqlite/role-sqlite-repository.test.ts +21 -9
  119. package/test/repository/sqlite/tenant-sqlite-repository.test.ts +74 -0
  120. package/test/repository/sqlite/user-sqlite-repository.test.ts +15 -9
  121. package/test/routes/data/admin-role.ts +10 -0
  122. package/test/routes/data/root-user.ts +13 -0
  123. package/test/routes/helpers/CreateRootUserAndAdminRole.ts +17 -0
  124. package/test/routes/helpers/FastifyTestServerFactory.ts +34 -0
  125. package/test/routes/helpers/InitializePermissions.ts +23 -0
  126. package/test/routes/helpers/SetupIdentityDrax.ts +22 -0
  127. package/test/routes/tenant-route.test.ts +336 -0
  128. package/test/routes/user-route.test.ts +186 -0
  129. package/test/schemas/lab-schema.test.ts +110 -0
  130. package/test/service/mock-service.test.ts +3 -3
  131. package/test/service/role-service.test.ts +3 -3
  132. package/test/service/user-service.test.ts +16 -25
  133. package/test.db +0 -0
  134. package/tsconfig.tsbuildinfo +1 -1
  135. package/types/controllers/RoleController.d.ts +0 -1
  136. package/types/controllers/RoleController.d.ts.map +1 -1
  137. package/types/controllers/TenantController.d.ts +0 -1
  138. package/types/controllers/TenantController.d.ts.map +1 -1
  139. package/types/controllers/UserApiKeyController.d.ts.map +1 -1
  140. package/types/controllers/UserController.d.ts +11 -4
  141. package/types/controllers/UserController.d.ts.map +1 -1
  142. package/types/errors/BadCredentialsError.d.ts +9 -1
  143. package/types/errors/BadCredentialsError.d.ts.map +1 -1
  144. package/types/factory/RoleServiceFactory.d.ts.map +1 -1
  145. package/types/factory/TenantServiceFactory.d.ts.map +1 -1
  146. package/types/factory/UserApiKeyServiceFactory.d.ts.map +1 -1
  147. package/types/factory/UserServiceFactory.d.ts.map +1 -1
  148. package/types/graphql/resolvers/role.resolvers.d.ts +3 -9
  149. package/types/graphql/resolvers/role.resolvers.d.ts.map +1 -1
  150. package/types/graphql/resolvers/tenant.resolvers.d.ts +3 -9
  151. package/types/graphql/resolvers/tenant.resolvers.d.ts.map +1 -1
  152. package/types/graphql/resolvers/user-api-key.resolvers.d.ts +3 -9
  153. package/types/graphql/resolvers/user-api-key.resolvers.d.ts.map +1 -1
  154. package/types/graphql/resolvers/user.resolvers.d.ts +3 -9
  155. package/types/graphql/resolvers/user.resolvers.d.ts.map +1 -1
  156. package/types/index.d.ts +5 -1
  157. package/types/index.d.ts.map +1 -1
  158. package/types/interfaces/ITenantRepository.d.ts +2 -2
  159. package/types/interfaces/ITenantRepository.d.ts.map +1 -1
  160. package/types/interfaces/IUserApiKeyRepository.d.ts +2 -2
  161. package/types/interfaces/IUserApiKeyRepository.d.ts.map +1 -1
  162. package/types/interfaces/IUserRepository.d.ts +3 -2
  163. package/types/interfaces/IUserRepository.d.ts.map +1 -1
  164. package/types/models/RoleModel.d.ts +7 -7
  165. package/types/models/RoleModel.d.ts.map +1 -1
  166. package/types/models/TenantModel.d.ts +7 -7
  167. package/types/models/TenantModel.d.ts.map +1 -1
  168. package/types/models/UserApiKeyModel.d.ts +7 -7
  169. package/types/models/UserApiKeyModel.d.ts.map +1 -1
  170. package/types/models/UserGroupModel.d.ts +2 -2
  171. package/types/models/UserGroupModel.d.ts.map +1 -1
  172. package/types/models/UserModel.d.ts +7 -7
  173. package/types/models/UserModel.d.ts.map +1 -1
  174. package/types/permissions/UserApiKeyPermissions.d.ts +2 -1
  175. package/types/permissions/UserApiKeyPermissions.d.ts.map +1 -1
  176. package/types/permissions/index.d.ts +1 -0
  177. package/types/permissions/index.d.ts.map +1 -1
  178. package/types/rbac/Rbac.d.ts +1 -1
  179. package/types/rbac/Rbac.d.ts.map +1 -1
  180. package/types/repository/mongo/RoleMongoRepository.d.ts +9 -11
  181. package/types/repository/mongo/RoleMongoRepository.d.ts.map +1 -1
  182. package/types/repository/mongo/TenantMongoRepository.d.ts +8 -11
  183. package/types/repository/mongo/TenantMongoRepository.d.ts.map +1 -1
  184. package/types/repository/mongo/UserApiKeyMongoRepository.d.ts +12 -5
  185. package/types/repository/mongo/UserApiKeyMongoRepository.d.ts.map +1 -1
  186. package/types/repository/mongo/UserMongoRepository.d.ts +11 -12
  187. package/types/repository/mongo/UserMongoRepository.d.ts.map +1 -1
  188. package/types/repository/sqlite/RoleSqliteRepository.d.ts +14 -14
  189. package/types/repository/sqlite/RoleSqliteRepository.d.ts.map +1 -1
  190. package/types/repository/sqlite/TenantSqliteRepository.d.ts +12 -14
  191. package/types/repository/sqlite/TenantSqliteRepository.d.ts.map +1 -1
  192. package/types/repository/sqlite/UserApiKeySqliteRepository.d.ts +15 -11
  193. package/types/repository/sqlite/UserApiKeySqliteRepository.d.ts.map +1 -1
  194. package/types/repository/sqlite/UserSqliteRepository.d.ts +15 -12
  195. package/types/repository/sqlite/UserSqliteRepository.d.ts.map +1 -1
  196. package/types/routes/RoleRoutes.d.ts.map +1 -1
  197. package/types/routes/TenantRoutes.d.ts.map +1 -1
  198. package/types/routes/UserApiKeyRoutes.d.ts.map +1 -1
  199. package/types/routes/UserRoutes.d.ts.map +1 -1
  200. package/types/schemas/LoginSchema.d.ts +20 -0
  201. package/types/schemas/LoginSchema.d.ts.map +1 -0
  202. package/types/schemas/PasswordSchema.d.ts +27 -0
  203. package/types/schemas/PasswordSchema.d.ts.map +1 -0
  204. package/types/schemas/RegisterSchema.d.ts +32 -0
  205. package/types/schemas/RegisterSchema.d.ts.map +1 -0
  206. package/types/schemas/RoleSchema.d.ts +67 -0
  207. package/types/schemas/RoleSchema.d.ts.map +1 -0
  208. package/types/schemas/TenantSchema.d.ts +29 -0
  209. package/types/schemas/TenantSchema.d.ts.map +1 -0
  210. package/types/schemas/UserApiKeySchema.d.ts +39 -0
  211. package/types/schemas/UserApiKeySchema.d.ts.map +1 -0
  212. package/types/schemas/UserSchema.d.ts +161 -0
  213. package/types/schemas/UserSchema.d.ts.map +1 -0
  214. package/types/services/PermissionService.d.ts +1 -0
  215. package/types/services/PermissionService.d.ts.map +1 -1
  216. package/types/services/TenantService.d.ts +3 -3
  217. package/types/services/TenantService.d.ts.map +1 -1
  218. package/types/services/UserService.d.ts.map +1 -1
  219. package/types/setup/CreateOrUpdateRole.d.ts +2 -2
  220. package/types/setup/CreateOrUpdateRole.d.ts.map +1 -1
  221. package/types/setup/CreateUserIfNotExist.d.ts +2 -2
  222. package/types/setup/CreateUserIfNotExist.d.ts.map +1 -1
  223. package/types/zod/EndpointZod.d.ts +20 -0
  224. package/types/zod/EndpointZod.d.ts.map +1 -0
  225. package/types/zod/TenantSchema.d.ts +26 -0
  226. package/types/zod/TenantSchema.d.ts.map +1 -0
  227. package/types/zod/TenantZod.d.ts +13 -3
  228. package/types/zod/TenantZod.d.ts.map +1 -1
  229. package/types/zod/UserApiKeyZod.d.ts +23 -3
  230. package/types/zod/UserApiKeyZod.d.ts.map +1 -1
  231. package/types/zod/UserZod.d.ts +6 -6
  232. package/src/zod/RoleZod.ts +0 -14
  233. package/src/zod/TenantZod.ts +0 -14
@@ -1,10 +1,14 @@
1
1
  import { UserModel } from "../../models/UserModel.js";
2
- import { mongoose, MongooseErrorToValidationError, MongooseQueryFilter, MongooseSort, MongoServerErrorToValidationError, ValidationError } from "@drax/common-back";
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
- class UserMongoRepository {
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(['role', 'tenant']);
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 MongooseErrorToValidationError(e);
26
+ throw MongooseValidationErrorToValidationError(e);
23
27
  }
24
- throw e;
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.findOne({ username: username }).populate(['role', 'tenant']).exec();
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.findOne({ username: username }).select('+password').populate(['role', 'tenant']).exec();
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.findOne({ email: email }).populate(['role', 'tenant']).exec();
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.findOne({ emailCode: { $eq: code }, emailVerified: { $eq: false } }).populate(['role', 'tenant']).exec();
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.findOne({ phoneCode: { $eq: code }, phoneVerified: { $eq: false } }).populate(['role', 'tenant']).exec();
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.findOne({ recoveryCode: { $eq: code }, active: { $eq: true } }).populate(['role', 'tenant']).exec();
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
- query['$or'] = [
147
- { name: new RegExp(search, 'i') },
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 sqlite from "better-sqlite3";
2
- import { randomUUID } from "node:crypto";
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
- this.dataBaseFile = dataBaseFile;
15
- this.db = new sqlite(dataBaseFile, { verbose: verbose ? console.log : null });
16
- this.table();
17
- }
18
- table() {
19
- const builder = new SqliteTableBuilder(this.dataBaseFile, 'roles', tableFields, false);
20
- builder.build('id');
21
- }
22
- normalizeData(roleData) {
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 create(roleData) {
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
- await this.populateRole(role);
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.populateRole(role);
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('SELECT * FROM roles WHERE id = ?').get(id);
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 sqlite from "better-sqlite3";
2
- import { randomUUID } from "node:crypto";
3
- import { SqliteErrorToValidationError, SqliteTableBuilder, SqlQueryFilter, SqlSort } from "@drax/common-back";
4
- const tableFields = [
5
- { name: "name", type: "TEXT", unique: false, primary: false },
6
- { name: "createdAt", type: "TEXT", unique: false, primary: false },
7
- { name: "updatedAt", type: "TEXT", unique: false, primary: false },
8
- ];
9
- class TenantSqliteRepository {
10
- constructor(dataBaseFile, verbose = false) {
11
- this.dataBaseFile = dataBaseFile;
12
- this.db = new sqlite(this.dataBaseFile, { verbose: verbose ? console.log : null });
13
- this.table();
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('SELECT * FROM tenants WHERE name = ?').get(name);
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
- const tableFields = [
6
- { name: "secret", type: "TEXT", unique: true, primary: false },
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
- table() {
24
- const builder = new SqliteTableBuilder(this.dataBaseFile, 'user_api_keys', tableFields, false);
25
- builder.build('id');
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
- catch (e) {
57
- console.log(e);
58
- throw SqliteErrorToValidationError(e, userApiKeyData);
32
+ if (item && item.createdBy) {
33
+ item.createdBy = await this.findUserById(item.createdBy);
59
34
  }
60
- }
61
- async findById(id) {
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
- catch (e) {
101
- console.log(e);
102
- throw SqliteErrorToValidationError(e, userApiKeyData);
38
+ if (item && item.ipv6) {
39
+ item.ipv6 = item.ipv6 != "" ? item.ipv6.split(',') : [];
103
40
  }
104
41
  }
105
- async delete(id) {
106
- const stmt = this.db.prepare('DELETE FROM user_api_keys WHERE id = ?');
107
- stmt.run(id);
108
- return true;
109
- }
110
- async paginate({ page = 1, limit = 5, orderBy = '', order = false, search = '', filters = [] }) {
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
- where = SqlQueryFilter.applyFilters(where, filters);
117
- const sort = SqlSort.applySort(orderBy, order);
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
- return {
128
- page: page,
129
- limit: limit,
130
- total: rCount.count,
131
- items: userApiKeys
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;