@drax/identity-back 0.0.15 → 0.0.17

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 (106) hide show
  1. package/dist/factory/TenantServiceFactory.js +24 -0
  2. package/dist/factory/UserServiceFactory.js +1 -1
  3. package/dist/graphql/resolvers/role.resolvers.js +12 -1
  4. package/dist/graphql/resolvers/tenant.resolvers.js +121 -0
  5. package/dist/graphql/resolvers/user.resolvers.js +5 -2
  6. package/dist/graphql/types/tenant.graphql +28 -0
  7. package/dist/graphql/types/user.graphql +3 -0
  8. package/dist/index.js +6 -3
  9. package/dist/interfaces/ITenant.js +1 -0
  10. package/dist/interfaces/ITenantRepository.js +1 -0
  11. package/dist/middleware/rbacMiddleware.js +1 -4
  12. package/dist/models/TenantModel.js +18 -0
  13. package/dist/models/UserModel.js +5 -0
  14. package/dist/permissions/IdentityPermissions.js +5 -0
  15. package/dist/rbac/Rbac.js +6 -0
  16. package/dist/repository/mongo/RoleMongoRepository.js +7 -6
  17. package/dist/repository/mongo/TenantMongoRepository.js +45 -0
  18. package/dist/repository/mongo/UserMongoRepository.js +19 -6
  19. package/dist/repository/sqlite/RoleSqliteRepository.js +24 -5
  20. package/dist/repository/sqlite/TenantSqliteRepository.js +106 -0
  21. package/dist/repository/sqlite/UserSqliteRepository.js +43 -37
  22. package/dist/routes/RoleRoutes.js +10 -1
  23. package/dist/routes/TenantRoutes.js +183 -0
  24. package/dist/routes/UserRoutes.js +6 -1
  25. package/dist/services/RoleService.js +0 -5
  26. package/dist/services/TenantService.js +59 -0
  27. package/dist/services/UserService.js +1 -1
  28. package/dist/utils/AuthUtils.js +4 -3
  29. package/dist/zod/TenantZod.js +8 -0
  30. package/package.json +2 -2
  31. package/src/factory/TenantServiceFactory.ts +33 -0
  32. package/src/factory/UserServiceFactory.ts +1 -1
  33. package/src/graphql/resolvers/role.resolvers.ts +13 -1
  34. package/src/graphql/resolvers/tenant.resolvers.ts +119 -0
  35. package/src/graphql/resolvers/user.resolvers.ts +5 -2
  36. package/src/graphql/types/tenant.graphql +28 -0
  37. package/src/graphql/types/user.graphql +3 -0
  38. package/src/index.ts +6 -0
  39. package/src/interfaces/ITenant.ts +9 -0
  40. package/src/interfaces/ITenantRepository.ts +15 -0
  41. package/src/interfaces/IUser.ts +4 -1
  42. package/src/middleware/rbacMiddleware.ts +4 -7
  43. package/src/models/TenantModel.ts +32 -0
  44. package/src/models/UserModel.ts +5 -0
  45. package/src/permissions/IdentityPermissions.ts +7 -0
  46. package/src/rbac/Rbac.ts +11 -3
  47. package/src/repository/mongo/RoleMongoRepository.ts +7 -6
  48. package/src/repository/mongo/TenantMongoRepository.ts +62 -0
  49. package/src/repository/mongo/UserMongoRepository.ts +20 -6
  50. package/src/repository/sqlite/RoleSqliteRepository.ts +27 -6
  51. package/src/repository/sqlite/TenantSqliteRepository.ts +139 -0
  52. package/src/repository/sqlite/UserSqliteRepository.ts +52 -40
  53. package/src/routes/RoleRoutes.ts +9 -1
  54. package/src/routes/TenantRoutes.ts +178 -0
  55. package/src/routes/UserRoutes.ts +6 -1
  56. package/src/services/RoleService.ts +1 -4
  57. package/src/services/TenantService.ts +74 -0
  58. package/src/services/UserService.ts +1 -1
  59. package/src/utils/AuthUtils.ts +4 -3
  60. package/src/zod/TenantZod.ts +14 -0
  61. package/tsconfig.tsbuildinfo +1 -1
  62. package/types/factory/TenantServiceFactory.d.ts +4 -0
  63. package/types/factory/TenantServiceFactory.d.ts.map +1 -0
  64. package/types/graphql/resolvers/role.resolvers.d.ts.map +1 -1
  65. package/types/graphql/resolvers/tenant.resolvers.d.ts +44 -0
  66. package/types/graphql/resolvers/tenant.resolvers.d.ts.map +1 -0
  67. package/types/graphql/resolvers/user.resolvers.d.ts +2 -1
  68. package/types/graphql/resolvers/user.resolvers.d.ts.map +1 -1
  69. package/types/index.d.ts +4 -1
  70. package/types/index.d.ts.map +1 -1
  71. package/types/interfaces/ITenant.d.ts +7 -0
  72. package/types/interfaces/ITenant.d.ts.map +1 -0
  73. package/types/interfaces/ITenantRepository.d.ts +15 -0
  74. package/types/interfaces/ITenantRepository.d.ts.map +1 -0
  75. package/types/interfaces/IUser.d.ts +4 -0
  76. package/types/interfaces/IUser.d.ts.map +1 -1
  77. package/types/middleware/rbacMiddleware.d.ts.map +1 -1
  78. package/types/models/TenantModel.d.ts +16 -0
  79. package/types/models/TenantModel.d.ts.map +1 -0
  80. package/types/models/UserModel.d.ts.map +1 -1
  81. package/types/permissions/IdentityPermissions.d.ts +6 -1
  82. package/types/permissions/IdentityPermissions.d.ts.map +1 -1
  83. package/types/rbac/Rbac.d.ts +4 -2
  84. package/types/rbac/Rbac.d.ts.map +1 -1
  85. package/types/repository/mongo/RoleMongoRepository.d.ts.map +1 -1
  86. package/types/repository/mongo/TenantMongoRepository.d.ts +15 -0
  87. package/types/repository/mongo/TenantMongoRepository.d.ts.map +1 -0
  88. package/types/repository/mongo/UserMongoRepository.d.ts +2 -2
  89. package/types/repository/mongo/UserMongoRepository.d.ts.map +1 -1
  90. package/types/repository/sqlite/RoleSqliteRepository.d.ts +2 -0
  91. package/types/repository/sqlite/RoleSqliteRepository.d.ts.map +1 -1
  92. package/types/repository/sqlite/TenantSqliteRepository.d.ts +19 -0
  93. package/types/repository/sqlite/TenantSqliteRepository.d.ts.map +1 -0
  94. package/types/repository/sqlite/UserSqliteRepository.d.ts +4 -2
  95. package/types/repository/sqlite/UserSqliteRepository.d.ts.map +1 -1
  96. package/types/routes/RoleRoutes.d.ts.map +1 -1
  97. package/types/routes/TenantRoutes.d.ts +4 -0
  98. package/types/routes/TenantRoutes.d.ts.map +1 -0
  99. package/types/routes/UserRoutes.d.ts.map +1 -1
  100. package/types/services/RoleService.d.ts.map +1 -1
  101. package/types/services/TenantService.d.ts +16 -0
  102. package/types/services/TenantService.d.ts.map +1 -0
  103. package/types/utils/AuthUtils.d.ts +3 -2
  104. package/types/utils/AuthUtils.d.ts.map +1 -1
  105. package/types/zod/TenantZod.d.ts +10 -0
  106. package/types/zod/TenantZod.d.ts.map +1 -0
