@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,5 +1,5 @@
1
1
  import { AbstractFastifyController } from "@drax/crud-back";
2
- import { ValidationError, UnauthorizedError } from "@drax/common-back";
2
+ import { NotFoundError } from "@drax/common-back";
3
3
  import RoleServiceFactory from "../factory/RoleServiceFactory.js";
4
4
  import RolePermissions from "../permissions/RolePermissions.js";
5
5
  import PermissionService from "../services/PermissionService.js";
@@ -13,22 +13,13 @@ class RoleController extends AbstractFastifyController {
13
13
  const name = request.params.name;
14
14
  const roleService = RoleServiceFactory();
15
15
  let role = await roleService.findByName(name);
16
+ if (!role) {
17
+ throw new NotFoundError();
18
+ }
16
19
  return role;
17
20
  }
18
21
  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
- }
22
+ this.handleError(e, reply);
32
23
  }
33
24
  }
34
25
  async all(request, reply) {
@@ -37,26 +28,14 @@ class RoleController extends AbstractFastifyController {
37
28
  const roleService = RoleServiceFactory();
38
29
  let roles = await roleService.fetchAll();
39
30
  if (request.rbac.getRole?.childRoles?.length > 0) {
40
- return roles.filter(role => request.rbac.getRole.childRoles.some(childRole => childRole.id === role.id));
31
+ return roles.filter(role => request.rbac.getRole.childRoles.some(childRole => childRole._id === role._id));
41
32
  }
42
33
  else {
43
34
  return roles;
44
35
  }
45
36
  }
46
37
  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
- }
38
+ this.handleError(e, reply);
60
39
  }
61
40
  }
62
41
  async permissions(request, reply) {
@@ -66,19 +45,9 @@ class RoleController extends AbstractFastifyController {
66
45
  return permissions;
67
46
  }
68
47
  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
- }
48
+ this.handleError(e, reply);
78
49
  }
79
50
  }
80
- async xxxx(request, reply) {
81
- }
82
51
  }
83
52
  export default RoleController;
84
53
  export { RoleController };
