@drax/identity-back 0.5.3 → 0.5.5

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 (71) hide show
  1. package/dist/controllers/RoleController.js +84 -0
  2. package/dist/controllers/TenantController.js +1 -2
  3. package/dist/controllers/UserApiKeyController.js +127 -0
  4. package/dist/controllers/UserController.js +295 -0
  5. package/dist/index.js +1 -2
  6. package/dist/repository/mongo/RoleMongoRepository.js +35 -3
  7. package/dist/repository/mongo/TenantMongoRepository.js +25 -2
  8. package/dist/repository/mongo/UserMongoRepository.js +23 -0
  9. package/dist/repository/sqlite/TenantSqliteRepository.js +1 -1
  10. package/dist/routes/RoleRoutes.js +12 -207
  11. package/dist/routes/TenantRoutes.js +1 -0
  12. package/dist/routes/UserApiKeyRoutes.js +6 -114
  13. package/dist/routes/UserRoutes.js +13 -218
  14. package/dist/services/RoleService.js +42 -2
  15. package/dist/services/TenantService.js +5 -0
  16. package/dist/services/UserApiKeyService.js +9 -1
  17. package/dist/services/UserService.js +14 -4
  18. package/dist/setup/CreateOrUpdateRole.js +1 -1
  19. package/package.json +4 -4
  20. package/src/controllers/RoleController.ts +94 -0
  21. package/src/controllers/TenantController.ts +1 -2
  22. package/src/controllers/UserApiKeyController.ts +144 -0
  23. package/src/controllers/UserController.ts +300 -0
  24. package/src/index.ts +0 -2
  25. package/src/interfaces/IRoleRepository.ts +2 -2
  26. package/src/repository/mongo/RoleMongoRepository.ts +75 -19
  27. package/src/repository/mongo/TenantMongoRepository.ts +36 -3
  28. package/src/repository/mongo/UserMongoRepository.ts +49 -2
  29. package/src/repository/sqlite/TenantSqliteRepository.ts +0 -1
  30. package/src/routes/RoleRoutes.ts +22 -195
  31. package/src/routes/TenantRoutes.ts +2 -0
  32. package/src/routes/UserApiKeyRoutes.ts +6 -113
  33. package/src/routes/UserRoutes.ts +13 -201
  34. package/src/services/RoleService.ts +45 -4
  35. package/src/services/TenantService.ts +7 -1
  36. package/src/services/UserApiKeyService.ts +11 -1
  37. package/src/services/UserService.ts +16 -4
  38. package/src/setup/CreateOrUpdateRole.ts +1 -1
  39. package/tsconfig.tsbuildinfo +1 -1
  40. package/types/controllers/RoleController.d.ts +14 -0
  41. package/types/controllers/RoleController.d.ts.map +1 -0
  42. package/types/controllers/TenantController.d.ts.map +1 -1
  43. package/types/controllers/UserApiKeyController.d.ts +14 -0
  44. package/types/controllers/UserApiKeyController.d.ts.map +1 -0
  45. package/types/controllers/UserController.d.ts +27 -0
  46. package/types/controllers/UserController.d.ts.map +1 -0
  47. package/types/index.d.ts +1 -2
  48. package/types/index.d.ts.map +1 -1
  49. package/types/interfaces/IRoleRepository.d.ts +2 -2
  50. package/types/interfaces/IRoleRepository.d.ts.map +1 -1
  51. package/types/repository/mongo/RoleMongoRepository.d.ts +33 -1
  52. package/types/repository/mongo/RoleMongoRepository.d.ts.map +1 -1
  53. package/types/repository/mongo/TenantMongoRepository.d.ts +32 -1
  54. package/types/repository/mongo/TenantMongoRepository.d.ts.map +1 -1
  55. package/types/repository/mongo/UserMongoRepository.d.ts +31 -1
  56. package/types/repository/mongo/UserMongoRepository.d.ts.map +1 -1
  57. package/types/repository/sqlite/TenantSqliteRepository.d.ts +1 -1
  58. package/types/repository/sqlite/TenantSqliteRepository.d.ts.map +1 -1
  59. package/types/routes/RoleRoutes.d.ts.map +1 -1
  60. package/types/routes/TenantRoutes.d.ts.map +1 -1
  61. package/types/routes/UserApiKeyRoutes.d.ts.map +1 -1
  62. package/types/routes/UserRoutes.d.ts.map +1 -1
  63. package/types/services/RoleService.d.ts +5 -1
  64. package/types/services/RoleService.d.ts.map +1 -1
  65. package/types/services/TenantService.d.ts +1 -0
  66. package/types/services/TenantService.d.ts.map +1 -1
  67. package/types/services/UserApiKeyService.d.ts +2 -1
  68. package/types/services/UserApiKeyService.d.ts.map +1 -1
  69. package/types/services/UserService.d.ts +3 -1
  70. package/types/services/UserService.d.ts.map +1 -1
  71. package/src/routes/UserAvatarRoutes.ts +0 -82