@@ -0,0 +1,24 @@
1
+ import TenantService from "../services/TenantService.js";
2
+ import TenantMongoRepository from "../repository/mongo/TenantMongoRepository.js";
3
+ import TenantSqliteRepository from "../repository/sqlite/TenantSqliteRepository.js";
4
+ import { DbSetupUtils, DbEngine } from "../utils/DbSetupUtils.js";
5
+ let tenantService;
6
+ const TenantServiceFactory = () => {
7
+ if (!tenantService) {
8
+ let tenantRepository;
9
+ switch (DbSetupUtils.getDbEngine()) {
10
+ case DbEngine.Mongo:
11
+ console.log("TenantServiceFactory DB ENGINE MONGODB");
12
+ tenantRepository = new TenantMongoRepository();
13
+ break;
14
+ case DbEngine.Sqlite:
15
+ console.log("TenantServiceFactory DB ENGINE SQLITE");
16
+ tenantRepository = new TenantSqliteRepository(DbSetupUtils.getDbConfig(), false);
17
+ tenantRepository.table();
18
+ break;
19
+ }
20
+ tenantService = new TenantService(tenantRepository);
21
+ }
22
+ return tenantService;
23
+ };
24
+ export default TenantServiceFactory;
@@ -13,7 +13,7 @@ const UserServiceFactory = () => {
13
13
  break;
14
14
  case DbEngine.Sqlite:
15
15
  console.log("UserServiceFactory DB ENGINE SQLITE");
16
- userRepository = new UserSqliteRepository(DbSetupUtils.getDbConfig(), false);
16
+ userRepository = new UserSqliteRepository(DbSetupUtils.getDbConfig(), true);
17
17
  userRepository.table();
18
18
  break;
19
19
  }
