@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.
- package/dist/controllers/RoleController.js +8 -39
- package/dist/controllers/TenantController.js +1 -28
- package/dist/controllers/UserApiKeyController.js +3 -3
- package/dist/controllers/UserController.js +48 -209
- package/dist/errors/BadCredentialsError.js +12 -0
- package/dist/factory/RoleServiceFactory.js +1 -0
- package/dist/factory/TenantServiceFactory.js +1 -0
- package/dist/factory/UserApiKeyServiceFactory.js +5 -4
- package/dist/factory/UserServiceFactory.js +1 -0
- package/dist/graphql/resolvers/role.resolvers.js +2 -2
- package/dist/graphql/resolvers/tenant.resolvers.js +2 -2
- package/dist/graphql/resolvers/user-api-key.resolvers.js +2 -2
- package/dist/graphql/resolvers/user.resolvers.js +1 -1
- package/dist/index.js +6 -0
- package/dist/middleware/apiKeyMiddleware.js +2 -2
- package/dist/models/RoleModel.js +10 -7
- package/dist/models/TenantModel.js +11 -8
- package/dist/models/UserApiKeyModel.js +10 -7
- package/dist/models/UserGroupModel.js +7 -7
- package/dist/models/UserModel.js +10 -8
- package/dist/rbac/Rbac.js +10 -8
- package/dist/repository/mongo/RoleMongoRepository.js +20 -65
- package/dist/repository/mongo/TenantMongoRepository.js +18 -66
- package/dist/repository/mongo/UserApiKeyMongoRepository.js +29 -47
- package/dist/repository/mongo/UserMongoRepository.js +56 -85
- package/dist/repository/sqlite/RoleSqliteRepository.js +30 -115
- package/dist/repository/sqlite/TenantSqliteRepository.js +15 -105
- package/dist/repository/sqlite/UserApiKeySqliteRepository.js +42 -117
- package/dist/repository/sqlite/UserSqliteRepository.js +49 -130
- package/dist/routes/RoleRoutes.js +35 -10
- package/dist/routes/TenantRoutes.js +18 -9
- package/dist/routes/UserApiKeyRoutes.js +20 -4
- package/dist/routes/UserRoutes.js +92 -17
- package/dist/schemas/LoginSchema.js +9 -0
- package/dist/schemas/PasswordSchema.js +12 -0
- package/dist/schemas/RegisterSchema.js +19 -0
- package/dist/schemas/RoleSchema.js +23 -0
- package/dist/schemas/TenantSchema.js +13 -0
- package/dist/schemas/UserApiKeySchema.js +14 -0
- package/dist/schemas/UserSchema.js +39 -0
- package/dist/services/PermissionService.js +5 -5
- package/dist/services/RoleService.js +6 -6
- package/dist/services/TenantService.js +6 -6
- package/dist/services/UserApiKeyService.js +5 -5
- package/dist/services/UserService.js +14 -14
- package/dist/setup/CreateOrUpdateRole.js +5 -2
- package/dist/setup/CreateUserIfNotExist.js +3 -1
- package/dist/setup/RecoveryUserPassword.js +1 -1
- package/dist/zod/EndpointZod.js +9 -0
- package/dist/zod/TenantSchema.js +12 -0
- package/dist/zod/TenantZod.js +5 -3
- package/dist/zod/UserApiKeyZod.js +7 -3
- package/package.json +10 -9
- package/src/controllers/RoleController.ts +8 -36
- package/src/controllers/TenantController.ts +2 -25
- package/src/controllers/UserApiKeyController.ts +3 -3
- package/src/controllers/UserController.ts +50 -183
- package/src/errors/BadCredentialsError.ts +18 -1
- package/src/factory/RoleServiceFactory.ts +1 -0
- package/src/factory/TenantServiceFactory.ts +1 -0
- package/src/factory/UserApiKeyServiceFactory.ts +5 -4
- package/src/factory/UserServiceFactory.ts +1 -0
- package/src/graphql/resolvers/role.resolvers.ts +3 -2
- package/src/graphql/resolvers/tenant.resolvers.ts +3 -2
- package/src/graphql/resolvers/user-api-key.resolvers.ts +3 -2
- package/src/graphql/resolvers/user.resolvers.ts +2 -1
- package/src/index.ts +16 -0
- package/src/interfaces/ITenantRepository.ts +2 -2
- package/src/interfaces/IUserApiKeyRepository.ts +2 -2
- package/src/interfaces/IUserRepository.ts +3 -2
- package/src/middleware/apiKeyMiddleware.ts +2 -2
- package/src/models/RoleModel.ts +12 -7
- package/src/models/TenantModel.ts +13 -8
- package/src/models/UserApiKeyModel.ts +12 -7
- package/src/models/UserGroupModel.ts +7 -7
- package/src/models/UserModel.ts +10 -8
- package/src/rbac/Rbac.ts +12 -9
- package/src/repository/mongo/RoleMongoRepository.ts +23 -94
- package/src/repository/mongo/TenantMongoRepository.ts +19 -98
- package/src/repository/mongo/UserApiKeyMongoRepository.ts +31 -56
- package/src/repository/mongo/UserMongoRepository.ts +71 -130
- package/src/repository/sqlite/RoleSqliteRepository.ts +37 -146
- package/src/repository/sqlite/TenantSqliteRepository.ts +16 -156
- package/src/repository/sqlite/UserApiKeySqliteRepository.ts +46 -151
- package/src/repository/sqlite/UserSqliteRepository.ts +59 -173
- package/src/routes/RoleRoutes.ts +35 -12
- package/src/routes/TenantRoutes.ts +25 -9
- package/src/routes/UserApiKeyRoutes.ts +23 -7
- package/src/routes/UserRoutes.ts +117 -34
- package/src/schemas/LoginSchema.ts +12 -0
- package/src/schemas/PasswordSchema.ts +16 -0
- package/src/{zod/UserZod.ts → schemas/RegisterSchema.ts} +7 -10
- package/src/schemas/RoleSchema.ts +29 -0
- package/src/schemas/TenantSchema.ts +22 -0
- package/src/{zod/UserApiKeyZod.ts → schemas/UserApiKeySchema.ts} +8 -3
- package/src/schemas/UserSchema.ts +57 -0
- package/src/services/PermissionService.ts +6 -5
- package/src/services/RoleService.ts +6 -6
- package/src/services/TenantService.ts +10 -10
- package/src/services/UserApiKeyService.ts +5 -5
- package/src/services/UserService.ts +15 -16
- package/src/setup/CreateOrUpdateRole.ts +7 -4
- package/src/setup/CreateUserIfNotExist.ts +5 -3
- package/src/setup/RecoveryUserPassword.ts +1 -1
- package/test/data-obj/apikey/root-mongo-user-apikey.ts +2 -1
- package/test/data-obj/roles/admin-sqlite-role.ts +2 -2
- package/test/data-obj/roles/operator-sqlite-role.ts +1 -1
- package/test/data-obj/tenants/company-sqlite-tenant.ts +6 -0
- package/test/data-obj/users/root-sqlite-user.ts +2 -2
- package/test/initializers/RoleSqliteInitializer.ts +1 -1
- package/test/repository/mongo/role-mongo-repository.test.ts +3 -3
- package/test/repository/mongo/user-apikey-mongo-repository.test.ts +5 -4
- package/test/repository/mongo/user-mongo-repository.test.ts +4 -4
- package/test/repository/sqlite/role-sqlite-repository.test.ts +21 -9
- package/test/repository/sqlite/tenant-sqlite-repository.test.ts +74 -0
- package/test/repository/sqlite/user-sqlite-repository.test.ts +15 -9
- package/test/routes/data/admin-role.ts +10 -0
- package/test/routes/data/root-user.ts +13 -0
- package/test/routes/helpers/CreateRootUserAndAdminRole.ts +17 -0
- package/test/routes/helpers/FastifyTestServerFactory.ts +34 -0
- package/test/routes/helpers/InitializePermissions.ts +23 -0
- package/test/routes/helpers/SetupIdentityDrax.ts +22 -0
- package/test/routes/tenant-route.test.ts +336 -0
- package/test/routes/user-route.test.ts +186 -0
- package/test/schemas/lab-schema.test.ts +110 -0
- package/test/service/mock-service.test.ts +3 -3
- package/test/service/role-service.test.ts +3 -3
- package/test/service/user-service.test.ts +16 -25
- package/test.db +0 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/types/controllers/RoleController.d.ts +0 -1
- package/types/controllers/RoleController.d.ts.map +1 -1
- package/types/controllers/TenantController.d.ts +0 -1
- package/types/controllers/TenantController.d.ts.map +1 -1
- package/types/controllers/UserController.d.ts +11 -4
- package/types/controllers/UserController.d.ts.map +1 -1
- package/types/errors/BadCredentialsError.d.ts +9 -1
- package/types/errors/BadCredentialsError.d.ts.map +1 -1
- package/types/factory/RoleServiceFactory.d.ts.map +1 -1
- package/types/factory/TenantServiceFactory.d.ts.map +1 -1
- package/types/factory/UserApiKeyServiceFactory.d.ts.map +1 -1
- package/types/factory/UserServiceFactory.d.ts.map +1 -1
- package/types/graphql/resolvers/role.resolvers.d.ts +3 -9
- package/types/graphql/resolvers/role.resolvers.d.ts.map +1 -1
- package/types/graphql/resolvers/tenant.resolvers.d.ts +3 -9
- package/types/graphql/resolvers/tenant.resolvers.d.ts.map +1 -1
- package/types/graphql/resolvers/user-api-key.resolvers.d.ts +3 -9
- package/types/graphql/resolvers/user-api-key.resolvers.d.ts.map +1 -1
- package/types/graphql/resolvers/user.resolvers.d.ts +3 -9
- package/types/graphql/resolvers/user.resolvers.d.ts.map +1 -1
- package/types/index.d.ts +5 -1
- package/types/index.d.ts.map +1 -1
- package/types/interfaces/ITenantRepository.d.ts +2 -2
- package/types/interfaces/ITenantRepository.d.ts.map +1 -1
- package/types/interfaces/IUserApiKeyRepository.d.ts +2 -2
- package/types/interfaces/IUserApiKeyRepository.d.ts.map +1 -1
- package/types/interfaces/IUserRepository.d.ts +3 -2
- package/types/interfaces/IUserRepository.d.ts.map +1 -1
- package/types/models/RoleModel.d.ts +7 -7
- package/types/models/RoleModel.d.ts.map +1 -1
- package/types/models/TenantModel.d.ts +7 -7
- package/types/models/TenantModel.d.ts.map +1 -1
- package/types/models/UserApiKeyModel.d.ts +7 -7
- package/types/models/UserApiKeyModel.d.ts.map +1 -1
- package/types/models/UserGroupModel.d.ts +2 -2
- package/types/models/UserGroupModel.d.ts.map +1 -1
- package/types/models/UserModel.d.ts +7 -7
- package/types/models/UserModel.d.ts.map +1 -1
- package/types/rbac/Rbac.d.ts +1 -1
- package/types/rbac/Rbac.d.ts.map +1 -1
- package/types/repository/mongo/RoleMongoRepository.d.ts +9 -11
- package/types/repository/mongo/RoleMongoRepository.d.ts.map +1 -1
- package/types/repository/mongo/TenantMongoRepository.d.ts +8 -11
- package/types/repository/mongo/TenantMongoRepository.d.ts.map +1 -1
- package/types/repository/mongo/UserApiKeyMongoRepository.d.ts +12 -5
- package/types/repository/mongo/UserApiKeyMongoRepository.d.ts.map +1 -1
- package/types/repository/mongo/UserMongoRepository.d.ts +11 -12
- package/types/repository/mongo/UserMongoRepository.d.ts.map +1 -1
- package/types/repository/sqlite/RoleSqliteRepository.d.ts +14 -14
- package/types/repository/sqlite/RoleSqliteRepository.d.ts.map +1 -1
- package/types/repository/sqlite/TenantSqliteRepository.d.ts +12 -14
- package/types/repository/sqlite/TenantSqliteRepository.d.ts.map +1 -1
- package/types/repository/sqlite/UserApiKeySqliteRepository.d.ts +15 -11
- package/types/repository/sqlite/UserApiKeySqliteRepository.d.ts.map +1 -1
- package/types/repository/sqlite/UserSqliteRepository.d.ts +15 -12
- package/types/repository/sqlite/UserSqliteRepository.d.ts.map +1 -1
- package/types/routes/RoleRoutes.d.ts.map +1 -1
- package/types/routes/TenantRoutes.d.ts.map +1 -1
- package/types/routes/UserApiKeyRoutes.d.ts.map +1 -1
- package/types/routes/UserRoutes.d.ts.map +1 -1
- package/types/schemas/LoginSchema.d.ts +20 -0
- package/types/schemas/LoginSchema.d.ts.map +1 -0
- package/types/schemas/PasswordSchema.d.ts +27 -0
- package/types/schemas/PasswordSchema.d.ts.map +1 -0
- package/types/schemas/RegisterSchema.d.ts +32 -0
- package/types/schemas/RegisterSchema.d.ts.map +1 -0
- package/types/schemas/RoleSchema.d.ts +67 -0
- package/types/schemas/RoleSchema.d.ts.map +1 -0
- package/types/schemas/TenantSchema.d.ts +29 -0
- package/types/schemas/TenantSchema.d.ts.map +1 -0
- package/types/schemas/UserApiKeySchema.d.ts +39 -0
- package/types/schemas/UserApiKeySchema.d.ts.map +1 -0
- package/types/schemas/UserSchema.d.ts +161 -0
- package/types/schemas/UserSchema.d.ts.map +1 -0
- package/types/services/PermissionService.d.ts +1 -0
- package/types/services/PermissionService.d.ts.map +1 -1
- package/types/services/TenantService.d.ts +3 -3
- package/types/services/TenantService.d.ts.map +1 -1
- package/types/services/UserService.d.ts.map +1 -1
- package/types/setup/CreateOrUpdateRole.d.ts +2 -2
- package/types/setup/CreateOrUpdateRole.d.ts.map +1 -1
- package/types/setup/CreateUserIfNotExist.d.ts +2 -2
- package/types/setup/CreateUserIfNotExist.d.ts.map +1 -1
- package/types/zod/EndpointZod.d.ts +20 -0
- package/types/zod/EndpointZod.d.ts.map +1 -0
- package/types/zod/TenantSchema.d.ts +26 -0
- package/types/zod/TenantSchema.d.ts.map +1 -0
- package/types/zod/TenantZod.d.ts +13 -3
- package/types/zod/TenantZod.d.ts.map +1 -1
- package/types/zod/UserApiKeyZod.d.ts +23 -3
- package/types/zod/UserApiKeyZod.d.ts.map +1 -1
- package/types/zod/UserZod.d.ts +6 -6
- package/src/zod/RoleZod.ts +0 -14
- 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:
|
|
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.
|
|
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:
|
|
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.
|
|
26
|
-
request.authUser.tenantId = userApiKey.user?.tenant?.
|
|
25
|
+
request.authUser.roleId = userApiKey.user.role._id;
|
|
26
|
+
request.authUser.tenantId = userApiKey.user?.tenant?._id;
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
return;
|
package/dist/models/RoleModel.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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,
|
|
24
|
-
export {
|
|
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
|
|
5
|
+
const TenantMongoSchema = new Schema({
|
|
6
6
|
name: { type: String, unique: true, required: true, index: true, },
|
|
7
|
-
}, { timestamps: true });
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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,
|
|
15
|
-
export {
|
|
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
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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,
|
|
48
|
-
export {
|
|
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
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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,
|
|
32
|
-
export {
|
|
31
|
+
const UserGroupModel = mongoose.model(USERGROUP_MODEL_NAME, UserGroupMongoSchema, USERGROUP_COLLECTION_NAME);
|
|
32
|
+
export { UserGroupMongoSchema, UserGroupModel };
|
|
33
33
|
export default UserGroupModel;
|
package/dist/models/UserModel.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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,
|
|
80
|
-
export {
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
8
|
-
|
|
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
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return
|
|
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
|
-
|
|
73
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
|
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
|
-
|
|
75
|
-
|
|
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,
|
|
3
|
-
import {
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
|
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
|
|
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 =
|
|
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
|
-
|
|
59
|
-
|
|
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
|
|
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,
|