@@ -0,0 +1,84 @@
1
+ import { AbstractFastifyController } from "@drax/crud-back";
2
+ import { ValidationError, UnauthorizedError } from "@drax/common-back";
3
+ import RoleServiceFactory from "../factory/RoleServiceFactory.js";
4
+ import RolePermissions from "../permissions/RolePermissions.js";
5
+ import PermissionService from "../services/PermissionService.js";
6
+ class RoleController extends AbstractFastifyController {
7
+ constructor() {
8
+ super(RoleServiceFactory(), RolePermissions);
9
+ }
10
+ async findByName(request, reply) {
11
+ try {
12
+ request.rbac.assertPermission(RolePermissions.View);
13
+ const name = request.params.name;
14
+ const roleService = RoleServiceFactory();
15
+ let role = await roleService.findByName(name);
16
+ return role;
17
+ }
18
+ catch (e) {
19
+ console.error(e);
20
+ if (e instanceof ValidationError) {
21
+ reply.statusCode = e.statusCode;
22
+ reply.send({ error: e.message, inputErrors: e.errors });
23
+ }
24
+ else if (e instanceof UnauthorizedError) {
25
+ reply.statusCode = e.statusCode;
26
+ reply.send({ error: e.message });
27
+ }
28
+ else {
29
+ reply.statusCode = 500;
30
+ reply.send({ error: 'INTERNAL_SERVER_ERROR' });
31
+ }
32
+ }
33
+ }
34
+ async all(request, reply) {
35
+ try {
36
+ request.rbac.assertPermission(RolePermissions.View);
37
+ const roleService = RoleServiceFactory();
38
+ let roles = await roleService.fetchAll();
39
+ if (request.rbac.getRole?.childRoles?.length > 0) {
40
+ return roles.filter(role => request.rbac.getRole.childRoles.some(childRole => childRole.id === role.id));
41
+ }
42
+ else {
43
+ return roles;
44
+ }
45
+ }
46
+ catch (e) {
47
+ console.error(e);
48
+ if (e instanceof ValidationError) {
49
+ reply.statusCode = e.statusCode;
50
+ reply.send({ error: e.message, inputErrors: e.errors });
51
+ }
52
+ else if (e instanceof UnauthorizedError) {
53
+ reply.statusCode = e.statusCode;
54
+ reply.send({ error: e.message });
55
+ }
56
+ else {
57
+ reply.statusCode = 500;
58
+ reply.send({ error: 'INTERNAL_SERVER_ERROR' });
59
+ }
60
+ }
61
+ }
62
+ async permissions(request, reply) {
63
+ try {
64
+ request.rbac.assertPermission(RolePermissions.Permissions);
65
+ let permissions = PermissionService.getPermissions();
66
+ return permissions;
67
+ }
68
+ catch (e) {
69
+ console.error(e);
70
+ if (e instanceof UnauthorizedError) {
71
+ reply.statusCode = e.statusCode;
72
+ reply.send({ error: e.message });
73
+ }
74
+ else {
75
+ reply.statusCode = 500;
76
+ reply.send({ error: 'INTERNAL_SERVER_ERROR' });
77
+ }
78
+ }
79
+ }
80
+ async xxxx(request, reply) {
81
+ }
82
+ }
83
+ export default RoleController;
84
+ export { RoleController };
@@ -1,8 +1,7 @@
1
1
  import { AbstractFastifyController } from "@drax/crud-back";
2
- import { ValidationError } from "@drax/common-back";
2
+ import { ValidationError, UnauthorizedError } from "@drax/common-back";
3
3
  import TenantServiceFactory from "../factory/TenantServiceFactory.js";