@@ -36,9 +36,16 @@ export default {
36
36
  try {
37
37
  rbac.assertPermission(IdentityPermissions.ViewRole);
38
38
  const roleService = RoleServiceFactory();
39
- return await roleService.fetchAll();
39
+ const roles = await roleService.fetchAll();
40
+ if (rbac.getRole?.childRoles?.length > 0) {
41
+ return roles.filter(role => rbac.getRole.childRoles.some(childRole => childRole.id === role.id));
42
+ }
43
+ else {
44
+ return roles;
45
+ }
40
46
  }
41
47
  catch (e) {
48
+ console.error("fetchRole", e);
42
49
  if (e instanceof UnauthorizedError) {
43
50
  throw new GraphQLError(e.message);
44
51
  }
@@ -115,6 +122,10 @@ export default {
115
122
  try {
116
123
  rbac.assertPermission(IdentityPermissions.DeleteRole);
117
124
  const roleService = RoleServiceFactory();
125
+ const currentRole = await roleService.findById(id);
126
+ if (currentRole.readonly) {
127
+ throw new UnauthorizedError();
128
+ }
118
129
  return await roleService.delete(id);
119
130
  }
120
131
  catch (e) {
@@ -0,0 +1,121 @@
1
+ import TenantServiceFactory from "../../factory/TenantServiceFactory.js";
2
+ import { IdentityPermissions } from "../../permissions/IdentityPermissions.js";
3
+ import { ValidationError, ValidationErrorToGraphQLError } from "@drax/common-back";
4
+ import { GraphQLError } from "graphql";
5
+ import UnauthorizedError from "../../errors/UnauthorizedError.js";
6
+ export default {
7
+ Query: {
8
+ findTenantById: async (_, { id }, { rbac }) => {
9
+ try {
10
+ rbac.assertPermission(IdentityPermissions.ViewTenant);
11
+ const tenantService = TenantServiceFactory();
12
+ return await tenantService.findById(id);
13
+ }
14
+ catch (e) {
15
+ if (e instanceof UnauthorizedError) {
16
+ throw new GraphQLError(e.message);
17
+ }
18
+ throw new GraphQLError('error.server');
19
+ }
20
+ },
21
+ findTenantByName: async (_, { name }, { rbac }) => {
22
+ try {
23
+ rbac.assertPermission(IdentityPermissions.ViewTenant);
24
+ const tenantService = TenantServiceFactory();
25
+ return await tenantService.findByName(name);
26
+ }
27
+ catch (e) {
28
+ if (e instanceof UnauthorizedError) {
29
+ throw new GraphQLError(e.message);
30
+ }
31
+ throw new GraphQLError('error.server');
32
+ }
33
+ },
34
+ fetchTenant: async (_, {}, { rbac }) => {
35
+ try {
36
+ rbac.assertPermission(IdentityPermissions.ViewTenant);
37
+ const tenantService = TenantServiceFactory();
38
+ const tenants = await tenantService.fetchAll();
39
+ if (rbac.getAuthUser.tenantId) {
40
+ return tenants.filter(t => t.id === rbac.getAuthUser.tenantId);
41
+ }
42
+ else {
43
+ return tenants;
44
+ }
45
+ }
46
+ catch (e) {
47
+ if (e instanceof UnauthorizedError) {
48
+ throw new GraphQLError(e.message);
49
+ }
50
+ throw new GraphQLError('error.server');
51
+ }
52
+ },
53
+ paginateTenant: async (_, { page, limit, seach }, { rbac }) => {
54
+ try {
55
+ rbac.assertPermission(IdentityPermissions.ViewTenant);
56
+ const tenantService = TenantServiceFactory();
57
+ return await tenantService.paginate(page, limit, seach);
58
+ }
59
+ catch (e) {
60
+ console.error("paginateTenant", e);
61
+ if (e instanceof UnauthorizedError) {
62
+ throw new GraphQLError(e.message);
63
+ }
64
+ throw new GraphQLError('error.server');
65
+ }
66
+ }
67
+ },
68
+ Mutation: {
69
+ createTenant: async (_, { input }, { rbac }) => {
70
+ try {
71
+ rbac.assertPermission(IdentityPermissions.CreateTenant);
72
+ const tenantService = TenantServiceFactory();
73
+ return await tenantService.create(input);
74
+ }
75
+ catch (e) {
76
+ console.error("createTenant", e);
77
+ if (e instanceof ValidationError) {
78
+ throw ValidationErrorToGraphQLError(e);
79
+ }
80
+ if (e instanceof UnauthorizedError) {
81
+ throw new GraphQLError(e.message);
82
+ }
83
+ throw new GraphQLError('error.server');
84
+ }
85
+ },
86
+ updateTenant: async (_, { id, input }, { rbac }) => {
87
+ try {
88
+ rbac.assertPermission(IdentityPermissions.UpdateTenant);
89
+ const tenantService = TenantServiceFactory();
90
+ return await tenantService.update(id, input);
91
+ }
92
+ catch (e) {
93
+ console.error("updateTenant", e);
94
+ if (e instanceof ValidationError) {
95
+ throw ValidationErrorToGraphQLError(e);
96
+ }
97
+ if (e instanceof UnauthorizedError) {
98
+ throw new GraphQLError(e.message);
99
+ }
100
+ throw new GraphQLError('error.server');
101
+ }
102
+ },
103
+ deleteTenant: async (_, { id }, { rbac }) => {
104
+ try {
105
+ rbac.assertPermission(IdentityPermissions.DeleteTenant);
106
+ const tenantService = TenantServiceFactory();
107
+ return await tenantService.delete(id);
108
+ }
109
+ catch (e) {
110
+ console.error("deleteTenant", e);
111
+ if (e instanceof ValidationError) {
112
+ throw ValidationErrorToGraphQLError(e);
113
+ }
114
+ if (e instanceof UnauthorizedError) {
115
+ throw new GraphQLError(e.message);
116
+ }
117
+ throw new GraphQLError('error.server');
118
+ }
119
+ }
120
+ }
121
+ };
@@ -34,11 +34,14 @@ export default {
34
34
  throw new GraphQLError('error.server');
35
35
  }
36
36
  },
37
- paginateUser: async (_, { page, limit, search }, { rbac }) => {
37
+ paginateUser: async (_, { page, limit, search, filters = [] }, { rbac }) => {
38
38
  try {
39
39
  rbac.assertPermission(IdentityPermissions.ViewUser);
40
40
  let userService = UserServiceFactory();
41
- return await userService.paginate(page, limit, search);
41
+ if (rbac.getAuthUser.tenantId) {
42
+ filters.push({ field: 'tenant', operator: '$eq', value: rbac.getAuthUser.tenantId });
43
+ }
44
+ return await userService.paginate(page, limit, search, filters);
42
45
  }
43
46
  catch (e) {
44
47
  if (e instanceof UnauthorizedError) {
@@ -0,0 +1,28 @@
1
+ type Tenant {
2
+ id: ID!
3
+ name: String
4
+ }
5
+
6
+ type TenantPaginated{
7
+ total: Int
8
+ page: Int
9
+ limit: Int
10
+ items: [Tenant]
11
+ }
12
+
13
+ type Query{
14
+ paginateTenant(page:Int, limit:Int, search:String): TenantPaginated
15
+ fetchTenant: [Tenant]
16
+ findTenantById(id: ID): Tenant
17
+ findTenantByName(name: String!): Tenant
18
+ }
19
+
20
+ input TenantInput{
21
+ name: String
22
+ }
23
+
24
+ type Mutation{
25
+ createTenant(input: TenantInput): Tenant
26
+ updateTenant(id: ID!, input: TenantInput): Tenant
27
+ deleteTenant(id: ID!): Boolean
28
+ }
@@ -4,6 +4,7 @@ type User {
4
4
  name: String
5
5
  email: String
6
6
  role: Role
7
+ tenant: Tenant
7
8
  phone: String
8
9
  avatar: String
9
10
  active: Boolean
@@ -28,6 +29,7 @@ input UserCreateInput{
28
29
  username: String!
29
30
  password: String!
30
31
  role: ID
32
+ tenant: ID
31
33
  email: String!
32
34
  phone: String
33
35
  active: Boolean
@@ -37,6 +39,7 @@ input UserUpdateInput{
37
39
  name: String
38
40
  username: String!
39
41
  role: ID
42
+ tenant: ID
40
43
  email: String!
41
44
  phone: String
42
45
  active: Boolean
package/dist/index.js CHANGED
@@ -1,12 +1,15 @@
1
1
  import GraphqlMerge from "./graphql/index.js";
2
2
  import UserServiceFactory from "./factory/UserServiceFactory.js";
3
3
  import RoleServiceFactory from "./factory/RoleServiceFactory.js";
4
+ import TenantServiceFactory from "./factory/TenantServiceFactory.js";
4
5
  import RoleService from "./services/RoleService.js";
5
6
  import UserService from "./services/UserService.js";
7
+ import TenantService from "./services/TenantService.js";
6
8
  import PermissionService from "./services/PermissionService.js";
7
9
  import Rbac from "./rbac/Rbac.js";
8
10
  import { UserRoutes } from "./routes/UserRoutes.js";
9
11
  import { RoleRoutes } from "./routes/RoleRoutes.js";
12
+ import { TenantRoutes } from "./routes/TenantRoutes.js";
10
13
  import AuthUtils from "./utils/AuthUtils.js";
11
14
  import { jwtMiddleware } from "./middleware/jwtMiddleware.js";
12
15
  import { rbacMiddleware } from "./middleware/rbacMiddleware.js";
@@ -24,13 +27,13 @@ const identityTypeDefs = await graphqlMergeResult.typeDefs;
24
27
  const identityResolvers = await graphqlMergeResult.resolvers;
25
28
  export {
26
29
  //Service
27
- UserService, RoleService, PermissionService, Rbac,
30
+ UserService, RoleService, TenantService, PermissionService, Rbac,
28
31
  //Factories
29
- UserServiceFactory, RoleServiceFactory,
32
+ UserServiceFactory, RoleServiceFactory, TenantServiceFactory,
30
33
  //GQL
31
34
  identityTypeDefs, identityResolvers,
32
35
  //API REST
33
- UserRoutes, RoleRoutes, AuthUtils,
36
+ UserRoutes, RoleRoutes, TenantRoutes, AuthUtils,
34
37
  //API MIDDLEWARE
35
38
  jwtMiddleware, rbacMiddleware,
36
39
  //Permissions
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -7,10 +7,7 @@ const draxCache = new DraxCache(cacheTTL);
7
7
  async function roleLoader(k) {
8
8
  const roleService = RoleServiceFactory();
9
9
  const role = await roleService.findById(k);
10
- if (role) {
11
- return { id: role.id, name: role.name, permissions: role.permissions };
12
- }
13
- return null;
10
+ return role;
14
11
  }
15
12
  async function rbacMiddleware(request, reply) {
16
13
  try {
@@ -0,0 +1,18 @@
1
+ import { mongoose, MongooseSoftDelete } from '@drax/common-back';
2
+ import uniqueValidator from 'mongoose-unique-validator';
3
+ import mongoosePaginate from 'mongoose-paginate-v2';
4
+ const Schema = mongoose.Schema;
5
+ const TenantSchema = new Schema({
6
+ name: {
7
+ type: String, unique: true, required: true, index: true,
8
+ },
9
+ });
10
+ TenantSchema.plugin(uniqueValidator, { message: 'validation.unique' });
11
+ TenantSchema.plugin(MongooseSoftDelete);
12
+ TenantSchema.plugin(mongoosePaginate);
13
+ TenantSchema.set('toJSON', { getters: true });
14
+ const TENANT_MODEL_NAME = 'Tenant';
15
+ const TENANT_COLLECTION_NAME = 'tenants';
16
+ const TenantModel = mongoose.model(TENANT_MODEL_NAME, TenantSchema, TENANT_COLLECTION_NAME);
17
+ export { TenantSchema, TenantModel };
18
+ export default TenantModel;
@@ -50,6 +50,11 @@ const UserSchema = new mongoose.Schema({
50
50
  ref: 'Role',
51
51
  required: true,
52
52
  },
53
+ tenant: {
54
+ type: mongoose.Schema.Types.ObjectId,
55
+ ref: 'Tenant',
56
+ required: false,
57
+ },
53
58
  groups: [{
54
59
  type: mongoose.Schema.Types.ObjectId,
55
60
  ref: 'Group',
@@ -11,6 +11,11 @@ var IdentityPermissions;
11
11
  IdentityPermissions["ViewRole"] = "role:view";
12
12
  IdentityPermissions["ManageRole"] = "role:manage";
13
13
  IdentityPermissions["PermissionsRole"] = "role:permissions";
14
+ IdentityPermissions["CreateTenant"] = "tenant:create";
15
+ IdentityPermissions["UpdateTenant"] = "tenant:update";
16
+ IdentityPermissions["DeleteTenant"] = "tenant:delete";
17
+ IdentityPermissions["ViewTenant"] = "tenant:view";
18
+ IdentityPermissions["ManageTenant"] = "tenant:manage";
14
19
  })(IdentityPermissions || (IdentityPermissions = {}));
15
20
  export default IdentityPermissions;
16
21
  export { IdentityPermissions };
package/dist/rbac/Rbac.js CHANGED
@@ -4,6 +4,12 @@ class Rbac {
4
4
  this.authUser = authUser;
5
5
  this.role = role;
6
6
  }
7
+ get getRole() {
8
+ return this.role;
9
+ }
10
+ get getAuthUser() {
11
+ return this.authUser;
12
+ }
7
13
  hasPermission(requiredPermission) {
8
14
  if (!this.authUser || !this.role || !this.role.permissions || this.role.permissions.length === 0) {
9
15
  return false;
@@ -3,26 +3,27 @@ class RoleMongoRepository {
3
3
  async create(roleData) {
4
4
  const role = new RoleModel(roleData);
5
5
  await role.save();
6
+ await role.populate('childRoles');
6
7
  return role;
7
8
  }
8
9
  async update(id, roleData) {
9
- const role = await RoleModel.findOneAndUpdate({ _id: id }, roleData, { new: true }).exec();
10
+ const role = await RoleModel.findOneAndUpdate({ _id: id }, roleData, { new: true }).populate('childRoles').exec();
10
11
  return role;
11
12
  }
12
13
  async delete(id) {
13
- const result = await RoleModel.deleteOne(id).exec();
14
+ const result = await RoleModel.deleteOne({ _id: id }).exec();
14
15
  return result.deletedCount == 1;
15
16
  }
16
17
  async findById(id) {
17
- const role = await RoleModel.findById(id).exec();
18
+ const role = await RoleModel.findById(id).populate('childRoles').exec();
18
19
  return role;
19
20
  }
20
21
  async findByName(name) {
21
- const role = await RoleModel.findOne({ name }).exec();
22
+ const role = await RoleModel.findOne({ name }).populate('childRoles').exec();
22
23
  return role;
23
24
  }
24
25
  async fetchAll() {
25
- const roles = await RoleModel.find().exec();
26
+ const roles = await RoleModel.find().populate('childRoles').exec();
26
27
  return roles;
27
28
  }
28
29
  async paginate(page = 1, limit = 5, search) {
@@ -32,7 +33,7 @@ class RoleMongoRepository {
32
33
  { name: new RegExp(search, 'i') },
33
34
  ];
34
35
  }
35
- const options = { page, limit };
36
+ const options = { populate: ['childRoles'], page, limit };
36
37
  const roles = await RoleModel.paginate(query, options);
37
38
  return {
38
39
  page: page,
@@ -0,0 +1,45 @@
1
+ import { TenantModel } from "../../models/TenantModel.js";
2
+ class TenantMongoRepository {
3
+ async create(tenantData) {
4
+ const tenant = new TenantModel(tenantData);
5
+ await tenant.save();
6
+ return tenant;
7
+ }
8
+ async update(id, tenantData) {
9
+ const tenant = await TenantModel.findOneAndUpdate({ _id: id }, tenantData, { new: true }).exec();
10
+ return tenant;
11
+ }
12
+ async delete(id) {
13
+ const result = await TenantModel.deleteOne({ _id: id }).exec();
14
+ return result.deletedCount == 1;
15
+ }
16
+ async findById(id) {
17
+ const tenant = await TenantModel.findById(id).exec();
18
+ return tenant;
19
+ }
20
+ async findByName(name) {
21
+ const tenant = await TenantModel.findOne({ name }).exec();
22
+ return tenant;
23
+ }
24
+ async fetchAll() {
25
+ const tenants = await TenantModel.find().exec();
26
+ return tenants;
27
+ }
28
+ async paginate(page = 1, limit = 5, search) {
29
+ const query = {};
30
+ if (search) {
31
+ query['$or'] = [
32
+ { name: new RegExp(search, 'i') },
33
+ ];
34
+ }
35
+ const options = { page, limit };
36
+ const tenants = await TenantModel.paginate(query, options);
37
+ return {
38
+ page: page,
39
+ limit: limit,
40
+ total: tenants.totalDocs,
41
+ items: tenants.docs
42
+ };
43
+ }
44
+ }
45
+ export default TenantMongoRepository;
@@ -13,7 +13,7 @@ class UserMongoRepository {
13
13
  }
14
14
  const user = new UserModel(userData);
15
15
  await user.save();
16
- await user.populate('role');
16
+ await user.populate(['role', 'tenant']);
17
17
  return user;
18
18
  }
19
19
  catch (e) {
@@ -25,7 +25,7 @@ class UserMongoRepository {
25
25
  }
26
26
  async update(id, userData) {
27
27
  try {
28
- const user = await UserModel.findOneAndUpdate({ _id: id }, userData, { new: true }).populate('role').exec();
28
+ const user = await UserModel.findOneAndUpdate({ _id: id }, userData, { new: true }).populate(['role', 'tenant']).exec();
29
29
  return user;
30
30
  }
31
31
  catch (e) {
@@ -43,14 +43,14 @@ class UserMongoRepository {
43
43
  return result.deletedCount == 1;
44
44
  }
45
45
  async findById(id) {
46
- const user = await UserModel.findById(id).populate('role').exec();
46
+ const user = await UserModel.findById(id).populate(['role', 'tenant']).exec();
47
47
  return user;
48
48
  }
49
49
  async findByUsername(username) {
50
- const user = await UserModel.findOne({ username: username }).populate('role').exec();
50
+ const user = await UserModel.findOne({ username: username }).populate(['role', 'tenant']).exec();
51
51
  return user;
52
52
  }
53
- async paginate(page = 1, limit = 5, search) {
53
+ async paginate(page = 1, limit = 5, search, filters) {
54
54
  const query = {};
55
55
  if (search) {
56
56
  query['$or'] = [
@@ -59,7 +59,20 @@ class UserMongoRepository {
59
59
  { name: new RegExp(search, 'i') },
60
60
  ];
61
61
  }
62
- const options = { populate: ['role'], page: page, limit: limit };
62
+ if (filters) {
63
+ for (const filter of filters) {
64
+ if (filter.operator === '$eq') {
65
+ query[filter.field] = { $eq: filter.value };
66
+ }
67
+ if (filter.operator === '$ne') {
68
+ query[filter.field] = { $ne: filter.value };
69
+ }
70
+ if (filter.operator === '$in') {
71
+ query[filter.field] = { $in: filter.value };
72
+ }
73
+ }
74
+ }
75
+ const options = { populate: ['role', 'tenant'], page: page, limit: limit };
63
76
  const userPaginated = await UserModel.paginate(query, options);
64
77
  return {
65
78
  page: page,
@@ -15,6 +15,7 @@ const roleTableSQL = `
15
15
  class RoleSqliteRepository {
16
16
  constructor(DATABASE, verbose = false) {
17
17
  this.db = new sqlite(DATABASE, { verbose: verbose ? console.log : null });
18
+ this.table();
18
19
  }
19
20
  table() {
20
21
  this.db.exec(roleTableSQL);
@@ -55,7 +56,7 @@ class RoleSqliteRepository {
55
56
  async findById(id) {
56
57
  const role = this.db.prepare('SELECT * FROM roles WHERE id = ?').get(id);
57
58
  if (role) {
58
- role.permissions = role.permissions ? role.permissions.split(",") : [];
59
+ await this.populateRole(role);
59
60
  return role;
60
61
  }
61
62
  return undefined;
@@ -63,7 +64,7 @@ class RoleSqliteRepository {
63
64
  async findByName(name) {
64
65
  const role = this.db.prepare('SELECT * FROM roles WHERE name = ?').get(name);
65
66
  if (role) {
66
- role.permissions = role.permissions ? role.permissions.split(",") : [];
67
+ await this.populateRole(role);
67
68
  return role;
68
69
  }
69
70
  return undefined;
@@ -97,20 +98,20 @@ class RoleSqliteRepository {
97
98
  async fetchAll() {
98
99
  const roles = this.db.prepare('SELECT * FROM roles').all();
99
100
  for (const role of roles) {
100
- role.permissions = role.permissions ? role.permissions.split(",") : [];
101
+ await this.populateRole(role);
101
102
  }
102
103
  return roles;
103
104
  }
104
105
  async paginate(page = 1, limit = 5, search = "") {
105
106
  const offset = page > 1 ? (page - 1) * limit : 0;
106
- let where;
107
+ let where = "";
107
108
  if (search) {
108
109
  where = ` WHERE name LIKE '%${search}%'`;
109
110
  }
110
111
  const rCount = this.db.prepare('SELECT COUNT(*) as count FROM roles' + where).get();
111
112
  const roles = this.db.prepare('SELECT * FROM roles LIMIT ? OFFSET ?' + where).all([limit, offset]);
112
113
  for (const role of roles) {
113
- role.permissions = role.permissions ? role.permissions.split(",") : [];
114
+ await this.populateRole(role);
114
115
  }
115
116
  return {
116
117
  page: page,
@@ -119,5 +120,23 @@ class RoleSqliteRepository {
119
120
  items: roles
120
121
  };
121
122
  }
123
+ async findWithoutPopulateById(id) {
124
+ const role = this.db.prepare('SELECT * FROM roles WHERE id = ?').get(id);
125
+ if (role) {
126
+ return role;
127
+ }
128
+ return undefined;
129
+ }
130
+ async populateRole(role) {
131
+ role.permissions = role.permissions ? role.permissions.split(",") : [];
132
+ role.childRoles = role.childRoles ? role.childRoles.split(",") : [];
133
+ const childRoles = [];
134
+ for (const childRoleId of role.childRoles) {
135
+ const childRole = await this.findWithoutPopulateById(childRoleId);
136
+ childRoles.push(childRole);
137
+ }
138
+ role.childRoles = childRoles;
139
+ return role;
140
+ }
122
141
  }
123
142
  export default RoleSqliteRepository;