@drax/identity-back 0.11.5 → 0.12.2

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 (224) hide show
  1. package/dist/controllers/RoleController.js +8 -39
  2. package/dist/controllers/TenantController.js +1 -28
  3. package/dist/controllers/UserApiKeyController.js +3 -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/index.js +6 -0
  15. package/dist/middleware/apiKeyMiddleware.js +2 -2
  16. package/dist/models/RoleModel.js +10 -7
  17. package/dist/models/TenantModel.js +11 -8
  18. package/dist/models/UserApiKeyModel.js +10 -7
  19. package/dist/models/UserGroupModel.js +7 -7
  20. package/dist/models/UserModel.js +10 -8
  21. package/dist/rbac/Rbac.js +10 -8
  22. package/dist/repository/mongo/RoleMongoRepository.js +20 -65
  23. package/dist/repository/mongo/TenantMongoRepository.js +18 -66
  24. package/dist/repository/mongo/UserApiKeyMongoRepository.js +29 -47
  25. package/dist/repository/mongo/UserMongoRepository.js +56 -85
  26. package/dist/repository/sqlite/RoleSqliteRepository.js +30 -115
  27. package/dist/repository/sqlite/TenantSqliteRepository.js +15 -105
  28. package/dist/repository/sqlite/UserApiKeySqliteRepository.js +42 -117
  29. package/dist/repository/sqlite/UserSqliteRepository.js +49 -130
  30. package/dist/routes/RoleRoutes.js +35 -10
  31. package/dist/routes/TenantRoutes.js +18 -9
  32. package/dist/routes/UserApiKeyRoutes.js +20 -4
  33. package/dist/routes/UserRoutes.js +92 -17
  34. package/dist/schemas/LoginSchema.js +9 -0
  35. package/dist/schemas/PasswordSchema.js +12 -0
  36. package/dist/schemas/RegisterSchema.js +19 -0
  37. package/dist/schemas/RoleSchema.js +23 -0
  38. package/dist/schemas/TenantSchema.js +13 -0
  39. package/dist/schemas/UserApiKeySchema.js +14 -0
  40. package/dist/schemas/UserSchema.js +39 -0
  41. package/dist/services/PermissionService.js +5 -5
  42. package/dist/services/RoleService.js +6 -6
  43. package/dist/services/TenantService.js +6 -6
  44. package/dist/services/UserApiKeyService.js +5 -5
  45. package/dist/services/UserService.js +14 -14
  46. package/dist/setup/CreateOrUpdateRole.js +5 -2
  47. package/dist/setup/CreateUserIfNotExist.js +3 -1
  48. package/dist/setup/RecoveryUserPassword.js +1 -1
  49. package/dist/zod/EndpointZod.js +9 -0
  50. package/dist/zod/TenantSchema.js +12 -0
  51. package/dist/zod/TenantZod.js +5 -3
  52. package/dist/zod/UserApiKeyZod.js +7 -3
  53. package/package.json +10 -9
  54. package/src/controllers/RoleController.ts +8 -36
  55. package/src/controllers/TenantController.ts +2 -25
  56. package/src/controllers/UserApiKeyController.ts +3 -3
  57. package/src/controllers/UserController.ts +50 -183
  58. package/src/errors/BadCredentialsError.ts +18 -1
  59. package/src/factory/RoleServiceFactory.ts +1 -0
  60. package/src/factory/TenantServiceFactory.ts +1 -0
  61. package/src/factory/UserApiKeyServiceFactory.ts +5 -4
  62. package/src/factory/UserServiceFactory.ts +1 -0
  63. package/src/graphql/resolvers/role.resolvers.ts +3 -2
  64. package/src/graphql/resolvers/tenant.resolvers.ts +3 -2
  65. package/src/graphql/resolvers/user-api-key.resolvers.ts +3 -2
  66. package/src/graphql/resolvers/user.resolvers.ts +2 -1
  67. package/src/index.ts +16 -0
  68. package/src/interfaces/ITenantRepository.ts +2 -2
  69. package/src/interfaces/IUserApiKeyRepository.ts +2 -2
  70. package/src/interfaces/IUserRepository.ts +3 -2
  71. package/src/middleware/apiKeyMiddleware.ts +2 -2
  72. package/src/models/RoleModel.ts +12 -7
  73. package/src/models/TenantModel.ts +13 -8
  74. package/src/models/UserApiKeyModel.ts +12 -7
  75. package/src/models/UserGroupModel.ts +7 -7
  76. package/src/models/UserModel.ts +10 -8
  77. package/src/rbac/Rbac.ts +12 -9
  78. package/src/repository/mongo/RoleMongoRepository.ts +23 -94
  79. package/src/repository/mongo/TenantMongoRepository.ts +19 -98
  80. package/src/repository/mongo/UserApiKeyMongoRepository.ts +31 -56
  81. package/src/repository/mongo/UserMongoRepository.ts +71 -130
  82. package/src/repository/sqlite/RoleSqliteRepository.ts +37 -146
  83. package/src/repository/sqlite/TenantSqliteRepository.ts +16 -156
  84. package/src/repository/sqlite/UserApiKeySqliteRepository.ts +46 -151
  85. package/src/repository/sqlite/UserSqliteRepository.ts +59 -173
  86. package/src/routes/RoleRoutes.ts +35 -12
  87. package/src/routes/TenantRoutes.ts +25 -9
  88. package/src/routes/UserApiKeyRoutes.ts +23 -7
  89. package/src/routes/UserRoutes.ts +117 -34
  90. package/src/schemas/LoginSchema.ts +12 -0
  91. package/src/schemas/PasswordSchema.ts +16 -0
  92. package/src/{zod/UserZod.ts → schemas/RegisterSchema.ts} +7 -10
  93. package/src/schemas/RoleSchema.ts +29 -0
  94. package/src/schemas/TenantSchema.ts +22 -0
  95. package/src/{zod/UserApiKeyZod.ts → schemas/UserApiKeySchema.ts} +8 -3
  96. package/src/schemas/UserSchema.ts +57 -0
  97. package/src/services/PermissionService.ts +6 -5
  98. package/src/services/RoleService.ts +6 -6
  99. package/src/services/TenantService.ts +10 -10
  100. package/src/services/UserApiKeyService.ts +5 -5
  101. package/src/services/UserService.ts +15 -16
  102. package/src/setup/CreateOrUpdateRole.ts +7 -4
  103. package/src/setup/CreateUserIfNotExist.ts +5 -3
  104. package/src/setup/RecoveryUserPassword.ts +1 -1
  105. package/test/data-obj/apikey/root-mongo-user-apikey.ts +2 -1
  106. package/test/data-obj/roles/admin-sqlite-role.ts +2 -2
  107. package/test/data-obj/roles/operator-sqlite-role.ts +1 -1
  108. package/test/data-obj/tenants/company-sqlite-tenant.ts +6 -0
  109. package/test/data-obj/users/root-sqlite-user.ts +2 -2
  110. package/test/initializers/RoleSqliteInitializer.ts +1 -1
  111. package/test/repository/mongo/role-mongo-repository.test.ts +3 -3
  112. package/test/repository/mongo/user-apikey-mongo-repository.test.ts +5 -4
  113. package/test/repository/mongo/user-mongo-repository.test.ts +4 -4
  114. package/test/repository/sqlite/role-sqlite-repository.test.ts +21 -9
  115. package/test/repository/sqlite/tenant-sqlite-repository.test.ts +74 -0
  116. package/test/repository/sqlite/user-sqlite-repository.test.ts +15 -9
  117. package/test/routes/data/admin-role.ts +10 -0
  118. package/test/routes/data/root-user.ts +13 -0
  119. package/test/routes/helpers/CreateRootUserAndAdminRole.ts +17 -0
  120. package/test/routes/helpers/FastifyTestServerFactory.ts +34 -0
  121. package/test/routes/helpers/InitializePermissions.ts +23 -0
  122. package/test/routes/helpers/SetupIdentityDrax.ts +22 -0
  123. package/test/routes/tenant-route.test.ts +336 -0
  124. package/test/routes/user-route.test.ts +186 -0
  125. package/test/schemas/lab-schema.test.ts +110 -0
  126. package/test/service/mock-service.test.ts +3 -3
  127. package/test/service/role-service.test.ts +3 -3
  128. package/test/service/user-service.test.ts +16 -25
  129. package/test.db +0 -0
  130. package/tsconfig.tsbuildinfo +1 -1
  131. package/types/controllers/RoleController.d.ts +0 -1
  132. package/types/controllers/RoleController.d.ts.map +1 -1
  133. package/types/controllers/TenantController.d.ts +0 -1
  134. package/types/controllers/TenantController.d.ts.map +1 -1
  135. package/types/controllers/UserController.d.ts +11 -4
  136. package/types/controllers/UserController.d.ts.map +1 -1
  137. package/types/errors/BadCredentialsError.d.ts +9 -1
  138. package/types/errors/BadCredentialsError.d.ts.map +1 -1
  139. package/types/factory/RoleServiceFactory.d.ts.map +1 -1
  140. package/types/factory/TenantServiceFactory.d.ts.map +1 -1
  141. package/types/factory/UserApiKeyServiceFactory.d.ts.map +1 -1
  142. package/types/factory/UserServiceFactory.d.ts.map +1 -1
  143. package/types/graphql/resolvers/role.resolvers.d.ts +3 -9
  144. package/types/graphql/resolvers/role.resolvers.d.ts.map +1 -1
  145. package/types/graphql/resolvers/tenant.resolvers.d.ts +3 -9
  146. package/types/graphql/resolvers/tenant.resolvers.d.ts.map +1 -1
  147. package/types/graphql/resolvers/user-api-key.resolvers.d.ts +3 -9
  148. package/types/graphql/resolvers/user-api-key.resolvers.d.ts.map +1 -1
  149. package/types/graphql/resolvers/user.resolvers.d.ts +3 -9
  150. package/types/graphql/resolvers/user.resolvers.d.ts.map +1 -1
  151. package/types/index.d.ts +5 -1
  152. package/types/index.d.ts.map +1 -1
  153. package/types/interfaces/ITenantRepository.d.ts +2 -2
  154. package/types/interfaces/ITenantRepository.d.ts.map +1 -1
  155. package/types/interfaces/IUserApiKeyRepository.d.ts +2 -2
  156. package/types/interfaces/IUserApiKeyRepository.d.ts.map +1 -1
  157. package/types/interfaces/IUserRepository.d.ts +3 -2
  158. package/types/interfaces/IUserRepository.d.ts.map +1 -1
  159. package/types/models/RoleModel.d.ts +7 -7
  160. package/types/models/RoleModel.d.ts.map +1 -1
  161. package/types/models/TenantModel.d.ts +7 -7
  162. package/types/models/TenantModel.d.ts.map +1 -1
  163. package/types/models/UserApiKeyModel.d.ts +7 -7
  164. package/types/models/UserApiKeyModel.d.ts.map +1 -1
  165. package/types/models/UserGroupModel.d.ts +2 -2
  166. package/types/models/UserGroupModel.d.ts.map +1 -1
  167. package/types/models/UserModel.d.ts +7 -7
  168. package/types/models/UserModel.d.ts.map +1 -1
  169. package/types/rbac/Rbac.d.ts +1 -1
  170. package/types/rbac/Rbac.d.ts.map +1 -1
  171. package/types/repository/mongo/RoleMongoRepository.d.ts +9 -11
  172. package/types/repository/mongo/RoleMongoRepository.d.ts.map +1 -1
  173. package/types/repository/mongo/TenantMongoRepository.d.ts +8 -11
  174. package/types/repository/mongo/TenantMongoRepository.d.ts.map +1 -1
  175. package/types/repository/mongo/UserApiKeyMongoRepository.d.ts +12 -5
  176. package/types/repository/mongo/UserApiKeyMongoRepository.d.ts.map +1 -1
  177. package/types/repository/mongo/UserMongoRepository.d.ts +11 -12
  178. package/types/repository/mongo/UserMongoRepository.d.ts.map +1 -1
  179. package/types/repository/sqlite/RoleSqliteRepository.d.ts +14 -14
  180. package/types/repository/sqlite/RoleSqliteRepository.d.ts.map +1 -1
  181. package/types/repository/sqlite/TenantSqliteRepository.d.ts +12 -14
  182. package/types/repository/sqlite/TenantSqliteRepository.d.ts.map +1 -1
  183. package/types/repository/sqlite/UserApiKeySqliteRepository.d.ts +15 -11
  184. package/types/repository/sqlite/UserApiKeySqliteRepository.d.ts.map +1 -1
  185. package/types/repository/sqlite/UserSqliteRepository.d.ts +15 -12
  186. package/types/repository/sqlite/UserSqliteRepository.d.ts.map +1 -1
  187. package/types/routes/RoleRoutes.d.ts.map +1 -1
  188. package/types/routes/TenantRoutes.d.ts.map +1 -1
  189. package/types/routes/UserApiKeyRoutes.d.ts.map +1 -1
  190. package/types/routes/UserRoutes.d.ts.map +1 -1
  191. package/types/schemas/LoginSchema.d.ts +20 -0
  192. package/types/schemas/LoginSchema.d.ts.map +1 -0
  193. package/types/schemas/PasswordSchema.d.ts +27 -0
  194. package/types/schemas/PasswordSchema.d.ts.map +1 -0
  195. package/types/schemas/RegisterSchema.d.ts +32 -0
  196. package/types/schemas/RegisterSchema.d.ts.map +1 -0
  197. package/types/schemas/RoleSchema.d.ts +67 -0
  198. package/types/schemas/RoleSchema.d.ts.map +1 -0
  199. package/types/schemas/TenantSchema.d.ts +29 -0
  200. package/types/schemas/TenantSchema.d.ts.map +1 -0
  201. package/types/schemas/UserApiKeySchema.d.ts +39 -0
  202. package/types/schemas/UserApiKeySchema.d.ts.map +1 -0
  203. package/types/schemas/UserSchema.d.ts +161 -0
  204. package/types/schemas/UserSchema.d.ts.map +1 -0
  205. package/types/services/PermissionService.d.ts +1 -0
  206. package/types/services/PermissionService.d.ts.map +1 -1
  207. package/types/services/TenantService.d.ts +3 -3
  208. package/types/services/TenantService.d.ts.map +1 -1
  209. package/types/services/UserService.d.ts.map +1 -1
  210. package/types/setup/CreateOrUpdateRole.d.ts +2 -2
  211. package/types/setup/CreateOrUpdateRole.d.ts.map +1 -1
  212. package/types/setup/CreateUserIfNotExist.d.ts +2 -2
  213. package/types/setup/CreateUserIfNotExist.d.ts.map +1 -1
  214. package/types/zod/EndpointZod.d.ts +20 -0
  215. package/types/zod/EndpointZod.d.ts.map +1 -0
  216. package/types/zod/TenantSchema.d.ts +26 -0
  217. package/types/zod/TenantSchema.d.ts.map +1 -0
  218. package/types/zod/TenantZod.d.ts +13 -3
  219. package/types/zod/TenantZod.d.ts.map +1 -1
  220. package/types/zod/UserApiKeyZod.d.ts +23 -3
  221. package/types/zod/UserApiKeyZod.d.ts.map +1 -1
  222. package/types/zod/UserZod.d.ts +6 -6
  223. package/src/zod/RoleZod.ts +0 -14
  224. package/src/zod/TenantZod.ts +0 -14