4
4
  import TenantPermissions from "../permissions/TenantPermissions.js";
5
- import { UnauthorizedError } from "@drax/common-back";
6
5
  class TenantController extends AbstractFastifyController {
7
6
  constructor() {
8
7
  super(TenantServiceFactory(), TenantPermissions);
@@ -0,0 +1,127 @@
1
+ import { AbstractFastifyController } from "@drax/crud-back";
2
+ import { ValidationError, UnauthorizedError } from "@drax/common-back";
3
+ import UserApiKeyServiceFactory from "../factory/UserApiKeyServiceFactory.js";
4
+ import UserApiKeyPermissions from "../permissions/UserApiKeyPermissions.js";
5
+ class UserApiKeyController extends AbstractFastifyController {
6
+ constructor() {
7
+ super(UserApiKeyServiceFactory(), UserApiKeyPermissions);
8
+ }
9
+ async paginate(request, reply) {
10
+ try {
11
+ request.rbac.assertAuthenticated();
12
+ request.rbac.assertOrPermissions([
13
+ UserApiKeyPermissions.View,
14
+ UserApiKeyPermissions.ViewMy
15
+ ]);
16
+ const filters = [];
17
+ if (!request.rbac.hasPermission(UserApiKeyPermissions.View)) {
18
+ filters.push({ field: "user", operator: "eq", value: request.rbac.authUser.id });
19
+ }
20
+ const page = request.query.page;
21
+ const limit = request.query.limit;
22
+ const orderBy = request.query.orderBy;
23
+ const order = request.query.order;
24
+ const search = request.query.search;
25
+ const userApiKeyService = UserApiKeyServiceFactory();
26
+ let paginateResult = await userApiKeyService.paginate({ page, limit, orderBy, order, search, filters });
27
+ return paginateResult;
28
+ }
29
+ catch (e) {
30
+ console.log("/api/user-api-keys", e);
31
+ if (e instanceof ValidationError) {
32
+ reply.statusCode = e.statusCode;
33
+ reply.send({ error: e.message, inputErrors: e.errors });
34
+ }
35
+ else if (e instanceof UnauthorizedError) {
36
+ reply.statusCode = e.statusCode;
37
+ reply.send({ error: e.message });
38
+ }
39
+ else {
40
+ reply.statusCode = 500;
41
+ reply.send({ error: 'error.server' });
42
+ }
43
+ }
44
+ }
45
+ async create(request, reply) {
46
+ try {
47
+ request.rbac.assertPermission(UserApiKeyPermissions.Create);
48
+ const payload = request.body;
49
+ payload.user = request.rbac.authUser.id;
50
+ const userApiKeyService = UserApiKeyServiceFactory();
51
+ let userApiKey = await userApiKeyService.create(payload);
52
+ return userApiKey;
53
+ }
54
+ catch (e) {
55
+ if (e instanceof ValidationError) {
56
+ reply.statusCode = e.statusCode;
57
+ reply.send({ error: e.message, inputErrors: e.errors });
58
+ }
59
+ else if (e instanceof UnauthorizedError) {
60
+ reply.statusCode = e.statusCode;
61
+ reply.send({ error: e.message });
62
+ }
63
+ else {
64
+ reply.statusCode = 500;
65
+ reply.send({ error: 'error.server' });
66
+ }
67
+ }
68
+ }
69
+ async update(request, reply) {
70
+ try {
71
+ request.rbac.assertPermission(UserApiKeyPermissions.Update);
72
+ const id = request.params.id;
73
+ const payload = request.body;
74
+ const userApiKeyService = UserApiKeyServiceFactory();
75
+ let userApiKey = await userApiKeyService.update(id, payload);
76
+ return userApiKey;
77
+ }
78
+ catch (e) {
79
+ if (e instanceof ValidationError) {
80
+ reply.statusCode = e.statusCode;
81
+ reply.send({ error: e.message, inputErrors: e.errors });
82
+ }
83
+ if (e instanceof UnauthorizedError) {
84
+ reply.statusCode = e.statusCode;
85
+ reply.send({ error: e.message });
86
+ }
87
+ else if (e instanceof UnauthorizedError) {
88
+ reply.statusCode = e.statusCode;
89
+ reply.send({ error: e.message });
90
+ }
91
+ else {
92
+ reply.statusCode = 500;
93
+ reply.send({ error: 'error.server' });
94
+ }
95
+ }
96
+ }
97
+ async delete(request, reply) {
98
+ try {
99
+ request.rbac.assertPermission(UserApiKeyPermissions.Delete);
100
+ const id = request.params.id;
101
+ const userApiKeyService = UserApiKeyServiceFactory();
102
+ let r = await userApiKeyService.delete(id);
103
+ if (r) {
104
+ reply.send({ message: 'Deleted successfully' });
105
+ }
106
+ else {
107
+ reply.statusCode(400).send({ message: 'Not deleted' });
108
+ }
109
+ }
110
+ catch (e) {
111
+ if (e instanceof ValidationError) {
112
+ reply.statusCode = e.statusCode;
113
+ reply.send({ error: e.message, inputErrors: e.errors });
114
+ }
115
+ else if (e instanceof UnauthorizedError) {
116
+ reply.statusCode = e.statusCode;
117
+ reply.send({ error: e.message });
118
+ }
119
+ else {
120
+ reply.statusCode = 500;
121
+ reply.send({ error: 'error.server' });
122
+ }
123
+ }
124
+ }
125
+ }
126
+ export default UserApiKeyController;
127
+ export { UserApiKeyController };
@@ -0,0 +1,295 @@
1
+ import { AbstractFastifyController } from "@drax/crud-back";
2
+ import { CommonConfig, DraxConfig, StoreManager, UploadFileError, ValidationError, UnauthorizedError } from "@drax/common-back";
3
+ import UserServiceFactory from "../factory/UserServiceFactory.js";
4
+ import UserPermissions from "../permissions/UserPermissions.js";
5
+ import BadCredentialsError from "../errors/BadCredentialsError.js";
6
+ import { join } from "path";
7
+ import { IdentityConfig } from "../config/IdentityConfig.js";
8
+ const BASE_FILE_DIR = DraxConfig.getOrLoad(CommonConfig.FileDir) || 'files';
9
+ const AVATAR_DIR = DraxConfig.getOrLoad(IdentityConfig.AvatarDir) || 'avatar';
10
+ const BASE_URL = DraxConfig.getOrLoad(CommonConfig.BaseUrl) ? DraxConfig.get(CommonConfig.BaseUrl).replace(/\/$/, '') : '';
11
+ class UserController extends AbstractFastifyController {
12
+ constructor() {
13
+ super(UserServiceFactory(), UserPermissions);
14
+ }
15
+ async auth(request, reply) {
16
+ try {
17
+ const username = request.body.username;
18
+ const password = request.body.password;
19
+ const userService = UserServiceFactory();
20
+ return await userService.auth(username, password);
21
+ }
22
+ catch (e) {
23
+ console.error('/api/auth error', e);
24
+ if (e instanceof BadCredentialsError) {
25
+ reply.code(401);
26
+ reply.send({ error: e.message });
27
+ }
28
+ reply.code(500);
29
+ reply.send({ error: 'error.server' });
30
+ }
31
+ }
32
+ async me(request, reply) {
33
+ try {
34
+ if (request.authUser) {
35
+ const userService = UserServiceFactory();
36
+ let user = await userService.findById(request.authUser.id);
37
+ user.password = undefined;
38
+ delete user.password;
39
+ return user;
40
+ }
41
+ else {
42
+ throw new UnauthorizedError();
43
+ }
44
+ }
45
+ catch (e) {
46
+ if (e instanceof UnauthorizedError) {
47
+ reply.code(401);
48
+ reply.send({ error: "Unauthorized" });
49
+ }
50
+ else if (e instanceof UnauthorizedError) {
51
+ reply.statusCode = e.statusCode;
52
+ reply.send({ error: e.message });
53
+ }
54
+ else {
55
+ reply.statusCode = 500;
56
+ reply.send({ error: 'error.server' });
57
+ }
58
+ }
59
+ }
60
+ async paginate(request, reply) {
61
+ try {
62
+ request.rbac.assertPermission(UserPermissions.View);
63
+ const page = request.query.page;
64
+ const limit = request.query.limit;
65
+ const orderBy = request.query.orderBy;
66
+ const order = request.query.order;
67
+ const search = request.query.search;
68
+ const userService = UserServiceFactory();
69
+ const filters = [];
70
+ if (request.rbac.getAuthUser.tenantId) {
71
+ filters.push({ field: 'tenant', operator: 'eq', value: request.rbac.getAuthUser.tenantId });
72
+ }
73
+ let paginateResult = await userService.paginate({ page, limit, orderBy, order, search, filters });
74
+ for (let item of paginateResult.items) {
75
+ item.password = undefined;
76
+ delete item.password;
77
+ }
78
+ return paginateResult;
79
+ }
80
+ catch (e) {
81
+ if (e instanceof ValidationError) {
82
+ reply.statusCode = e.statusCode;
83
+ reply.send({ error: e.message, inputErrors: e.errors });
84
+ }
85
+ else if (e instanceof UnauthorizedError) {
86
+ reply.statusCode = e.statusCode;
87
+ reply.send({ error: e.message });
88
+ }
89
+ else {
90
+ reply.statusCode = 500;
91
+ reply.send({ error: 'error.server' });
92
+ }
93
+ }
94
+ }
95
+ async create(request, reply) {
96
+ try {
97
+ request.rbac.assertPermission(UserPermissions.Create);
98
+ const payload = request.body;
99
+ const userService = UserServiceFactory();
100
+ if (request.rbac.getAuthUser.tenantId) {
101
+ payload.tenant = request.rbac.getAuthUser.tenantId;
102
+ }
103
+ let user = await userService.create(payload);
104
+ return user;
105
+ }
106
+ catch (e) {
107
+ if (e instanceof ValidationError) {
108
+ reply.statusCode = e.statusCode;
109
+ reply.send({ error: e.message, inputErrors: e.errors });
110
+ }
111
+ else if (e instanceof UnauthorizedError) {
112
+ reply.statusCode = e.statusCode;
113
+ reply.send({ error: e.message });
114
+ }
115
+ else {
116
+ reply.statusCode = 500;
117
+ reply.send({ error: 'error.server' });
118
+ }
119
+ }
120
+ }
121
+ async update(request, reply) {
122
+ try {
123
+ request.rbac.assertPermission(UserPermissions.Update);
124
+ const id = request.params.id;
125
+ const payload = request.body;
126
+ const userService = UserServiceFactory();
127
+ if (request.rbac.getAuthUser.tenantId) {
128
+ payload.tenant = request.rbac.getAuthUser.tenantId;
129
+ }
130
+ let user = await userService.update(id, payload);
131
+ return user;
132
+ }
133
+ catch (e) {
134
+ if (e instanceof ValidationError) {
135
+ reply.statusCode = e.statusCode;
136
+ reply.send({ error: e.message, inputErrors: e.errors });
137
+ }
138
+ if (e instanceof UnauthorizedError) {
139
+ reply.statusCode = e.statusCode;
140
+ reply.send({ error: e.message });
141
+ }
142
+ else if (e instanceof UnauthorizedError) {
143
+ reply.statusCode = e.statusCode;
144
+ reply.send({ error: e.message });
145
+ }
146
+ else {
147
+ reply.statusCode = 500;
148
+ reply.send({ error: 'error.server' });
149
+ }
150
+ }
151
+ }
152
+ async delete(request, reply) {
153
+ try {
154
+ request.rbac.assertPermission(UserPermissions.Delete);
155
+ const id = request.params.id;
156
+ const userService = UserServiceFactory();
157
+ let r = await userService.delete(id);
158
+ if (r) {
159
+ reply.send({ message: 'Deleted successfully' });
160
+ }
161
+ else {
162
+ reply.statusCode(400).send({ message: 'Not deleted' });
163
+ }
164
+ }
165
+ catch (e) {
166
+ if (e instanceof ValidationError) {
167
+ reply.statusCode = e.statusCode;
168
+ reply.send({ error: e.message, inputErrors: e.errors });
169
+ }
170
+ else if (e instanceof UnauthorizedError) {
171
+ reply.statusCode = e.statusCode;
172
+ reply.send({ error: e.message });
173
+ }
174
+ else {
175
+ reply.statusCode = 500;
176
+ reply.send({ error: 'error.server' });
177
+ }
178
+ }
179
+ }
180
+ async myPassword(request, reply) {
181
+ try {
182
+ if (!request.authUser) {
183
+ throw new UnauthorizedError();
184
+ }
185
+ const userId = request.authUser.id;
186
+ const currentPassword = request.body.currentPassword;
187
+ const newPassword = request.body.newPassword;
188
+ const userService = UserServiceFactory();
189
+ return await userService.changeOwnPassword(userId, currentPassword, newPassword);
190
+ }
191
+ catch (e) {
192
+ console.error('/api/password error', e);
193
+ if (e instanceof ValidationError) {
194
+ reply.statusCode = e.statusCode;
195
+ reply.send({ error: e.message, inputErrors: e.errors });
196
+ }
197
+ else if (e instanceof UnauthorizedError) {
198
+ reply.statusCode = e.statusCode;
199
+ reply.send({ error: e.message });
200
+ }
201
+ else {
202
+ reply.statusCode = 500;
203
+ reply.send({ error: 'error.server' });
204
+ }
205
+ }
206
+ }
207
+ async password(request, reply) {
208
+ try {
209
+ request.rbac.assertPermission(UserPermissions.Update);
210
+ const userId = request.params.id;
211
+ if (!userId) {
212
+ throw new UnauthorizedError();
213
+ }
214
+ const newPassword = request.body.newPassword;
215
+ const userService = UserServiceFactory();
216
+ return await userService.changeUserPassword(userId, newPassword);
217
+ }
218
+ catch (e) {
219
+ console.error('/api/password error', e);
220
+ if (e instanceof ValidationError) {
221
+ reply.statusCode = e.statusCode;
222
+ reply.send({ error: e.message, inputErrors: e.errors });
223
+ }
224
+ else if (e instanceof UnauthorizedError) {
225
+ reply.statusCode = e.statusCode;
226
+ reply.send({ error: e.message });
227
+ }
228
+ else {
229
+ reply.statusCode = 500;
230
+ reply.send({ error: 'error.server' });
231
+ }
232
+ }
233
+ }
234
+ async updateAvatar(request, reply) {
235
+ try {
236
+ request.rbac.assertAuthenticated();
237
+ const userId = request.rbac.getAuthUser.id;
238
+ const data = await request.file();
239
+ const file = {
240
+ filename: data.filename,
241
+ fileStream: data.file,
242
+ mimetype: data.mimetype
243
+ };
244
+ const destinationPath = join(BASE_FILE_DIR, AVATAR_DIR);
245
+ const storedFile = await StoreManager.saveFile(file, destinationPath);
246
+ const urlFile = BASE_URL + '/api/user/avatar/' + storedFile.filename;
247
+ //Save into DB
248
+ const userService = UserServiceFactory();
249
+ await userService.changeAvatar(userId, urlFile);
250
+ return {
251
+ filename: storedFile.filename,
252
+ size: storedFile.size,
253
+ mimetype: storedFile.mimetype,
254
+ url: urlFile,
255
+ };
256
+ }
257
+ catch (e) {
258
+ console.error(e);
259
+ if (e instanceof UploadFileError) {
260
+ reply.statusCode = e.statusCode;
261
+ reply.send({ error: e.message });
262
+ }
263
+ else if (e instanceof UnauthorizedError) {
264
+ reply.statusCode = e.statusCode;
265
+ reply.send({ error: e.message });
266
+ }
267
+ else {
268
+ reply.statusCode = 500;
269
+ reply.send({ error: 'INTERNAL_SERVER_ERROR' });
270
+ }
271
+ }
272
+ }
273
+ async getAvatar(request, reply) {
274
+ try {
275
+ const filename = request.params.filename;
276
+ const subPath = 'avatar';
277
+ const fileDir = join(BASE_FILE_DIR, subPath);
278
+ //console.log("FILE_DIR: ",fileDir, " FILENAME:", filename)
279
+ return reply.sendFile(filename, fileDir);
280
+ }
281
+ catch (e) {
282
+ console.error(e);
283
+ if (e instanceof UnauthorizedError) {
284
+ reply.statusCode = e.statusCode;
285
+ reply.send({ error: e.message });
286
+ }
287
+ else {
288
+ reply.statusCode = 500;
289
+ reply.send({ error: 'INTERNAL_SERVER_ERROR' });
290
+ }
291
+ }
292
+ }
293
+ }
294
+ export default UserController;
295
+ export { UserController };
package/dist/index.js CHANGED
@@ -8,7 +8,6 @@ import TenantService from "./services/TenantService.js";
8
8
  import PermissionService from "./services/PermissionService.js";
9
9
  import Rbac from "./rbac/Rbac.js";
10
10
  import { UserRoutes } from "./routes/UserRoutes.js";
11
- import { UserAvatarRoutes } from "./routes/UserAvatarRoutes.js";
12
11
  import { RoleRoutes } from "./routes/RoleRoutes.js";
13
12
  import { TenantRoutes } from "./routes/TenantRoutes.js";
14
13
  import { UserApiKeyRoutes } from "./routes/UserApiKeyRoutes.js";
@@ -39,7 +38,7 @@ UserServiceFactory, RoleServiceFactory, TenantServiceFactory,
39
38
  //GQL
40
39
  identityTypeDefs, identityResolvers,
41
40
  //API REST
42
- UserRoutes, RoleRoutes, TenantRoutes, UserAvatarRoutes, UserApiKeyRoutes, AuthUtils,
41
+ UserRoutes, RoleRoutes, TenantRoutes, UserApiKeyRoutes, AuthUtils,
43
42
  //API MIDDLEWARE
44
43
  jwtMiddleware, rbacMiddleware, apiKeyMiddleware,
45
44
  //Permissions
@@ -1,6 +1,9 @@
1
1
  import { RoleModel } from "../../models/RoleModel.js";
2
2
  import { MongooseQueryFilter, MongooseSort } from "@drax/common-back";
3
3
  class RoleMongoRepository {
4
+ constructor() {
5
+ this._searchFields = ['name'];
6
+ }
4
7
  async create(roleData) {
5
8
  const role = new RoleModel(roleData);
6
9
  await role.save();
@@ -27,12 +30,18 @@ class RoleMongoRepository {
27
30
  const roles = await RoleModel.find().populate('childRoles').exec();
28
31
  return roles;
29
32
  }
33
+ async search(value, limit = 1000) {
34
+ const query = {};
35
+ if (value) {
36
+ query['$or'] = this._searchFields.map(field => ({ [field]: new RegExp(value.toString(), 'i') }));
37
+ }
38
+ const items = await RoleModel.find(query).limit(limit).exec();
39
+ return items;
40
+ }
30
41
  async paginate({ page = 1, limit = 5, orderBy = '', order = false, search = '', filters = [] }) {
31
42
  const query = {};
32
43
  if (search) {
33
- query['$or'] = [
34
- { name: new RegExp(search, 'i') },
35
- ];
44
+ query['$or'] = this._searchFields.map(field => ({ [field]: new RegExp(search.toString(), 'i') }));
36
45
  }
37
46
  MongooseQueryFilter.applyFilters(query, filters);
38
47
  const sort = MongooseSort.applySort(orderBy, order);
@@ -45,5 +54,28 @@ class RoleMongoRepository {
45
54
  items: roles.docs
46
55
  };
47
56
  }
57
+ async find({ limit = 0, orderBy = '', order = false, search = '', filters = [] }) {
58
+ const query = {};
59
+ if (search) {
60
+ query['$or'] = [
61
+ { name: new RegExp(search, 'i') },
62
+ ];
63
+ }
64
+ MongooseQueryFilter.applyFilters(query, filters);
65
+ const sort = MongooseSort.applySort(orderBy, order);
66
+ return await RoleModel.find(query).limit(limit).sort(sort);
67
+ }
68
+ async findCursor({ limit = 0, orderBy = '', order = false, search = '', filters = [] }) {
69
+ console.log("RoleMongoRepository.findCursor called");
70
+ const query = {};
71
+ if (search) {
72
+ query['$or'] = [
73
+ { name: new RegExp(search, 'i') },
74
+ ];
75
+ }
76
+ MongooseQueryFilter.applyFilters(query, filters);
77
+ const sort = MongooseSort.applySort(orderBy, order);
78
+ return RoleModel.find(query).limit(limit).sort(sort).cursor();
79
+ }
48
80
  }
49
81
  export default RoleMongoRepository;
@@ -1,6 +1,9 @@
1
1
  import { TenantModel } from "../../models/TenantModel.js";
2
2
  import { MongooseSort, MongooseQueryFilter } from "@drax/common-back";
3
3
  class TenantMongoRepository {
4
+ constructor() {
5
+ this._searchFields = ['_id', 'name'];
6
+ }
4
7
  async create(tenantData) {
5
8
  const tenant = new TenantModel(tenantData);
6
9
  await tenant.save();
@@ -26,6 +29,14 @@ class TenantMongoRepository {
26
29
  const tenants = await TenantModel.find().exec();
27
30
  return tenants;
28
31
  }
32
+ async search(value, limit = 1000) {
33
+ const query = {};
34
+ if (value) {
35
+ query['$or'] = this._searchFields.map(field => ({ [field]: new RegExp(value.toString(), 'i') }));
36
+ }
37
+ const items = await TenantModel.find(query).limit(limit).exec();
38
+ return items;
39
+ }
29
40
  async paginate({ page = 1, limit = 5, orderBy = '', order = false, search = '', filters = [] }) {
30
41
  const query = {};
31
42
  if (search) {
@@ -44,7 +55,7 @@ class TenantMongoRepository {
44
55
  items: tenants.docs
45
56
  };
46
57
  }
47
- async find({ cursor = false, limit = 0, orderBy = '', order = false, search = '', filters = [] }) {
58
+ async find({ limit = 0, orderBy = '', order = false, search = '', filters = [] }) {
48
59
  const query = {};
49
60
  if (search) {
50
61
  query['$or'] = [
@@ -53,8 +64,20 @@ class TenantMongoRepository {
53
64
  }
54
65
  MongooseQueryFilter.applyFilters(query, filters);
55
66
  const sort = MongooseSort.applySort(orderBy, order);
56
- const items = await TenantModel.find(query).sort(sort);
67
+ const items = await TenantModel.find(query).limit(limit).sort(sort);
57
68
  return items;
58
69
  }
70
+ async findCursor({ limit = 0, orderBy = '', order = false, search = '', filters = [] }) {
71
+ console.log("TenantMongoRepository.findCursor called");
72
+ const query = {};
73
+ if (search) {
74
+ query['$or'] = [
75
+ { name: new RegExp(search, 'i') },
76
+ ];
77
+ }
78
+ MongooseQueryFilter.applyFilters(query, filters);
79
+ const sort = MongooseSort.applySort(orderBy, order);
80
+ return TenantModel.find(query).limit(limit).sort(sort).cursor();
81
+ }
59
82
  }
60
83
  export default TenantMongoRepository;
@@ -90,5 +90,28 @@ class UserMongoRepository {
90
90
  return false;
91
91
  }
92
92
  }
93
+ async find({ limit = 0, orderBy = '', order = false, search = '', filters = [] }) {
94
+ const query = {};
95
+ if (search) {
96
+ query['$or'] = [
97
+ { name: new RegExp(search, 'i') },
98
+ ];
99
+ }
100
+ MongooseQueryFilter.applyFilters(query, filters);
101
+ const sort = MongooseSort.applySort(orderBy, order);
102
+ return await UserModel.find(query).populate(['role', 'tenant']).limit(limit).sort(sort);
103
+ }
104
+ async findCursor({ limit = 0, orderBy = '', order = false, search = '', filters = [] }) {
105
+ console.log("RoleMongoRepository.findCursor called");
106
+ const query = {};
107
+ if (search) {
108
+ query['$or'] = [
109
+ { name: new RegExp(search, 'i') },
110
+ ];
111
+ }
112
+ MongooseQueryFilter.applyFilters(query, filters);
113
+ const sort = MongooseSort.applySort(orderBy, order);
114
+ return UserModel.find(query).populate(['role', 'tenant']).limit(limit).sort(sort).cursor();
115
+ }
93
116
  }
94
117
  export default UserMongoRepository;
@@ -96,7 +96,7 @@ class TenantSqliteRepository {
96
96
  items: tenants
97
97
  };
98
98
  }
99
- async find({ cursor = false, limit = 0, orderBy = '', order = false, search = '', filters = [] }) {
99
+ async find({ limit = 0, orderBy = '', order = false, search = '', filters = [] }) {
100
100
  let where = "";
101
101
  if (search) {
102
102
  where = ` WHERE name LIKE '%${search}%'`;