@@ -6,39 +6,12 @@ class TenantController extends AbstractFastifyController {
6
6
  constructor() {
7
7
  super(TenantServiceFactory(), TenantPermissions);
8
8
  }
9
- async findByName(request, reply) {
10
- try {
11
- request.rbac.assertPermission(this.permission.View);
12
- if (!request.params.id) {
13
- reply.statusCode = 400;
14
- reply.send({ error: 'BAD REQUEST' });
15
- }
16
- const name = request.params.name;
17
- let item = await this.service.findByName(name);
18
- return item;
19
- }
20
- catch (e) {
21
- console.error(e);
22
- if (e instanceof ValidationError) {
23
- reply.statusCode = e.statusCode;
24
- reply.send({ error: e.message, inputErrors: e.errors });
25
- }
26
- else if (e instanceof UnauthorizedError) {
27
- reply.statusCode = e.statusCode;
28
- reply.send({ error: e.message });
29
- }
30
- else {
31
- reply.statusCode = 500;
32
- reply.send({ error: 'INTERNAL_SERVER_ERROR' });
33
- }
34
- }
35
- }
36
9
  async all(request, reply) {
37
10
  try {
38
11
  request.rbac.assertPermission(this.permission.View);
39
12
  let tenants = await this.service.fetchAll();
40
13
  if (request.rbac.getAuthUser.tenantId) {
41
- return tenants.filter(t => t.id === request.rbac.getAuthUser.tenantId);
14
+ return tenants.filter(t => t._id === request.rbac.getAuthUser.tenantId);
42
15
  }
43
16
  else {
44
17
  return tenants;
@@ -15,7 +15,7 @@ class UserApiKeyController extends AbstractFastifyController {
15
15
  ]);
16
16
  const filters = [];
17
17
  if (!request.rbac.hasPermission(UserApiKeyPermissions.View)) {
18
- filters.push({ field: "user", operator: "eq", value: request.rbac.authUser.id });
18
+ filters.push({ field: "user", operator: "eq", value: request.rbac.userId });
19
19
  }
20
20
  const page = request.query.page;
21
21
  const limit = request.query.limit;
@@ -44,9 +44,12 @@ class UserApiKeyController extends AbstractFastifyController {
44
44
  }
45
45
  async create(request, reply) {
46
46
  try {
47
- request.rbac.assertPermission(UserApiKeyPermissions.Create);
47
+ request.rbac.assertOrPermissions([UserApiKeyPermissions.Create, UserApiKeyPermissions.CreateMy]);
48
48
  const payload = request.body;
49
- payload.user = request.rbac.authUser.id;
49
+ if (!request.rbac.hasPermission(UserApiKeyPermissions.Create) || !payload.user) {
50
+ payload.user = request.rbac.userId;
51
+ }
52
+ payload.createdBy = request.rbac.userId;
50
53
  const userApiKeyService = UserApiKeyServiceFactory();
51
54
  let userApiKey = await userApiKeyService.create(payload);
52
55
  return userApiKey;
@@ -1,6 +1,6 @@
1
1
  import { AbstractFastifyController } from "@drax/crud-back";
2
2
  import RegistrationCompleteHtml from "../html/RegistrationCompleteHtml.js";
3
- import { CommonConfig, DraxConfig, StoreManager, UploadFileError, ValidationError, UnauthorizedError, SecuritySensitiveError } from "@drax/common-back";
3
+ import { CommonConfig, DraxConfig, StoreManager, ValidationError, UnauthorizedError, } from "@drax/common-back";
4
4
  import UserServiceFactory from "../factory/UserServiceFactory.js";
5
5
  import RoleServiceFactory from "../factory/RoleServiceFactory.js";
6
6
  import UserPermissions from "../permissions/UserPermissions.js";
@@ -25,8 +25,8 @@ class UserController extends AbstractFastifyController {
25
25
  catch (e) {
26
26
  console.error('/api/auth error', e);
27
27
  if (e instanceof BadCredentialsError) {
28
- reply.code(401);
29
- reply.send({ error: e.message });
28
+ reply.code(e.statusCode);
29
+ reply.send(e.body);
30
30
  }
31
31
  reply.code(500);
32
32
  reply.send({ error: 'error.server' });
@@ -36,7 +36,7 @@ class UserController extends AbstractFastifyController {
36
36
  try {
37
37
  if (request.authUser) {
38
38
  const userService = UserServiceFactory();
39
- let user = await userService.findById(request.authUser.id);
39
+ let user = await userService.findById(request.rbac.userId);
40
40
  user.password = undefined;
41
41
  delete user.password;
42
42
  return user;
@@ -46,18 +46,7 @@ class UserController extends AbstractFastifyController {
46
46
  }
47
47
  }
48
48
  catch (e) {
49
- if (e instanceof UnauthorizedError) {
50
- reply.code(401);
51
- reply.send({ error: "Unauthorized" });
52
- }
53
- else if (e instanceof UnauthorizedError) {
54
- reply.statusCode = e.statusCode;
55
- reply.send({ error: e.message });
56
- }
57
- else {
58
- reply.statusCode = 500;
59
- reply.send({ error: 'error.server' });
60
- }
49
+ this.handleError(e, reply);
61
50
  }
62
51
  }
63
52
  async paginate(request, reply) {
@@ -69,7 +58,7 @@ class UserController extends AbstractFastifyController {
69
58
  const order = request.query.order;
70
59
  const search = request.query.search;
71
60
  const userService = UserServiceFactory();
72
- const filters = [];
61
+ const filters = this.parseFilters(request.query.filters);
73
62
  if (request.rbac.getAuthUser.tenantId) {
74
63
  filters.push({ field: 'tenant', operator: 'eq', value: request.rbac.getAuthUser.tenantId });
75
64
  }
@@ -81,18 +70,7 @@ class UserController extends AbstractFastifyController {
81
70
  return paginateResult;
82
71
  }
83
72
  catch (e) {
84
- if (e instanceof ValidationError) {
85
- reply.statusCode = e.statusCode;
86
- reply.send({ error: e.message, inputErrors: e.errors });
87
- }
88
- else if (e instanceof UnauthorizedError) {
89
- reply.statusCode = e.statusCode;
90
- reply.send({ error: e.message });
91
- }
92
- else {
93
- reply.statusCode = 500;
94
- reply.send({ error: 'error.server' });
95
- }
73
+ this.handleError(e, reply);
96
74
  }
97
75
  }
98
76
  async search(request, reply) {
@@ -107,19 +85,7 @@ class UserController extends AbstractFastifyController {
107
85
  return item;
108
86
  }
109
87
  catch (e) {
110
- console.error(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: 'INTERNAL_SERVER_ERROR' });
122
- }
88
+ this.handleError(e, reply);
123
89
  }
124
90
  }
125
91
  async register(request, reply) {
@@ -140,28 +106,21 @@ class UserController extends AbstractFastifyController {
140
106
  else if (role.name === 'Admin') {
141
107
  payload.tenant = null;
142
108
  }
143
- payload.role = role.id;
109
+ payload.role = role._id.toString();
144
110
  payload.origin ?? (payload.origin = 'Registry');
145
111
  const userService = UserServiceFactory();
146
112
  let user = await userService.register(payload);
147
- //SEND EMAIL FOR EMAIL VERIFICATION
148
- await UserEmailService.emailVerifyCode(user.emailCode, user.email);
149
- return user;
113
+ if (user) {
114
+ //SEND EMAIL FOR EMAIL VERIFICATION
115
+ await UserEmailService.emailVerifyCode(user.emailCode, user.email);
116
+ return {
117
+ success: true,
118
+ message: 'User registered successfully.'
119
+ };
120
+ }
150
121
  }
151
122
  catch (e) {
152
- console.error(e);
153
- if (e instanceof ValidationError) {
154
- reply.statusCode = e.statusCode;
155
- reply.send({ error: e.message, inputErrors: e.errors });
156
- }
157
- else if (e instanceof UnauthorizedError) {
158
- reply.statusCode = e.statusCode;
159
- reply.send({ error: e.message });
160
- }
161
- else {
162
- reply.statusCode = 500;
163
- reply.send({ error: 'error.server' });
164
- }
123
+ this.handleError(e, reply);
165
124
  }
166
125
  }
167
126
  async verifyEmail(request, reply) {
@@ -175,13 +134,7 @@ class UserController extends AbstractFastifyController {
175
134
  }
176
135
  }
177
136
  catch (e) {
178
- console.error(e);
179
- if (e instanceof ValidationError) {
180
- reply.statusCode = e.statusCode;
181
- reply.send({ error: e.message, inputErrors: e.errors });
182
- }
183
- reply.code(500);
184
- reply.send({ error: 'error.server' });
137
+ this.handleError(e, reply);
185
138
  }
186
139
  }
187
140
  async verifyPhone(request, reply) {
@@ -191,28 +144,14 @@ class UserController extends AbstractFastifyController {
191
144
  return await userService.verifyPhone(phoneCode);
192
145
  }
193
146
  catch (e) {
194
- console.error(e);
195
- if (e instanceof ValidationError) {
196
- reply.statusCode = e.statusCode;
197
- reply.send({ error: e.message, inputErrors: e.errors });
198
- }
199
- reply.code(500);
200
- reply.send({ error: 'error.server' });
147
+ this.handleError(e, reply);
201
148
  }
202
149
  }
203
150
  async create(request, reply) {
204
151
  try {
205
152
  request.rbac.assertPermission(UserPermissions.Create);
206
153
  const payload = request.body;
207
- const roleService = RoleServiceFactory();
208
- const role = await roleService.findById(payload.role);
209
- if (!role) {
210
- throw new ValidationError([{ field: 'role', reason: 'Role not found' }]);
211
- }
212
- else if (role.name === 'Admin') {
213
- payload.tenant = null;
214
- }
215
- else if (request.rbac.getAuthUser.tenantId) {
154
+ if (request.rbac.getAuthUser.tenantId) {
216
155
  payload.tenant = request.rbac.getAuthUser.tenantId;
217
156
  }
218
157
  payload.origin ?? (payload.origin = 'Admin');
@@ -221,19 +160,7 @@ class UserController extends AbstractFastifyController {
221
160
  return user;
222
161
  }
223
162
  catch (e) {
224
- console.error(e);
225
- if (e instanceof ValidationError) {
226
- reply.statusCode = e.statusCode;
227
- reply.send({ error: e.message, inputErrors: e.errors });
228
- }
229
- else if (e instanceof UnauthorizedError) {
230
- reply.statusCode = e.statusCode;
231
- reply.send({ error: e.message });
232
- }
233
- else {
234
- reply.statusCode = 500;
235
- reply.send({ error: 'error.server' });
236
- }
163
+ this.handleError(e, reply);
237
164
  }
238
165
  }
239
166
  async update(request, reply) {
@@ -241,15 +168,7 @@ class UserController extends AbstractFastifyController {
241
168
  request.rbac.assertPermission(UserPermissions.Update);
242
169
  const id = request.params.id;
243
170
  const payload = request.body;
244
- const roleService = RoleServiceFactory();
245
- const role = await roleService.findById(payload.role);
246
- if (!role) {
247
- throw new ValidationError([{ field: 'role', reason: 'Role not found' }]);
248
- }
249
- else if (role.name === 'Admin') {
250
- payload.tenant = null;
251
- }
252
- else if (request.rbac.getAuthUser.tenantId) {
171
+ if (request.rbac.getAuthUser.tenantId) {
253
172
  payload.tenant = request.rbac.getAuthUser.tenantId;
254
173
  }
255
174
  const userService = UserServiceFactory();
@@ -257,23 +176,7 @@ class UserController extends AbstractFastifyController {
257
176
  return user;
258
177
  }
259
178
  catch (e) {
260
- console.error(e);
261
- if (e instanceof ValidationError) {
262
- reply.statusCode = e.statusCode;
263
- reply.send({ error: e.message, inputErrors: e.errors });
264
- }
265
- if (e instanceof UnauthorizedError) {
266
- reply.statusCode = e.statusCode;
267
- reply.send({ error: e.message });
268
- }
269
- else if (e instanceof UnauthorizedError) {
270
- reply.statusCode = e.statusCode;
271
- reply.send({ error: e.message });
272
- }
273
- else {
274
- reply.statusCode = 500;
275
- reply.send({ error: 'error.server' });
276
- }
179
+ this.handleError(e, reply);
277
180
  }
278
181
  }
279
182
  async delete(request, reply) {
@@ -283,26 +186,24 @@ class UserController extends AbstractFastifyController {
283
186
  const userService = UserServiceFactory();
284
187
  let r = await userService.delete(id);
285
188
  if (r) {
286
- reply.send({ message: 'Deleted successfully' });
189
+ reply.send({
190
+ id: id,
191
+ message: 'Item deleted successfully',
192
+ deleted: true,
193
+ deletedAt: new Date(),
194
+ });
287
195
  }
288
196
  else {
289
- reply.statusCode(400).send({ message: 'Not deleted' });
197
+ reply.send({
198
+ id: id,
199
+ message: 'Item not deleted',
200
+ deleted: false,
201
+ deletedAt: new Date(),
202
+ });
290
203
  }
291
204
  }
292
205
  catch (e) {
293
- console.error(e);
294
- if (e instanceof ValidationError) {
295
- reply.statusCode = e.statusCode;
296
- reply.send({ error: e.message, inputErrors: e.errors });
297
- }
298
- else if (e instanceof UnauthorizedError) {
299
- reply.statusCode = e.statusCode;
300
- reply.send({ error: e.message });
301
- }
302
- else {
303
- reply.statusCode = 500;
304
- reply.send({ error: 'error.server' });
305
- }
206
+ this.handleError(e, reply);
306
207
  }
307
208
  }
308
209
  async passwordRecoveryRequest(request, reply) {
@@ -322,19 +223,7 @@ class UserController extends AbstractFastifyController {
322
223
  reply.send({ message });
323
224
  }
324
225
  catch (e) {
325
- console.error('recoveryPassword error', e);
326
- if (e instanceof ValidationError) {
327
- reply.statusCode = e.statusCode;
328
- reply.send({ error: e.message, inputErrors: e.errors });
329
- }
330
- else if (e instanceof SecuritySensitiveError) {
331
- reply.statusCode = e.statusCode;
332
- reply.send({ message });
333
- }
334
- else {
335
- reply.statusCode = 500;
336
- reply.send({ error: 'error.server' });
337
- }
226
+ this.handleError(e, reply);
338
227
  }
339
228
  }
340
229
  async recoveryPasswordComplete(request, reply) {
@@ -358,15 +247,7 @@ class UserController extends AbstractFastifyController {
358
247
  }
359
248
  }
360
249
  catch (e) {
361
- console.error('recoveryPassword error', e);
362
- if (e instanceof ValidationError) {
363
- reply.statusCode = e.statusCode;
364
- reply.send({ error: e.message, inputErrors: e.errors });
365
- }
366
- else {
367
- reply.statusCode = 500;
368
- reply.send({ error: 'error.server' });
369
- }
250
+ this.handleError(e, reply);
370
251
  }
371
252
  }
372
253
  async changeMyPassword(request, reply) {
@@ -378,22 +259,11 @@ class UserController extends AbstractFastifyController {
378
259
  const currentPassword = request.body.currentPassword;
379
260
  const newPassword = request.body.newPassword;
380
261
  const userService = UserServiceFactory();
381
- return await userService.changeOwnPassword(userId, currentPassword, newPassword);
262
+ await userService.changeOwnPassword(userId, currentPassword, newPassword);
263
+ return { message: 'Password updated successfully' };
382
264
  }
383
265
  catch (e) {
384
- console.error('changeMyPassword error', e);
385
- if (e instanceof ValidationError) {
386
- reply.statusCode = e.statusCode;
387
- reply.send({ error: e.message, inputErrors: e.errors });
388
- }
389
- else if (e instanceof UnauthorizedError) {
390
- reply.statusCode = e.statusCode;
391
- reply.send({ error: e.message });
392
- }
393
- else {
394
- reply.statusCode = 500;
395
- reply.send({ error: 'error.server' });
396
- }
266
+ this.handleError(e, reply);
397
267
  }
398
268
  }
399
269
  async changePassword(request, reply) {
@@ -405,28 +275,17 @@ class UserController extends AbstractFastifyController {
405
275
  }
406
276
  const newPassword = request.body.newPassword;
407
277
  const userService = UserServiceFactory();
408
- return await userService.changeUserPassword(userId, newPassword);
278
+ await userService.changeUserPassword(userId, newPassword);
279
+ return { message: 'Password updated successfully' };
409
280
  }
410
281
  catch (e) {
411
- console.error('/api/password error', e);
412
- if (e instanceof ValidationError) {
413
- reply.statusCode = e.statusCode;
414
- reply.send({ error: e.message, inputErrors: e.errors });
415
- }
416
- else if (e instanceof UnauthorizedError) {
417
- reply.statusCode = e.statusCode;
418
- reply.send({ error: e.message });
419
- }
420
- else {
421
- reply.statusCode = 500;
422
- reply.send({ error: 'error.server' });
423
- }
282
+ this.handleError(e, reply);
424
283
  }
425
284
  }
426
285
  async updateAvatar(request, reply) {
427
286
  try {
428
287
  request.rbac.assertAuthenticated();
429
- const userId = request.rbac.getAuthUser.id;
288
+ const userId = request.rbac.userId;
430
289
  const data = await request.file();
431
290
  const file = {
432
291
  filename: data.filename,
@@ -447,19 +306,7 @@ class UserController extends AbstractFastifyController {
447
306
  };
448
307
  }
449
308
  catch (e) {
450
- console.error(e);
451
- if (e instanceof UploadFileError) {
452
- reply.statusCode = e.statusCode;
453
- reply.send({ error: e.message });
454
- }
455
- else if (e instanceof UnauthorizedError) {
456
- reply.statusCode = e.statusCode;
457
- reply.send({ error: e.message });
458
- }
459
- else {
460
- reply.statusCode = 500;
461
- reply.send({ error: 'INTERNAL_SERVER_ERROR' });
462
- }
309
+ this.handleError(e, reply);
463
310
  }
464
311
  }
465
312
  async getAvatar(request, reply) {
@@ -471,15 +318,7 @@ class UserController extends AbstractFastifyController {
471
318
  return reply.sendFile(filename, fileDir);
472
319
  }
473
320
  catch (e) {
474
- console.error(e);
475
- if (e instanceof UnauthorizedError) {
476
- reply.statusCode = e.statusCode;
477
- reply.send({ error: e.message });
478
- }
479
- else {
480
- reply.statusCode = 500;
481
- reply.send({ error: 'INTERNAL_SERVER_ERROR' });
482
- }
321
+ this.handleError(e, reply);
483
322
  }
484
323
  }
485
324
  }
@@ -2,9 +2,21 @@ class BadCredentialsError extends Error {
2
2
  constructor() {
3
3
  super('error.badCredentials');
4
4
  this.name = 'BadCredentialsError';
5
+ this.message = 'error.badCredentials';
5
6
  }
6
7
  get statusCode() {
7
8
  return 401;
8
9
  }
10
+ get i18nMessage() {
11
+ return 'error.badCredentials';
12
+ }
13
+ get body() {
14
+ return {
15
+ statusCode: this.statusCode,
16
+ error: this.name,
17
+ message: this.message,
18
+ i18nMessage: this.i18nMessage,
19
+ };
20
+ }
9
21
  }
10
22
  export default BadCredentialsError;
@@ -13,6 +13,7 @@ const RoleServiceFactory = (verbose = false) => {
13
13
  case COMMON.DB_ENGINES.SQLITE:
14
14
  const dbFile = DraxConfig.getOrLoad(CommonConfig.SqliteDbFile);
15
15
  roleRepository = new RoleSqliteRepository(dbFile, verbose);
16
+ roleRepository.build();
16
17
  break;
17
18
  default:
18
19
  throw new Error("DraxConfig.DB_ENGINE must be one of " + Object.values(COMMON.DB_ENGINES).join(", "));
@@ -13,6 +13,7 @@ const TenantServiceFactory = (verbose = false) => {
13
13
  case COMMON.DB_ENGINES.SQLITE:
14
14
  const dbFile = DraxConfig.getOrLoad(CommonConfig.SqliteDbFile);
15
15
  tenantRepository = new TenantSqliteRepository(dbFile, verbose);
16
+ tenantRepository.build();
16
17
  break;
17
18
  default:
18
19
  throw new Error("DraxConfig.DB_ENGINE must be one of " + Object.values(COMMON.DB_ENGINES).join(", "));
@@ -5,19 +5,20 @@ import { COMMON, CommonConfig, DraxConfig } from "@drax/common-back";
5
5
  let userService;
6
6
  const UserApiKeyServiceFactory = (verbose = false) => {
7
7
  if (!userService) {
8
- let userRepository;
8
+ let userApiKeyRepository;
9
9
  switch (DraxConfig.getOrLoad(CommonConfig.DbEngine)) {
10
10
  case COMMON.DB_ENGINES.MONGODB:
11
- userRepository = new UserApiKeyMongoRepository();
11
+ userApiKeyRepository = new UserApiKeyMongoRepository();
12
12
  break;
13
13
  case COMMON.DB_ENGINES.SQLITE:
14
14
  const dbFile = DraxConfig.getOrLoad(CommonConfig.SqliteDbFile);
15
- userRepository = new UserApiKeySqliteRepository(dbFile, verbose);
15
+ userApiKeyRepository = new UserApiKeySqliteRepository(dbFile, verbose);
16
+ userApiKeyRepository.build();
16
17
  break;
17
18
  default:
18
19
  throw new Error("DraxConfig.DB_ENGINE must be one of " + Object.values(COMMON.DB_ENGINES).join(", "));
19
20
  }
20
- userService = new UserApiKeyService(userRepository);
21
+ userService = new UserApiKeyService(userApiKeyRepository);
21
22
  }
22
23
  return userService;
23
24
  };
@@ -13,6 +13,7 @@ const UserServiceFactory = (verbose = false) => {
13
13
  case COMMON.DB_ENGINES.SQLITE:
14
14
  const dbFile = DraxConfig.getOrLoad(CommonConfig.SqliteDbFile);
15
15
  userRepository = new UserSqliteRepository(dbFile, verbose);
16
+ userRepository.build();
16
17
  break;
17
18
  default:
18
19
  throw new Error("DraxConfig.DB_ENGINE must be one of " + Object.values(COMMON.DB_ENGINES).join(", "));
@@ -37,7 +37,7 @@ export default {
37
37
  const roleService = RoleServiceFactory();
38
38
  const roles = await roleService.fetchAll();
39
39
  if (rbac.getRole?.childRoles?.length > 0) {
40
- return roles.filter(role => rbac.getRole.childRoles.some(childRole => childRole.id === role.id));
40
+ return roles.filter(role => rbac.getRole.childRoles.some(childRole => childRole._id === role._id));
41
41
  }
42
42
  else {
43
43
  return roles;
@@ -63,7 +63,7 @@ export default {
63
63
  throw new GraphQLError('error.server');
64
64
  }
65
65
  },
66
- paginateRole: async (_, { options = { page: 1, limit: 5, orderBy: "", order: false, search: "", filters: [] } }, { rbac }) => {
66
+ paginateRole: async (_, { options = { page: 1, limit: 5, orderBy: "", order: "asc", search: "", filters: [] } }, { rbac }) => {
67
67
  try {
68
68
  rbac.assertPermission(IdentityPermissions.ViewRole);
69
69
  const roleService = RoleServiceFactory();
@@ -36,7 +36,7 @@ export default {
36
36
  const tenantService = TenantServiceFactory();
37
37
  const tenants = await tenantService.fetchAll();
38
38
  if (rbac.getAuthUser.tenantId) {
39
- return tenants.filter(t => t.id === rbac.getAuthUser.tenantId);
39
+ return tenants.filter(t => t._id === rbac.getAuthUser.tenantId);
40
40
  }
41
41
  else {
42
42
  return tenants;
@@ -49,7 +49,7 @@ export default {
49
49
  throw new GraphQLError('error.server');
50
50
  }
51
51
  },
52
- paginateTenant: async (_, { options = { page: 1, limit: 5, orderBy: "", order: false, search: "", filters: [] } }, { rbac }) => {
52
+ paginateTenant: async (_, { options = { page: 1, limit: 5, orderBy: "", order: "asc", search: "", filters: [] } }, { rbac }) => {
53
53
  try {
54
54
  rbac.assertPermission(IdentityPermissions.ViewTenant);
55
55
  const tenantService = TenantServiceFactory();