@@ -5,7 +5,7 @@ import { GraphQLError } from "graphql";
5
5
  import * as crypto from "node:crypto";
6
6
  export default {
7
7
  Query: {
8
- paginateUserApiKey: async (_, { options = { page: 1, limit: 5, orderBy: "", order: false, search: "", filters: [] } }, { rbac, authUser }) => {
8
+ paginateUserApiKey: async (_, { options = { page: 1, limit: 5, orderBy: "", order: "asc", search: "", filters: [] } }, { rbac, authUser }) => {
9
9
  try {
10
10
  rbac.assertAuthenticated();
11
11
  rbac.assertOrPermissions([
@@ -16,7 +16,7 @@ export default {
16
16
  options.filters = [];
17
17
  }
18
18
  if (!rbac.hasPermission(IdentityPermissions.ViewUserApiKey)) {
19
- options.filters.push({ field: "user", operator: "eq", value: rbac.authUser.id });
19
+ options.filters.push({ field: "user", operator: "eq", value: rbac.userId });
20
20
  }
21
21
  const userApiKeyService = UserApiKeyServiceFactory();
22
22
  return await userApiKeyService.paginate(options);
@@ -38,7 +38,7 @@ export default {
38
38
  throw new GraphQLError('error.server');
39
39
  }
40
40
  },
41
- paginateUser: async (_, { options = { page: 1, limit: 5, orderBy: "", order: false, search: "", filters: [] } }, { rbac }) => {
41
+ paginateUser: async (_, { options = { page: 1, limit: 5, orderBy: "", order: "asc", search: "", filters: [] } }, { rbac }) => {
42
42
  try {
43
43
  rbac.assertPermission(IdentityPermissions.ViewUser);
44
44
  let userService = UserServiceFactory();
package/dist/index.js CHANGED
@@ -27,10 +27,16 @@ import { RolePermissions } from "./permissions/RolePermissions.js";
27
27
  import { TenantPermissions } from "./permissions/TenantPermissions.js";
28
28
  import { UserPermissions } from "./permissions/UserPermissions.js";
29
29
  import { UserApiKeyPermissions } from "./permissions/UserApiKeyPermissions.js";
30
+ import { UserSchema, UserBaseSchema } from "./schemas/UserSchema.js";
31
+ import { TenantSchema, TenantBaseSchema } from "./schemas/TenantSchema.js";
32
+ import { RoleSchema, RoleBaseSchema } from "./schemas/RoleSchema.js";
33
+ import { UserApiKeySchema, UserApiKeyBaseSchema } from "./schemas/UserApiKeySchema.js";
30
34
  const graphqlMergeResult = await GraphqlMerge();
31
35
  const identityTypeDefs = await graphqlMergeResult.typeDefs;
32
36
  const identityResolvers = await graphqlMergeResult.resolvers;
33
37
  export {
38
+ //Schemas
39
+ UserSchema, UserBaseSchema, TenantSchema, TenantBaseSchema, RoleSchema, RoleBaseSchema, UserApiKeyBaseSchema, UserApiKeySchema,
34
40
  //Service
35
41
  UserService, RoleService, TenantService, PermissionService, Rbac,
36
42
  //Factories
@@ -22,8 +22,8 @@ async function apiKeyMiddleware(request, reply) {
22
22
  const userApiKey = await draxCache.getOrLoad(apiKey, userApiKeyLoader);
23
23
  if (userApiKey && userApiKey.user) {
24
24
  request.authUser = userApiKey.user;
25
- request.authUser.roleId = userApiKey.user.role.id;
26
- request.authUser.tenantId = userApiKey.user?.tenant?.id;
25
+ request.authUser.roleId = userApiKey.user.role._id;
26
+ request.authUser.tenantId = userApiKey.user?.tenant?._id;
27
27
  }
28
28
  }
29
29
  return;
@@ -2,7 +2,7 @@ import { mongoose, MongooseSoftDelete } from '@drax/common-back';
2
2
  import uniqueValidator from 'mongoose-unique-validator';
3
3
  import mongoosePaginate from 'mongoose-paginate-v2';
4
4
  const Schema = mongoose.Schema;
5
- const RoleSchema = new Schema({
5
+ const RoleMongoSchema = new Schema({
6
6
  name: {
7
7
  type: String, unique: true, required: true, index: true,
8
8
  },
@@ -13,13 +13,16 @@ const RoleSchema = new Schema({
13
13
  required: false,
14
14
  }],
15
15
  readonly: { type: Boolean, required: false, default: false },
16
+ }, { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } });
17
+ RoleMongoSchema.virtual("id").get(function () {
18
+ return this._id.toString();
16
19
  });
17
- RoleSchema.plugin(uniqueValidator, { message: 'validation.unique' });
18
- RoleSchema.plugin(MongooseSoftDelete);
19
- RoleSchema.plugin(mongoosePaginate);
20
- RoleSchema.set('toJSON', { getters: true });
20
+ RoleMongoSchema.plugin(uniqueValidator, { message: 'validation.unique' });
21
+ RoleMongoSchema.plugin(MongooseSoftDelete);
22
+ RoleMongoSchema.plugin(mongoosePaginate);
23
+ RoleMongoSchema.set('toJSON', { getters: true, virtuals: true });
21
24
  const ROLE_MODEL_NAME = 'Role';
22
25
  const ROLE_COLLECTION_NAME = 'roles';
23
- const RoleModel = mongoose.model(ROLE_MODEL_NAME, RoleSchema, ROLE_COLLECTION_NAME);
24
- export { RoleSchema, RoleModel };
26
+ const RoleModel = mongoose.models.Role || mongoose.model(ROLE_MODEL_NAME, RoleMongoSchema, ROLE_COLLECTION_NAME);
27
+ export { RoleMongoSchema, RoleModel };
25
28
  export default RoleModel;
@@ -2,15 +2,18 @@ import { mongoose, MongooseSoftDelete } from '@drax/common-back';
2
2
  import uniqueValidator from 'mongoose-unique-validator';
3
3
  import mongoosePaginate from 'mongoose-paginate-v2';
4
4
  const Schema = mongoose.Schema;
5
- const TenantSchema = new Schema({
5
+ const TenantMongoSchema = new Schema({
6
6
  name: { type: String, unique: true, required: true, index: true, },
7
- }, { timestamps: true });
8
- TenantSchema.plugin(uniqueValidator, { message: 'validation.unique' });
9
- TenantSchema.plugin(MongooseSoftDelete);
10
- TenantSchema.plugin(mongoosePaginate);
11
- TenantSchema.set('toJSON', { getters: true });
7
+ }, { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } });
8
+ TenantMongoSchema.virtual("id").get(function () {
9
+ return this._id.toString();
10
+ });
11
+ TenantMongoSchema.plugin(uniqueValidator, { message: 'validation.unique' });
12
+ TenantMongoSchema.plugin(MongooseSoftDelete);
13
+ TenantMongoSchema.plugin(mongoosePaginate);
14
+ TenantMongoSchema.set('toJSON', { getters: true, virtuals: true });
12
15
  const TENANT_MODEL_NAME = 'Tenant';
13
16
  const TENANT_COLLECTION_NAME = 'tenants';
14
- const TenantModel = mongoose.model(TENANT_MODEL_NAME, TenantSchema, TENANT_COLLECTION_NAME);
15
- export { TenantSchema, TenantModel };
17
+ const TenantModel = mongoose.models.Tenant || mongoose.model(TENANT_MODEL_NAME, TenantMongoSchema, TENANT_COLLECTION_NAME);
18
+ export { TenantMongoSchema, TenantModel };
16
19
  export default TenantModel;
@@ -2,7 +2,7 @@ import { mongoose, MongooseSoftDelete } from '@drax/common-back';
2
2
  import uniqueValidator from 'mongoose-unique-validator';
3
3
  import mongoosePaginate from 'mongoose-paginate-v2';
4
4
  // Defining user Mongoose Schema
5
- const UserApiKeySchema = new mongoose.Schema({
5
+ const UserApiKeyMongoSchema = new mongoose.Schema({
6
6
  name: {
7
7
  type: String,
8
8
  unique: false,
@@ -38,12 +38,15 @@ const UserApiKeySchema = new mongoose.Schema({
38
38
  required: true,
39
39
  },
40
40
  }, { timestamps: true });
41
- UserApiKeySchema.set('toJSON', { getters: true });
42
- UserApiKeySchema.plugin(uniqueValidator, { message: 'validation.unique' });
43
- UserApiKeySchema.plugin(MongooseSoftDelete);
44
- UserApiKeySchema.plugin(mongoosePaginate);
41
+ UserApiKeyMongoSchema.virtual("id").get(function () {
42
+ return this._id.toString();
43
+ });
44
+ UserApiKeyMongoSchema.set('toJSON', { getters: true, virtuals: true });
45
+ UserApiKeyMongoSchema.plugin(uniqueValidator, { message: 'validation.unique' });
46
+ UserApiKeyMongoSchema.plugin(MongooseSoftDelete);
47
+ UserApiKeyMongoSchema.plugin(mongoosePaginate);
45
48
  const MODEL_NAME = 'UserApiKey';
46
49
  const COLLECTION_NAME = 'userApiKeys';
47
- const UserApiKeyModel = mongoose.model(MODEL_NAME, UserApiKeySchema, COLLECTION_NAME);
48
- export { UserApiKeySchema, UserApiKeyModel };
50
+ const UserApiKeyModel = mongoose.models.UserApiKey || mongoose.model(MODEL_NAME, UserApiKeyMongoSchema, COLLECTION_NAME);
51
+ export { UserApiKeyMongoSchema, UserApiKeyModel };
49
52
  export default UserApiKeyModel;
@@ -2,7 +2,7 @@ import { mongoose, MongooseSoftDelete } from '@drax/common-back';
2
2
  import uniqueValidator from 'mongoose-unique-validator';
3
3
  import mongoosePaginate from 'mongoose-paginate-v2';
4
4
  // Defining user Mongoose Schema
5
- const UserGroupSchema = new mongoose.Schema({
5
+ const UserGroupMongoSchema = new mongoose.Schema({
6
6
  name: {
7
7
  type: String,
8
8
  unique: true,
@@ -22,12 +22,12 @@ const UserGroupSchema = new mongoose.Schema({
22
22
  required: false,
23
23
  }],
24
24
  }, { timestamps: true });
25
- UserGroupSchema.set('toJSON', { getters: true });
26
- UserGroupSchema.plugin(uniqueValidator, { message: 'validation.unique' });
27
- UserGroupSchema.plugin(MongooseSoftDelete);
28
- UserGroupSchema.plugin(mongoosePaginate);
25
+ UserGroupMongoSchema.set('toJSON', { getters: true });
26
+ UserGroupMongoSchema.plugin(uniqueValidator, { message: 'validation.unique' });
27
+ UserGroupMongoSchema.plugin(MongooseSoftDelete);
28
+ UserGroupMongoSchema.plugin(mongoosePaginate);
29
29
  const USERGROUP_MODEL_NAME = 'UserGroup';
30
30
  const USERGROUP_COLLECTION_NAME = 'userGroups';
31
- const UserGroupModel = mongoose.model(USERGROUP_MODEL_NAME, UserGroupSchema, USERGROUP_COLLECTION_NAME);
32
- export { UserGroupSchema, UserGroupModel };
31
+ const UserGroupModel = mongoose.model(USERGROUP_MODEL_NAME, UserGroupMongoSchema, USERGROUP_COLLECTION_NAME);
32
+ export { UserGroupMongoSchema, UserGroupModel };
33
33
  export default UserGroupModel;
@@ -2,7 +2,7 @@ import { mongoose, MongooseSoftDelete } from '@drax/common-back';
2
2
  import uniqueValidator from 'mongoose-unique-validator';
3
3
  import mongoosePaginate from 'mongoose-paginate-v2';
4
4
  // Defining user Mongoose Schema
5
- const UserSchema = new mongoose.Schema({
5
+ const UserMongoSchema = new mongoose.Schema({
6
6
  username: {
7
7
  type: String,
8
8
  unique: true,
@@ -69,13 +69,15 @@ const UserSchema = new mongoose.Schema({
69
69
  emailCode: { type: String, required: false, index: false, select: false },
70
70
  phoneCode: { type: String, required: false, index: false, select: false },
71
71
  recoveryCode: { type: String, required: false, index: false, select: false },
72
- }, { timestamps: true });
73
- UserSchema.set('toJSON', { getters: true });
74
- UserSchema.plugin(uniqueValidator, { message: 'validation.unique' });
75
- UserSchema.plugin(MongooseSoftDelete);
76
- UserSchema.plugin(mongoosePaginate);
72
+ }, { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } });
73
+ UserMongoSchema.virtual("id").get(function () {
74
+ return this._id.toString();
75
+ });
76
+ UserMongoSchema.plugin(uniqueValidator, { message: 'validation.unique' });
77
+ UserMongoSchema.plugin(MongooseSoftDelete);
78
+ UserMongoSchema.plugin(mongoosePaginate);
77
79
  const USER_MODEL_NAME = 'User';
78
80
  const USER_COLLECTION_NAME = 'users';
79
- const UserModel = mongoose.model(USER_MODEL_NAME, UserSchema, USER_COLLECTION_NAME);
80
- export { UserSchema, UserModel };
81
+ const UserModel = mongoose.models.User || mongoose.model(USER_MODEL_NAME, UserMongoSchema, USER_COLLECTION_NAME);
82
+ export { UserMongoSchema, UserModel };
81
83
  export default UserModel;
package/dist/rbac/Rbac.js CHANGED
@@ -1,4 +1,4 @@
1
- import { UnauthorizedError } from "@drax/common-back";
1
+ import { UnauthorizedError, ForbiddenError } from "@drax/common-back";
2
2
  class Rbac {
3
3
  constructor(authUser, role) {
4
4
  this.authUser = authUser;
@@ -16,6 +16,11 @@ class Rbac {
16
16
  get tenantId() {
17
17
  return this.authUser.tenantId;
18
18
  }
19
+ assertAuthenticated() {
20
+ if (!this.authUser) {
21
+ throw new UnauthorizedError();
22
+ }
23
+ }
19
24
  hasPermission(requiredPermission) {
20
25
  if (!this.authUser || !this.role || !this.role.permissions || this.role.permissions.length === 0) {
21
26
  return false;
@@ -23,22 +28,19 @@ class Rbac {
23
28
  return this.role.permissions.includes(requiredPermission);
24
29
  }
25
30
  assertPermission(requiredPermission) {
31
+ this.assertAuthenticated();
26
32
  if (!this.hasPermission(requiredPermission)) {
27
- throw new UnauthorizedError();
33
+ throw new ForbiddenError();
28
34
  }
29
35
  }
30
36
  assertOrPermissions(requiredPermissions) {
37
+ this.assertAuthenticated();
31
38
  for (let requiredPermission of requiredPermissions) {
32
39
  if (this.hasPermission(requiredPermission)) {
33
40
  return true;
34
41
  }
35
42
  }
36
- throw new UnauthorizedError();
37
- }
38
- assertAuthenticated() {
39
- if (!this.authUser) {
40
- throw new UnauthorizedError();
41
- }
43
+ throw new ForbiddenError();
42
44
  }
43
45
  assertUserId(userId) {
44
46
  if (this.userId != userId) {
@@ -1,77 +1,32 @@
1
1
  import { RoleModel } from "../../models/RoleModel.js";
2
- import { MongooseQueryFilter, MongooseSort } from "@drax/common-back";
3
- class RoleMongoRepository {
2
+ import { mongoose, MongooseQueryFilter, MongooseSort } from "@drax/common-back";
3
+ import { AbstractMongoRepository } from "@drax/crud-back";
4
+ class RoleMongoRepository extends AbstractMongoRepository {
4
5
  constructor() {
6
+ super();
7
+ this._model = RoleModel;
5
8
  this._searchFields = ['name'];
6
- }
7
- async create(roleData) {
8
- const role = new RoleModel(roleData);
9
- await role.save();
10
- await role.populate('childRoles');
11
- return role;
12
- }
13
- async update(id, roleData) {
14
- const role = await RoleModel.findOneAndUpdate({ _id: id }, roleData, { new: true }).populate('childRoles').exec();
15
- return role;
16
- }
17
- async delete(id) {
18
- const result = await RoleModel.deleteOne({ _id: id }).exec();
19
- return result.deletedCount == 1;
20
- }
21
- async findById(id) {
22
- const role = await RoleModel.findById(id).populate('childRoles').exec();
23
- return role;
9
+ this._populateFields = ['childRoles'];
10
+ this._lean = true;
11
+ this._populateFields = ['childRoles'];
24
12
  }
25
13
  async findByName(name) {
26
- const role = await RoleModel.findOne({ name }).populate('childRoles').exec();
27
- return role;
28
- }
29
- async fetchAll() {
30
- const roles = await RoleModel.find().populate('childRoles').exec();
31
- return roles;
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
- }
41
- async paginate({ page = 1, limit = 5, orderBy = '', order = false, search = '', filters = [] }) {
42
- const query = {};
43
- if (search) {
44
- query['$or'] = this._searchFields.map(field => ({ [field]: new RegExp(search.toString(), 'i') }));
45
- }
46
- MongooseQueryFilter.applyFilters(query, filters);
47
- const sort = MongooseSort.applySort(orderBy, order);
48
- const options = { populate: ['childRoles'], page, limit, sort };
49
- const roles = await RoleModel.paginate(query, options);
50
- return {
51
- page: page,
52
- limit: limit,
53
- total: roles.totalDocs,
54
- items: roles.docs
55
- };
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);
14
+ const item = await RoleModel
15
+ .findOne({ name })
16
+ .populate(this._populateFields)
17
+ .lean(this._lean ? { virtuals: true } : false)
18
+ .exec();
19
+ return item;
67
20
  }
68
21
  async findCursor({ limit = 0, orderBy = '', order = false, search = '', filters = [] }) {
69
- console.log("RoleMongoRepository.findCursor called");
70
22
  const query = {};
71
23
  if (search) {
72
- query['$or'] = [
73
- { name: new RegExp(search, 'i') },
74
- ];
24
+ if (mongoose.Types.ObjectId.isValid(search)) {
25
+ query['_id'] = new mongoose.Types.ObjectId(search);
26
+ }
27
+ else {
28
+ query['$or'] = this._searchFields.map(field => ({ [field]: new RegExp(search.toString(), 'i') }));
29
+ }
75
30
  }
76
31
  MongooseQueryFilter.applyFilters(query, filters);
77
32
  const sort = MongooseSort.applySort(orderBy, order);
@@ -1,79 +1,31 @@
1
1
  import { TenantModel } from "../../models/TenantModel.js";
2
- import { MongooseSort, MongooseQueryFilter } from "@drax/common-back";
3
- class TenantMongoRepository {
2
+ import { mongoose, MongooseSort, MongooseQueryFilter } from "@drax/common-back";
3
+ import { AbstractMongoRepository } from "@drax/crud-back";
4
+ class TenantMongoRepository extends AbstractMongoRepository {
4
5
  constructor() {
5
- this._searchFields = ['_id', 'name'];
6
- }
7
- async create(tenantData) {
8
- const tenant = new TenantModel(tenantData);
9
- await tenant.save();
10
- return tenant;
11
- }
12
- async update(id, tenantData) {
13
- const tenant = await TenantModel.findOneAndUpdate({ _id: id }, tenantData, { new: true }).exec();
14
- return tenant;
15
- }
16
- async delete(id) {
17
- const result = await TenantModel.deleteOne({ _id: id }).exec();
18
- return result.deletedCount == 1;
19
- }
20
- async findById(id) {
21
- const tenant = await TenantModel.findById(id).exec();
22
- return tenant;
6
+ super(...arguments);
7
+ this._model = TenantModel;
8
+ this._searchFields = ['name'];
9
+ this._populateFields = [];
10
+ this._lean = true;
23
11
  }
24
12
  async findByName(name) {
25
- const tenant = await TenantModel.findOne({ name }).exec();
13
+ const tenant = await TenantModel
14
+ .findOne({ name })
15
+ .lean(this._lean)
16
+ .exec();
26
17
  return tenant;
27
18
  }
28
- async fetchAll() {
29
- const tenants = await TenantModel.find().exec();
30
- return tenants;
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
- }
40
- async paginate({ page = 1, limit = 5, orderBy = '', order = false, search = '', filters = [] }) {
41
- const query = {};
42
- if (search) {
43
- query['$or'] = [
44
- { name: new RegExp(search, 'i') },
45
- ];
46
- }
47
- MongooseQueryFilter.applyFilters(query, filters);
48
- const sort = MongooseSort.applySort(orderBy, order);
49
- const options = { page, limit, sort };
50
- const tenants = await TenantModel.paginate(query, options);
51
- return {
52
- page: page,
53
- limit: limit,
54
- total: tenants.totalDocs,
55
- items: tenants.docs
56
- };
57
- }
58
- async find({ limit = 0, orderBy = '', order = false, search = '', filters = [] }) {
59
- const query = {};
60
- if (search) {
61
- query['$or'] = [
62
- { name: new RegExp(search, 'i') },
63
- ];
64
- }
65
- MongooseQueryFilter.applyFilters(query, filters);
66
- const sort = MongooseSort.applySort(orderBy, order);
67
- const items = await TenantModel.find(query).limit(limit).sort(sort);
68
- return items;
69
- }
70
19
  async findCursor({ limit = 0, orderBy = '', order = false, search = '', filters = [] }) {
71
20
  console.log("TenantMongoRepository.findCursor called");
72
21
  const query = {};
73
22
  if (search) {
74
- query['$or'] = [
75
- { name: new RegExp(search, 'i') },
76
- ];
23
+ if (mongoose.Types.ObjectId.isValid(search)) {
24
+ query['_id'] = new mongoose.Types.ObjectId(search);
25
+ }
26
+ else {
27
+ query['$or'] = this._searchFields.map(field => ({ [field]: new RegExp(search.toString(), 'i') }));
28
+ }
77
29
  }
78
30
  MongooseQueryFilter.applyFilters(query, filters);
79
31
  const sort = MongooseSort.applySort(orderBy, order);
@@ -1,67 +1,49 @@
1
1
  import { UserApiKeyModel } from "../../models/UserApiKeyModel.js";
2
- import { mongoose, MongooseErrorToValidationError, MongooseQueryFilter, MongooseSort, MongoServerErrorToValidationError } from "@drax/common-back";
3
- import { MongoServerError } from "mongodb";
4
- class UserApiKeyMongoRepository {
2
+ import { mongoose, MongooseQueryFilter, MongooseSort, } from "@drax/common-back";
3
+ import { AbstractMongoRepository } from "@drax/crud-back";
4
+ class UserApiKeyMongoRepository extends AbstractMongoRepository {
5
5
  constructor() {
6
- }
7
- async create(data) {
8
- try {
9
- const userApiKey = new UserApiKeyModel(data);
10
- await userApiKey.save();
11
- await userApiKey.populate([
12
- { path: 'user', populate: { path: 'tenant role' } },
13
- { path: 'createdBy', populate: { path: 'tenant role' } },
14
- ]);
15
- return userApiKey;
16
- }
17
- catch (e) {
18
- if (e instanceof mongoose.Error.ValidationError) {
19
- throw MongooseErrorToValidationError(e);
20
- }
21
- throw e;
22
- }
23
- }
24
- async update(id, data) {
25
- try {
26
- delete data.secret;
27
- const userApiKey = await UserApiKeyModel.findOneAndUpdate({ _id: id }, data, { new: true }).populate({ path: 'user', populate: { path: 'tenant role' } }).exec();
28
- return userApiKey;
29
- }
30
- catch (e) {
31
- if (e instanceof mongoose.Error.ValidationError) {
32
- throw MongooseErrorToValidationError(e);
33
- }
34
- if (e instanceof MongoServerError || e.name === 'MongoServerError') {
35
- throw MongoServerErrorToValidationError(e);
36
- }
37
- throw e;
38
- }
6
+ super(...arguments);
7
+ this._searchFields = ['name'];
8
+ this._populateFields = [
9
+ { path: 'user', populate: { path: 'tenant role' } },
10
+ { path: 'createdBy', populate: { path: 'tenant role' } },
11
+ ];
12
+ this._model = UserApiKeyModel;
13
+ this._lean = false;
39
14
  }
40
15
  async delete(id) {
41
- const userApiKey = await UserApiKeyModel.findById(id);
16
+ const userApiKey = await UserApiKeyModel
17
+ .findById(id);
42
18
  userApiKey.softDelete();
43
19
  return true;
44
20
  }
45
- async findById(id) {
46
- const userApiKey = await UserApiKeyModel.findById(id).populate({ path: 'user', populate: { path: 'tenant role' } }).exec();
47
- return userApiKey;
48
- }
49
21
  async findBySecret(secret) {
50
- const userApiKey = await UserApiKeyModel.findOne({ secret: { $eq: secret }, deleted: { $ne: true } }).populate({ path: 'user', populate: { path: 'tenant role' } }).exec();
22
+ const userApiKey = await UserApiKeyModel
23
+ .findOne({ secret: { $eq: secret }, deleted: { $ne: true } })
24
+ .populate(this._populateFields)
25
+ .exec();
51
26
  return userApiKey;
52
27
  }
53
- async paginate({ page = 1, limit = 5, orderBy = '', order = false, search = '', filters = [] }) {
28
+ async paginate({ page = 1, limit = 5, orderBy = '', order = "asc", search = '', filters = [] }) {
54
29
  const query = {
55
30
  deleted: false
56
31
  };
57
32
  if (search) {
58
- query['$or'] = [
59
- { name: new RegExp(search, 'i') },
60
- ];
33
+ if (mongoose.Types.ObjectId.isValid(search)) {
34
+ query['_id'] = new mongoose.Types.ObjectId(search);
35
+ }
36
+ else {
37
+ query['$or'] = this._searchFields.map(field => ({ [field]: new RegExp(search.toString(), 'i') }));
38
+ }
61
39
  }
62
40
  MongooseQueryFilter.applyFilters(query, filters);
63
41
  const sort = MongooseSort.applySort(orderBy, order);
64
- const options = { populate: ['user', 'user.tenant', 'user.role', 'createdBy'], page, limit, sort };
42
+ const populate = ['user', 'user.tenant', 'user.role', 'createdBy'];
43
+ const lean = this._lean;
44
+ const leanWithId = this._lean;
45
+ const leanWithVirtuals = this._lean;
46
+ const options = { populate, page, limit, sort, lean, leanWithId, leanWithVirtuals };
65
47
  const userApiKeyPaginated = await UserApiKeyModel.paginate(query, options);
66
48
  return {
67
49
  page: page,