@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
|
@@ -4,7 +4,7 @@ import type {IUserRepository} from "../interfaces/IUserRepository";
|
|
|
4
4
|
import {ZodError} from "zod";
|
|
5
5
|
import {SecuritySensitiveError, ValidationError, ZodErrorToValidationError} from "@drax/common-back";
|
|
6
6
|
import AuthUtils from "../utils/AuthUtils.js";
|
|
7
|
-
import {
|
|
7
|
+
import {UserCreateSchema, UserUpdateSchema, UserBaseSchema} from "../schemas/UserSchema.js";
|
|
8
8
|
import BadCredentialsError from "../errors/BadCredentialsError.js";
|
|
9
9
|
import {IDraxPaginateOptions, IDraxPaginateResult} from "@drax/crud-share";
|
|
10
10
|
import {AbstractService} from "@drax/crud-back";
|
|
@@ -15,7 +15,7 @@ class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate> {
|
|
|
15
15
|
_repository: IUserRepository
|
|
16
16
|
|
|
17
17
|
constructor(userRepository: IUserRepository) {
|
|
18
|
-
super(userRepository,
|
|
18
|
+
super(userRepository, UserBaseSchema);
|
|
19
19
|
this._repository = userRepository;
|
|
20
20
|
console.log("UserService constructor")
|
|
21
21
|
}
|
|
@@ -27,7 +27,7 @@ class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate> {
|
|
|
27
27
|
if (user && user.active && AuthUtils.checkPassword(password, user.password)) {
|
|
28
28
|
//TODO: Generar session
|
|
29
29
|
const session = randomUUID()
|
|
30
|
-
const accessToken = AuthUtils.generateToken(user.
|
|
30
|
+
const accessToken = AuthUtils.generateToken(user._id.toString(), user.username, user.role._id, user.tenant?._id, session)
|
|
31
31
|
return {accessToken: accessToken}
|
|
32
32
|
} else {
|
|
33
33
|
throw new BadCredentialsError()
|
|
@@ -47,7 +47,7 @@ class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate> {
|
|
|
47
47
|
|
|
48
48
|
if (user && user.active) {
|
|
49
49
|
const session = randomUUID()
|
|
50
|
-
const accessToken = AuthUtils.generateToken(user.
|
|
50
|
+
const accessToken = AuthUtils.generateToken(user._id.toString(), user.username, user.role._id, user.tenant?._id, session)
|
|
51
51
|
return {accessToken: accessToken}
|
|
52
52
|
} else {
|
|
53
53
|
throw new BadCredentialsError()
|
|
@@ -56,7 +56,7 @@ class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate> {
|
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
async changeUserPassword(userId: string, newPassword: string) {
|
|
59
|
-
const user = await this.
|
|
59
|
+
const user = await this._repository.findByIdWithPassword(userId)
|
|
60
60
|
if (user) {
|
|
61
61
|
newPassword = AuthUtils.hashPassword(newPassword)
|
|
62
62
|
await this._repository.changePassword(userId, newPassword)
|
|
@@ -68,8 +68,7 @@ class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate> {
|
|
|
68
68
|
|
|
69
69
|
|
|
70
70
|
async changeOwnPassword(userId: string, currentPassword: string, newPassword: string) {
|
|
71
|
-
const user = await this.
|
|
72
|
-
|
|
71
|
+
const user = await this._repository.findByIdWithPassword(userId)
|
|
73
72
|
if (user && user.active) {
|
|
74
73
|
|
|
75
74
|
if (currentPassword === newPassword) {
|
|
@@ -104,7 +103,7 @@ class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate> {
|
|
|
104
103
|
const recoveryCode = randomUUID()
|
|
105
104
|
const user = await this._repository.findByEmail(email)
|
|
106
105
|
if(user && user.active){
|
|
107
|
-
await this._repository.updatePartial(user.
|
|
106
|
+
await this._repository.updatePartial(user._id, {recoveryCode: recoveryCode})
|
|
108
107
|
return recoveryCode
|
|
109
108
|
}else{
|
|
110
109
|
throw new SecuritySensitiveError()
|
|
@@ -122,8 +121,8 @@ class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate> {
|
|
|
122
121
|
console.log("changeUserPasswordByCode user", user)
|
|
123
122
|
if (user && user.active) {
|
|
124
123
|
newPassword = AuthUtils.hashPassword(newPassword)
|
|
125
|
-
await this._repository.changePassword(user.
|
|
126
|
-
await this._repository.updatePartial(user.
|
|
124
|
+
await this._repository.changePassword(user._id, newPassword)
|
|
125
|
+
await this._repository.updatePartial(user._id, {recoveryCode: null})
|
|
127
126
|
return true
|
|
128
127
|
} else {
|
|
129
128
|
throw new ValidationError([{field:'recoveryCode', reason: 'validation.notFound'}])
|
|
@@ -160,7 +159,7 @@ class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate> {
|
|
|
160
159
|
async verifyEmail(emailCode: string): Promise<boolean> {
|
|
161
160
|
const user = await this._repository.findByEmailCode(emailCode)
|
|
162
161
|
if (user && user.emailVerified === false) {
|
|
163
|
-
await this._repository.updatePartial(user.
|
|
162
|
+
await this._repository.updatePartial(user._id, {
|
|
164
163
|
emailVerified: true,
|
|
165
164
|
active: true
|
|
166
165
|
})
|
|
@@ -173,7 +172,7 @@ class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate> {
|
|
|
173
172
|
async verifyPhone(phoneCode: string): Promise<boolean> {
|
|
174
173
|
const user = await this._repository.findByPhoneCode(phoneCode)
|
|
175
174
|
if (user && user.phoneVerified === false) {
|
|
176
|
-
await this._repository.updatePartial(user.
|
|
175
|
+
await this._repository.updatePartial(user._id, {
|
|
177
176
|
phoneVerified: true,
|
|
178
177
|
active: true
|
|
179
178
|
})
|
|
@@ -190,7 +189,7 @@ class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate> {
|
|
|
190
189
|
userData.password = userData?.password.trim()
|
|
191
190
|
userData.tenant = userData.tenant === "" ? null : userData.tenant
|
|
192
191
|
|
|
193
|
-
await
|
|
192
|
+
await UserCreateSchema.parseAsync(userData)
|
|
194
193
|
|
|
195
194
|
userData.password = AuthUtils.hashPassword(userData.password.trim())
|
|
196
195
|
|
|
@@ -212,7 +211,7 @@ class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate> {
|
|
|
212
211
|
delete userData.password
|
|
213
212
|
userData.tenant = userData.tenant === "" ? null : userData.tenant
|
|
214
213
|
|
|
215
|
-
await
|
|
214
|
+
await UserUpdateSchema.parseAsync(userData)
|
|
216
215
|
|
|
217
216
|
|
|
218
217
|
const user: IUser = await this._repository.update(id, userData)
|
|
@@ -285,9 +284,9 @@ class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate> {
|
|
|
285
284
|
|
|
286
285
|
async paginate({
|
|
287
286
|
page = 1,
|
|
288
|
-
limit =
|
|
287
|
+
limit = 10,
|
|
289
288
|
orderBy = '',
|
|
290
|
-
order =
|
|
289
|
+
order = "asc",
|
|
291
290
|
search = '',
|
|
292
291
|
filters = []
|
|
293
292
|
}: IDraxPaginateOptions): Promise<IDraxPaginateResult<IUser>> {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type {IRoleBase} from "@drax/identity-share"
|
|
1
|
+
import type {IRoleBase, IRole} from "@drax/identity-share"
|
|
2
2
|
import RoleServiceFactory from "../factory/RoleServiceFactory.js"
|
|
3
3
|
|
|
4
|
-
async function CreateOrUpdateRole(roleData: IRoleBase) {
|
|
4
|
+
async function CreateOrUpdateRole(roleData: IRoleBase):Promise<IRole> {
|
|
5
5
|
const roleService = RoleServiceFactory()
|
|
6
6
|
const role = await roleService.findByName(roleData.name)
|
|
7
7
|
|
|
@@ -10,7 +10,7 @@ async function CreateOrUpdateRole(roleData: IRoleBase) {
|
|
|
10
10
|
roleData.childRoles = await Promise.all(roleData.childRoles.map(async (childRole) => {
|
|
11
11
|
const role = await roleService.findByName(childRole)
|
|
12
12
|
if(role){
|
|
13
|
-
return role.
|
|
13
|
+
return role._id.toString()
|
|
14
14
|
}else{
|
|
15
15
|
return childRole
|
|
16
16
|
}
|
|
@@ -18,11 +18,14 @@ async function CreateOrUpdateRole(roleData: IRoleBase) {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
if(role){
|
|
21
|
-
|
|
21
|
+
console.log("RoleData",roleData)
|
|
22
|
+
const r = await roleService.systemUpdate(role._id.toString(), roleData)
|
|
22
23
|
console.log("Role Updated. Name: "+ roleData.name)
|
|
24
|
+
return r
|
|
23
25
|
}else{
|
|
24
26
|
const r = await roleService.create(roleData)
|
|
25
27
|
console.log("Role Created. Name: "+ roleData.name)
|
|
28
|
+
return r
|
|
26
29
|
}
|
|
27
30
|
}
|
|
28
31
|
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import RoleServiceFactory from "../factory/RoleServiceFactory.js"
|
|
2
2
|
import UserServiceFactory from "../factory/UserServiceFactory.js"
|
|
3
|
-
import {IUserCreate} from "@drax/identity-share";
|
|
3
|
+
import {IUserCreate, IUser} from "@drax/identity-share";
|
|
4
4
|
|
|
5
|
-
async function CreateUserIfNotExist(userData: IUserCreate) {
|
|
5
|
+
async function CreateUserIfNotExist(userData: IUserCreate): Promise<IUser> {
|
|
6
6
|
const userService = UserServiceFactory()
|
|
7
7
|
const roleService = RoleServiceFactory()
|
|
8
8
|
const user = await userService.findByUsername(userData.username)
|
|
9
9
|
if (user) {
|
|
10
|
+
return user
|
|
10
11
|
} else {
|
|
11
12
|
const role = await roleService.findByName(userData.role as string)
|
|
12
|
-
userData.role = role.
|
|
13
|
+
userData.role = role._id.toString()
|
|
13
14
|
const r = await userService.create(userData)
|
|
14
15
|
console.log("User Created. Username: " + userData.username)
|
|
16
|
+
return r
|
|
15
17
|
}
|
|
16
18
|
}
|
|
17
19
|
|
|
@@ -3,7 +3,7 @@ import UserServiceFactory from "../factory/UserServiceFactory.js"
|
|
|
3
3
|
async function RecoveryUserPassword(username:string, password:string) {
|
|
4
4
|
const userService = UserServiceFactory()
|
|
5
5
|
const user = await userService.findByUsername(username)
|
|
6
|
-
const r = await userService.changeUserPassword(user.
|
|
6
|
+
const r = await userService.changeUserPassword(user._id as string, password)
|
|
7
7
|
console.log("User password recovered. Username: " + username)
|
|
8
8
|
}
|
|
9
9
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import role from "../roles/admin-sqlite-role";
|
|
2
2
|
|
|
3
3
|
const user = {
|
|
4
|
-
|
|
4
|
+
_id: '539f51a6-5d40-4ef2-85c4-c580f042f422',
|
|
5
5
|
active: false,
|
|
6
6
|
groups: [],
|
|
7
7
|
username: "root",
|
|
@@ -10,7 +10,7 @@ const user = {
|
|
|
10
10
|
name: "root",
|
|
11
11
|
phone: "123456789",
|
|
12
12
|
avatar: "asd",
|
|
13
|
-
role: role.
|
|
13
|
+
role: role._id
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
export default user
|
|
@@ -8,7 +8,7 @@ async function RoleSqliteInitializer(): Promise<IRole> {
|
|
|
8
8
|
const roleRespository = new RoleSqliteRepository('test.db', true)
|
|
9
9
|
let roleData = (await import("../data-obj/roles/admin-sqlite-role")).default
|
|
10
10
|
|
|
11
|
-
let role = await roleRespository.findById(roleData.
|
|
11
|
+
let role = await roleRespository.findById(roleData._id as UUID)
|
|
12
12
|
if (!role) {
|
|
13
13
|
role = await roleRespository.create(roleData)
|
|
14
14
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {describe,it,
|
|
1
|
+
import {describe,it, beforeAll, afterAll} from "vitest"
|
|
2
2
|
import {equal} from "assert";
|
|
3
3
|
import RoleMongoRepository from "../../../src/repository/mongo/RoleMongoRepository";
|
|
4
4
|
import MongoInMemory from "../../db/MongoInMemory";
|
|
@@ -9,13 +9,13 @@ describe("RoleRepositoryTest", function() {
|
|
|
9
9
|
|
|
10
10
|
const roleReposirory = new RoleMongoRepository()
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
beforeAll(async () => {
|
|
13
13
|
await MongoInMemory.connect()
|
|
14
14
|
// console.log("BEFORE ROLE", MongoInMemory.mongooseStatus, MongoInMemory.serverStatus)
|
|
15
15
|
return
|
|
16
16
|
})
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
afterAll(async () => {
|
|
19
19
|
await MongoInMemory.DropAndClose()
|
|
20
20
|
//console.log("AFTER ROLE", MongoInMemory.status, MongoInMemory.serverStatus)
|
|
21
21
|
return
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {beforeAll, afterAll, describe, it, test} from "vitest"
|
|
2
2
|
import assert, {equal} from "assert";
|
|
3
3
|
import UserApiKeyMongoRepository from "../../../src/repository/mongo/UserApiKeyMongoRepository";
|
|
4
4
|
import MongoInMemory from "../../db/MongoInMemory";
|
|
@@ -9,14 +9,14 @@ import type {IDraxPaginateResult} from "@drax/crud-share";
|
|
|
9
9
|
import {mongoose, ValidationError} from "@drax/common-back";
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
describe("UserApiKeyRepositoryTest", function () {
|
|
13
13
|
|
|
14
14
|
let userApiKeyRepository = new UserApiKeyMongoRepository()
|
|
15
15
|
let data
|
|
16
16
|
let adminRole
|
|
17
17
|
let rootUser
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
beforeAll(async () => {
|
|
20
20
|
await MongoInMemory.connect()
|
|
21
21
|
adminRole = await RoleMongoInitializer.initAdminRole()
|
|
22
22
|
rootUser = await UserMongoInitializer.initRootUser()
|
|
@@ -25,7 +25,7 @@ test.describe("UserApiKeyRepositoryTest", function () {
|
|
|
25
25
|
return
|
|
26
26
|
})
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
afterAll(async () => {
|
|
29
29
|
await MongoInMemory.DropAndClose()
|
|
30
30
|
//console.log("AFTER USER", MongoInMemory.status, MongoInMemory.serverStatus)
|
|
31
31
|
return
|
|
@@ -33,6 +33,7 @@ test.describe("UserApiKeyRepositoryTest", function () {
|
|
|
33
33
|
|
|
34
34
|
test("Create mongo user apikey successfully", async function () {
|
|
35
35
|
data = (await import("../../data-obj/apikey/root-mongo-user-apikey")).default
|
|
36
|
+
console.log("Data:",data)
|
|
36
37
|
let userApiKeyCreated = await userApiKeyRepository.create(data)
|
|
37
38
|
equal(userApiKeyCreated.name, data.name)
|
|
38
39
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {beforeAll, afterAll, describe, test} from "vitest"
|
|
2
2
|
import assert, {equal} from "assert";
|
|
3
3
|
import UserMongoRepository from "../../../src/repository/mongo/UserMongoRepository";
|
|
4
4
|
import MongoInMemory from "../../db/MongoInMemory";
|
|
@@ -8,13 +8,13 @@ import type {IDraxPaginateResult} from "@drax/crud-share";
|
|
|
8
8
|
import {mongoose, ValidationError} from "@drax/common-back";
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
describe("UserRepositoryTest", function () {
|
|
12
12
|
|
|
13
13
|
let userRepository = new UserMongoRepository()
|
|
14
14
|
let adminRole
|
|
15
15
|
let userAdminData
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
beforeAll(async () => {
|
|
18
18
|
await MongoInMemory.connect()
|
|
19
19
|
adminRole = await RoleMongoInitializer.initAdminRole()
|
|
20
20
|
|
|
@@ -22,7 +22,7 @@ test.describe("UserRepositoryTest", function () {
|
|
|
22
22
|
return
|
|
23
23
|
})
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
afterAll(async () => {
|
|
26
26
|
await MongoInMemory.DropAndClose()
|
|
27
27
|
//console.log("AFTER USER", MongoInMemory.status, MongoInMemory.serverStatus)
|
|
28
28
|
return
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {describe,it,
|
|
1
|
+
import {describe,it, beforeAll, afterAll} from "vitest"
|
|
2
2
|
import {equal} from "assert";
|
|
3
3
|
import {IRole} from "../../../../identity-share/src/interfaces/IRole";
|
|
4
4
|
import {IDraxPaginateResult} from "@drax/crud-share";
|
|
@@ -7,18 +7,23 @@ import {UUID} from "crypto";
|
|
|
7
7
|
|
|
8
8
|
describe("RoleRepositoryTest", function() {
|
|
9
9
|
|
|
10
|
-
const repository = new RoleSqliteRepository("test.db",
|
|
10
|
+
const repository = new RoleSqliteRepository("test.db", true)
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
repository.
|
|
12
|
+
beforeAll(async () => {
|
|
13
|
+
repository.build()
|
|
14
14
|
return
|
|
15
15
|
})
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
await repository.deleteAll()
|
|
17
|
+
afterAll(async () => {
|
|
18
|
+
//await repository.deleteAll()
|
|
19
19
|
return
|
|
20
20
|
})
|
|
21
21
|
|
|
22
|
+
it("Delete All.", async function() {
|
|
23
|
+
let r = await repository.deleteAll()
|
|
24
|
+
equal(r,true)
|
|
25
|
+
})
|
|
26
|
+
|
|
22
27
|
it("Create a role successfully.", async function() {
|
|
23
28
|
let roleData = (await import("../../data-obj/roles/admin-sqlite-role")).default
|
|
24
29
|
let roleCreated: IRole = await repository.create(roleData)
|
|
@@ -33,7 +38,7 @@ describe("RoleRepositoryTest", function() {
|
|
|
33
38
|
|
|
34
39
|
it("Find role by ID successfully.", async function() {
|
|
35
40
|
let roleData = (await import("../../data-obj/roles/admin-sqlite-role")).default
|
|
36
|
-
let role: IRole = await repository.findById(roleData.
|
|
41
|
+
let role: IRole = await repository.findById(roleData._id as UUID)
|
|
37
42
|
equal(role.name,roleData.name)
|
|
38
43
|
})
|
|
39
44
|
|
|
@@ -56,13 +61,20 @@ describe("RoleRepositoryTest", function() {
|
|
|
56
61
|
it("Update a role successfully.", async function() {
|
|
57
62
|
let roleData = (await import("../../data-obj/roles/admin-sqlite-role")).default
|
|
58
63
|
roleData.name = "AdminUpdated"
|
|
59
|
-
let roleUpdated: IRole = await repository.update(roleData.
|
|
64
|
+
let roleUpdated: IRole = await repository.update(roleData._id as UUID, roleData)
|
|
60
65
|
equal(roleUpdated.name,roleData.name)
|
|
61
66
|
})
|
|
62
67
|
|
|
68
|
+
it("UpdatePartial a role successfully.", async function() {
|
|
69
|
+
let roleData = (await import("../../data-obj/roles/admin-sqlite-role")).default
|
|
70
|
+
let partial = {name: "AdminUpdatedPartial"}
|
|
71
|
+
let roleUpdated: IRole = await repository.updatePartial(roleData._id as UUID, partial)
|
|
72
|
+
equal(roleUpdated.name,'AdminUpdatedPartial')
|
|
73
|
+
})
|
|
74
|
+
|
|
63
75
|
it("Delete a role successfully.", async function() {
|
|
64
76
|
let roleData = (await import("../../data-obj/roles/admin-sqlite-role")).default
|
|
65
|
-
let roleDeleted: Boolean = await repository.delete(roleData.
|
|
77
|
+
let roleDeleted: Boolean = await repository.delete(roleData._id as UUID)
|
|
66
78
|
equal(roleDeleted,true)
|
|
67
79
|
})
|
|
68
80
|
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import {describe,it, beforeAll, afterAll} from "vitest"
|
|
2
|
+
import {equal} from "assert";
|
|
3
|
+
import {ITenant} from "../../../../identity-share/src/interfaces/ITenant";
|
|
4
|
+
import {IDraxPaginateResult} from "@drax/crud-share";
|
|
5
|
+
import TenantSqliteRepository from "../../../src/repository/sqlite/TenantSqliteRepository";
|
|
6
|
+
import {UUID} from "crypto";
|
|
7
|
+
|
|
8
|
+
describe("TenantRepositoryTest", function() {
|
|
9
|
+
|
|
10
|
+
const repository = new TenantSqliteRepository("test.db", true)
|
|
11
|
+
|
|
12
|
+
beforeAll(async () => {
|
|
13
|
+
repository.build()
|
|
14
|
+
return
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
afterAll(async () => {
|
|
18
|
+
//await repository.deleteAll()
|
|
19
|
+
return
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
it("Delete All.", async function() {
|
|
23
|
+
let r = await repository.deleteAll()
|
|
24
|
+
equal(r,true)
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
it("Create a tenant successfully.", async function() {
|
|
28
|
+
let tenantData = (await import("../../data-obj/tenants/company-sqlite-tenant")).default
|
|
29
|
+
let tenantCreated: ITenant = await repository.create(tenantData)
|
|
30
|
+
equal(tenantCreated.name,tenantData.name)
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it("Create a second tenant successfully.", async function() {
|
|
34
|
+
let tenantCreated: ITenant = await repository.create({name: "Company2" })
|
|
35
|
+
equal(tenantCreated.name,"Company2")
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
it("Find tenant by ID successfully.", async function() {
|
|
40
|
+
let tenantData = (await import("../../data-obj/tenants/company-sqlite-tenant")).default
|
|
41
|
+
let tenant: ITenant = await repository.findById(tenantData._id as UUID)
|
|
42
|
+
equal(tenant.name,tenantData.name)
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
it("Retrieving all tenants successfully.", async function() {
|
|
47
|
+
let tenants: ITenant[] = await repository.fetchAll()
|
|
48
|
+
equal(tenants.length,2)
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
it("Paginate tenants successfully.", async function() {
|
|
52
|
+
let paginateTenants: IDraxPaginateResult<ITenant> = await repository.paginate({page: 1, limit: 5})
|
|
53
|
+
console.log(paginateTenants)
|
|
54
|
+
equal(paginateTenants.items.length,2)
|
|
55
|
+
equal(paginateTenants.total,2)
|
|
56
|
+
equal(paginateTenants.page,1)
|
|
57
|
+
equal(paginateTenants.limit,5)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
it("Update a tenant successfully.", async function() {
|
|
61
|
+
let tenantData = (await import("../../data-obj/tenants/company-sqlite-tenant")).default
|
|
62
|
+
tenantData.name = "AdminUpdated"
|
|
63
|
+
let tenantUpdated: ITenant = await repository.update(tenantData._id as UUID, tenantData)
|
|
64
|
+
equal(tenantUpdated.name,tenantData.name)
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
it("Delete a tenant successfully.", async function() {
|
|
68
|
+
let tenantData = (await import("../../data-obj/tenants/company-sqlite-tenant")).default
|
|
69
|
+
let tenantDeleted: Boolean = await repository.delete(tenantData._id as UUID)
|
|
70
|
+
equal(tenantDeleted,true)
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {beforeAll, afterAll, describe, it, test} from "vitest"
|
|
2
2
|
import assert, {equal} from "assert";
|
|
3
3
|
import UserSqliteRepository from "../../../src/repository/sqlite/UserSqliteRepository";
|
|
4
4
|
import {IUser} from "../../../../identity-share/src/interfaces/IUser";
|
|
@@ -8,24 +8,30 @@ import {ValidationError} from "@drax/common-back";
|
|
|
8
8
|
import {UUID} from "crypto";
|
|
9
9
|
import RoleSqliteInitializer from "../../initializers/RoleSqliteInitializer";
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
describe("UserRepositoryTest", function () {
|
|
12
12
|
|
|
13
13
|
let userRepository = new UserSqliteRepository("test.db", false)
|
|
14
14
|
let userAdminData: any
|
|
15
15
|
let adminRole: IRole
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
userRepository.
|
|
17
|
+
beforeAll(async () => {
|
|
18
|
+
userRepository.build()
|
|
19
19
|
adminRole = (await import("../../data-obj/roles/admin-sqlite-role")).default
|
|
20
20
|
adminRole = await RoleSqliteInitializer()
|
|
21
21
|
return
|
|
22
22
|
})
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
await userRepository.deleteAll()
|
|
24
|
+
afterAll(async () => {
|
|
25
|
+
// await userRepository.deleteAll()
|
|
26
26
|
return
|
|
27
27
|
})
|
|
28
28
|
|
|
29
|
+
it("Delete All.", async function() {
|
|
30
|
+
let r = await userRepository.deleteAll()
|
|
31
|
+
equal(r,true)
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
|
|
29
35
|
test("Create sqlite user successfully", async function () {
|
|
30
36
|
userAdminData = (await import("../../data-obj/users/root-sqlite-user")).default
|
|
31
37
|
let userCreated:IUser = await userRepository.create(userAdminData)
|
|
@@ -34,7 +40,7 @@ test.describe("UserRepositoryTest", function () {
|
|
|
34
40
|
|
|
35
41
|
test("Find user by ID successfully", async function () {
|
|
36
42
|
userAdminData = (await import("../../data-obj/users/root-sqlite-user")).default
|
|
37
|
-
let userFound = await userRepository.findById(userAdminData.
|
|
43
|
+
let userFound = await userRepository.findById(userAdminData._id as UUID)
|
|
38
44
|
equal(userFound.username, userAdminData.username)
|
|
39
45
|
//ROLE POPULATED
|
|
40
46
|
let rolefound = userFound.role as IRole
|
|
@@ -60,7 +66,7 @@ test.describe("UserRepositoryTest", function () {
|
|
|
60
66
|
|
|
61
67
|
test("Create sqlite user fail same username", async function () {
|
|
62
68
|
userAdminData = (await import("../../data-obj/users/root-sqlite-user")).default
|
|
63
|
-
let userData = {...userAdminData,
|
|
69
|
+
let userData = {...userAdminData, _id: '539f51a6-5d40-4ef2-85c4-f480f042f422', email: "asd123@asd123.com" }
|
|
64
70
|
|
|
65
71
|
await assert.rejects(
|
|
66
72
|
async () => {
|
|
@@ -78,7 +84,7 @@ test.describe("UserRepositoryTest", function () {
|
|
|
78
84
|
test("Create sqlite user fail if role doesnt exist", async function () {
|
|
79
85
|
userAdminData = (await import("../../data-obj/users/root-sqlite-user")).default
|
|
80
86
|
let userData = {...userAdminData,
|
|
81
|
-
|
|
87
|
+
_id: '539f51a6-5d40-4ef2-85c4-f480f042f422',
|
|
82
88
|
email: "a456@asd567.com",
|
|
83
89
|
username: "rolenotexist",
|
|
84
90
|
role: "notexist"
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {CreateOrUpdateRole} from "../../../src/setup/CreateOrUpdateRole";
|
|
2
|
+
import {CreateUserIfNotExist} from "../../../src/setup/CreateUserIfNotExist";
|
|
3
|
+
import rootUser from "../data/root-user";
|
|
4
|
+
import adminRole from "../data/admin-role";
|
|
5
|
+
import {IUser, IRole} from "@drax/identity-share";
|
|
6
|
+
|
|
7
|
+
async function CreateRootUserAndAdminRole(){
|
|
8
|
+
const role:IRole = await CreateOrUpdateRole(adminRole)
|
|
9
|
+
const user:IUser = await CreateUserIfNotExist(rootUser)
|
|
10
|
+
return {user, role}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export default CreateRootUserAndAdminRole
|
|
14
|
+
|
|
15
|
+
export {
|
|
16
|
+
CreateRootUserAndAdminRole
|
|
17
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import Fastify from "fastify";
|
|
2
|
+
import {InternalServerError} from "@drax/common-back";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
jwtMiddleware, rbacMiddleware, apiKeyMiddleware,
|
|
6
|
+
} from '../../../src/index'
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
const FastifyTestServerFactory = () => {
|
|
10
|
+
const fastify = Fastify()
|
|
11
|
+
fastify.setErrorHandler((error, request, reply) => {
|
|
12
|
+
console.error("Error",error)
|
|
13
|
+
let serverError = new InternalServerError()
|
|
14
|
+
reply.status(serverError.statusCode).send(serverError.body)
|
|
15
|
+
},)
|
|
16
|
+
fastify.setValidatorCompiler(() => () => true)
|
|
17
|
+
|
|
18
|
+
fastify.addHook('onRequest', jwtMiddleware)
|
|
19
|
+
fastify.addHook('onRequest', rbacMiddleware)
|
|
20
|
+
fastify.addHook('onRequest', apiKeyMiddleware)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
// fastify.addHook('preHandler', async (request, reply) => {
|
|
24
|
+
// //@ts-ignore
|
|
25
|
+
// request.rbac = {assertPermission: () => true, getAuthUser: {username: 'admin', tenantId: ''}};
|
|
26
|
+
// //@ts-ignore
|
|
27
|
+
// request.authUser = {id:USER._id, username: USER.username, tenantId: '', roleId: USER.role};
|
|
28
|
+
// });
|
|
29
|
+
|
|
30
|
+
return fastify
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export default FastifyTestServerFactory
|
|
34
|
+
export {FastifyTestServerFactory}
|