@drax/identity-back 0.11.5 → 0.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/dist/controllers/RoleController.js +8 -39
  2. package/dist/controllers/TenantController.js +1 -28
  3. package/dist/controllers/UserApiKeyController.js +3 -3
  4. package/dist/controllers/UserController.js +48 -209
  5. package/dist/errors/BadCredentialsError.js +12 -0
  6. package/dist/factory/RoleServiceFactory.js +1 -0
  7. package/dist/factory/TenantServiceFactory.js +1 -0
  8. package/dist/factory/UserApiKeyServiceFactory.js +5 -4
  9. package/dist/factory/UserServiceFactory.js +1 -0
  10. package/dist/graphql/resolvers/role.resolvers.js +2 -2
  11. package/dist/graphql/resolvers/tenant.resolvers.js +2 -2
  12. package/dist/graphql/resolvers/user-api-key.resolvers.js +2 -2
  13. package/dist/graphql/resolvers/user.resolvers.js +1 -1
  14. package/dist/index.js +6 -0
  15. package/dist/middleware/apiKeyMiddleware.js +2 -2
  16. package/dist/models/RoleModel.js +10 -7
  17. package/dist/models/TenantModel.js +11 -8
  18. package/dist/models/UserApiKeyModel.js +10 -7
  19. package/dist/models/UserGroupModel.js +7 -7
  20. package/dist/models/UserModel.js +10 -8
  21. package/dist/rbac/Rbac.js +10 -8
  22. package/dist/repository/mongo/RoleMongoRepository.js +20 -65
  23. package/dist/repository/mongo/TenantMongoRepository.js +18 -66
  24. package/dist/repository/mongo/UserApiKeyMongoRepository.js +29 -47
  25. package/dist/repository/mongo/UserMongoRepository.js +56 -85
  26. package/dist/repository/sqlite/RoleSqliteRepository.js +30 -115
  27. package/dist/repository/sqlite/TenantSqliteRepository.js +15 -105
  28. package/dist/repository/sqlite/UserApiKeySqliteRepository.js +42 -117
  29. package/dist/repository/sqlite/UserSqliteRepository.js +49 -130
  30. package/dist/routes/RoleRoutes.js +35 -10
  31. package/dist/routes/TenantRoutes.js +18 -9
  32. package/dist/routes/UserApiKeyRoutes.js +20 -4
  33. package/dist/routes/UserRoutes.js +92 -17
  34. package/dist/schemas/LoginSchema.js +9 -0
  35. package/dist/schemas/PasswordSchema.js +12 -0
  36. package/dist/schemas/RegisterSchema.js +19 -0
  37. package/dist/schemas/RoleSchema.js +23 -0
  38. package/dist/schemas/TenantSchema.js +13 -0
  39. package/dist/schemas/UserApiKeySchema.js +14 -0
  40. package/dist/schemas/UserSchema.js +39 -0
  41. package/dist/services/PermissionService.js +5 -5
  42. package/dist/services/RoleService.js +6 -6
  43. package/dist/services/TenantService.js +6 -6
  44. package/dist/services/UserApiKeyService.js +5 -5
  45. package/dist/services/UserService.js +14 -14
  46. package/dist/setup/CreateOrUpdateRole.js +5 -2
  47. package/dist/setup/CreateUserIfNotExist.js +3 -1
  48. package/dist/setup/RecoveryUserPassword.js +1 -1
  49. package/dist/zod/EndpointZod.js +9 -0
  50. package/dist/zod/TenantSchema.js +12 -0
  51. package/dist/zod/TenantZod.js +5 -3
  52. package/dist/zod/UserApiKeyZod.js +7 -3
  53. package/package.json +10 -9
  54. package/src/controllers/RoleController.ts +8 -36
  55. package/src/controllers/TenantController.ts +2 -25
  56. package/src/controllers/UserApiKeyController.ts +3 -3
  57. package/src/controllers/UserController.ts +50 -183
  58. package/src/errors/BadCredentialsError.ts +18 -1
  59. package/src/factory/RoleServiceFactory.ts +1 -0
  60. package/src/factory/TenantServiceFactory.ts +1 -0
  61. package/src/factory/UserApiKeyServiceFactory.ts +5 -4
  62. package/src/factory/UserServiceFactory.ts +1 -0
  63. package/src/graphql/resolvers/role.resolvers.ts +3 -2
  64. package/src/graphql/resolvers/tenant.resolvers.ts +3 -2
  65. package/src/graphql/resolvers/user-api-key.resolvers.ts +3 -2
  66. package/src/graphql/resolvers/user.resolvers.ts +2 -1
  67. package/src/index.ts +16 -0
  68. package/src/interfaces/ITenantRepository.ts +2 -2
  69. package/src/interfaces/IUserApiKeyRepository.ts +2 -2
  70. package/src/interfaces/IUserRepository.ts +3 -2
  71. package/src/middleware/apiKeyMiddleware.ts +2 -2
  72. package/src/models/RoleModel.ts +12 -7
  73. package/src/models/TenantModel.ts +13 -8
  74. package/src/models/UserApiKeyModel.ts +12 -7
  75. package/src/models/UserGroupModel.ts +7 -7
  76. package/src/models/UserModel.ts +10 -8
  77. package/src/rbac/Rbac.ts +12 -9
  78. package/src/repository/mongo/RoleMongoRepository.ts +23 -94
  79. package/src/repository/mongo/TenantMongoRepository.ts +19 -98
  80. package/src/repository/mongo/UserApiKeyMongoRepository.ts +31 -56
  81. package/src/repository/mongo/UserMongoRepository.ts +71 -130
  82. package/src/repository/sqlite/RoleSqliteRepository.ts +37 -146
  83. package/src/repository/sqlite/TenantSqliteRepository.ts +16 -156
  84. package/src/repository/sqlite/UserApiKeySqliteRepository.ts +46 -151
  85. package/src/repository/sqlite/UserSqliteRepository.ts +59 -173
  86. package/src/routes/RoleRoutes.ts +35 -12
  87. package/src/routes/TenantRoutes.ts +25 -9
  88. package/src/routes/UserApiKeyRoutes.ts +23 -7
  89. package/src/routes/UserRoutes.ts +117 -34
  90. package/src/schemas/LoginSchema.ts +12 -0
  91. package/src/schemas/PasswordSchema.ts +16 -0
  92. package/src/{zod/UserZod.ts → schemas/RegisterSchema.ts} +7 -10
  93. package/src/schemas/RoleSchema.ts +29 -0
  94. package/src/schemas/TenantSchema.ts +22 -0
  95. package/src/{zod/UserApiKeyZod.ts → schemas/UserApiKeySchema.ts} +8 -3
  96. package/src/schemas/UserSchema.ts +57 -0
  97. package/src/services/PermissionService.ts +6 -5
  98. package/src/services/RoleService.ts +6 -6
  99. package/src/services/TenantService.ts +10 -10
  100. package/src/services/UserApiKeyService.ts +5 -5
  101. package/src/services/UserService.ts +15 -16
  102. package/src/setup/CreateOrUpdateRole.ts +7 -4
  103. package/src/setup/CreateUserIfNotExist.ts +5 -3
  104. package/src/setup/RecoveryUserPassword.ts +1 -1
  105. package/test/data-obj/apikey/root-mongo-user-apikey.ts +2 -1
  106. package/test/data-obj/roles/admin-sqlite-role.ts +2 -2
  107. package/test/data-obj/roles/operator-sqlite-role.ts +1 -1
  108. package/test/data-obj/tenants/company-sqlite-tenant.ts +6 -0
  109. package/test/data-obj/users/root-sqlite-user.ts +2 -2
  110. package/test/initializers/RoleSqliteInitializer.ts +1 -1
  111. package/test/repository/mongo/role-mongo-repository.test.ts +3 -3
  112. package/test/repository/mongo/user-apikey-mongo-repository.test.ts +5 -4
  113. package/test/repository/mongo/user-mongo-repository.test.ts +4 -4
  114. package/test/repository/sqlite/role-sqlite-repository.test.ts +21 -9
  115. package/test/repository/sqlite/tenant-sqlite-repository.test.ts +74 -0
  116. package/test/repository/sqlite/user-sqlite-repository.test.ts +15 -9
  117. package/test/routes/data/admin-role.ts +10 -0
  118. package/test/routes/data/root-user.ts +13 -0
  119. package/test/routes/helpers/CreateRootUserAndAdminRole.ts +17 -0
  120. package/test/routes/helpers/FastifyTestServerFactory.ts +34 -0
  121. package/test/routes/helpers/InitializePermissions.ts +23 -0
  122. package/test/routes/helpers/SetupIdentityDrax.ts +22 -0
  123. package/test/routes/tenant-route.test.ts +336 -0
  124. package/test/routes/user-route.test.ts +186 -0
  125. package/test/schemas/lab-schema.test.ts +110 -0
  126. package/test/service/mock-service.test.ts +3 -3
  127. package/test/service/role-service.test.ts +3 -3
  128. package/test/service/user-service.test.ts +16 -25
  129. package/test.db +0 -0
  130. package/tsconfig.tsbuildinfo +1 -1
  131. package/types/controllers/RoleController.d.ts +0 -1
  132. package/types/controllers/RoleController.d.ts.map +1 -1
  133. package/types/controllers/TenantController.d.ts +0 -1
  134. package/types/controllers/TenantController.d.ts.map +1 -1
  135. package/types/controllers/UserController.d.ts +11 -4
  136. package/types/controllers/UserController.d.ts.map +1 -1
  137. package/types/errors/BadCredentialsError.d.ts +9 -1
  138. package/types/errors/BadCredentialsError.d.ts.map +1 -1
  139. package/types/factory/RoleServiceFactory.d.ts.map +1 -1
  140. package/types/factory/TenantServiceFactory.d.ts.map +1 -1
  141. package/types/factory/UserApiKeyServiceFactory.d.ts.map +1 -1
  142. package/types/factory/UserServiceFactory.d.ts.map +1 -1
  143. package/types/graphql/resolvers/role.resolvers.d.ts +3 -9
  144. package/types/graphql/resolvers/role.resolvers.d.ts.map +1 -1
  145. package/types/graphql/resolvers/tenant.resolvers.d.ts +3 -9
  146. package/types/graphql/resolvers/tenant.resolvers.d.ts.map +1 -1
  147. package/types/graphql/resolvers/user-api-key.resolvers.d.ts +3 -9
  148. package/types/graphql/resolvers/user-api-key.resolvers.d.ts.map +1 -1
  149. package/types/graphql/resolvers/user.resolvers.d.ts +3 -9
  150. package/types/graphql/resolvers/user.resolvers.d.ts.map +1 -1
  151. package/types/index.d.ts +5 -1
  152. package/types/index.d.ts.map +1 -1
  153. package/types/interfaces/ITenantRepository.d.ts +2 -2
  154. package/types/interfaces/ITenantRepository.d.ts.map +1 -1
  155. package/types/interfaces/IUserApiKeyRepository.d.ts +2 -2
  156. package/types/interfaces/IUserApiKeyRepository.d.ts.map +1 -1
  157. package/types/interfaces/IUserRepository.d.ts +3 -2
  158. package/types/interfaces/IUserRepository.d.ts.map +1 -1
  159. package/types/models/RoleModel.d.ts +7 -7
  160. package/types/models/RoleModel.d.ts.map +1 -1
  161. package/types/models/TenantModel.d.ts +7 -7
  162. package/types/models/TenantModel.d.ts.map +1 -1
  163. package/types/models/UserApiKeyModel.d.ts +7 -7
  164. package/types/models/UserApiKeyModel.d.ts.map +1 -1
  165. package/types/models/UserGroupModel.d.ts +2 -2
  166. package/types/models/UserGroupModel.d.ts.map +1 -1
  167. package/types/models/UserModel.d.ts +7 -7
  168. package/types/models/UserModel.d.ts.map +1 -1
  169. package/types/rbac/Rbac.d.ts +1 -1
  170. package/types/rbac/Rbac.d.ts.map +1 -1
  171. package/types/repository/mongo/RoleMongoRepository.d.ts +9 -11
  172. package/types/repository/mongo/RoleMongoRepository.d.ts.map +1 -1
  173. package/types/repository/mongo/TenantMongoRepository.d.ts +8 -11
  174. package/types/repository/mongo/TenantMongoRepository.d.ts.map +1 -1
  175. package/types/repository/mongo/UserApiKeyMongoRepository.d.ts +12 -5
  176. package/types/repository/mongo/UserApiKeyMongoRepository.d.ts.map +1 -1
  177. package/types/repository/mongo/UserMongoRepository.d.ts +11 -12
  178. package/types/repository/mongo/UserMongoRepository.d.ts.map +1 -1
  179. package/types/repository/sqlite/RoleSqliteRepository.d.ts +14 -14
  180. package/types/repository/sqlite/RoleSqliteRepository.d.ts.map +1 -1
  181. package/types/repository/sqlite/TenantSqliteRepository.d.ts +12 -14
  182. package/types/repository/sqlite/TenantSqliteRepository.d.ts.map +1 -1
  183. package/types/repository/sqlite/UserApiKeySqliteRepository.d.ts +15 -11
  184. package/types/repository/sqlite/UserApiKeySqliteRepository.d.ts.map +1 -1
  185. package/types/repository/sqlite/UserSqliteRepository.d.ts +15 -12
  186. package/types/repository/sqlite/UserSqliteRepository.d.ts.map +1 -1
  187. package/types/routes/RoleRoutes.d.ts.map +1 -1
  188. package/types/routes/TenantRoutes.d.ts.map +1 -1
  189. package/types/routes/UserApiKeyRoutes.d.ts.map +1 -1
  190. package/types/routes/UserRoutes.d.ts.map +1 -1
  191. package/types/schemas/LoginSchema.d.ts +20 -0
  192. package/types/schemas/LoginSchema.d.ts.map +1 -0
  193. package/types/schemas/PasswordSchema.d.ts +27 -0
  194. package/types/schemas/PasswordSchema.d.ts.map +1 -0
  195. package/types/schemas/RegisterSchema.d.ts +32 -0
  196. package/types/schemas/RegisterSchema.d.ts.map +1 -0
  197. package/types/schemas/RoleSchema.d.ts +67 -0
  198. package/types/schemas/RoleSchema.d.ts.map +1 -0
  199. package/types/schemas/TenantSchema.d.ts +29 -0
  200. package/types/schemas/TenantSchema.d.ts.map +1 -0
  201. package/types/schemas/UserApiKeySchema.d.ts +39 -0
  202. package/types/schemas/UserApiKeySchema.d.ts.map +1 -0
  203. package/types/schemas/UserSchema.d.ts +161 -0
  204. package/types/schemas/UserSchema.d.ts.map +1 -0
  205. package/types/services/PermissionService.d.ts +1 -0
  206. package/types/services/PermissionService.d.ts.map +1 -1
  207. package/types/services/TenantService.d.ts +3 -3
  208. package/types/services/TenantService.d.ts.map +1 -1
  209. package/types/services/UserService.d.ts.map +1 -1
  210. package/types/setup/CreateOrUpdateRole.d.ts +2 -2
  211. package/types/setup/CreateOrUpdateRole.d.ts.map +1 -1
  212. package/types/setup/CreateUserIfNotExist.d.ts +2 -2
  213. package/types/setup/CreateUserIfNotExist.d.ts.map +1 -1
  214. package/types/zod/EndpointZod.d.ts +20 -0
  215. package/types/zod/EndpointZod.d.ts.map +1 -0
  216. package/types/zod/TenantSchema.d.ts +26 -0
  217. package/types/zod/TenantSchema.d.ts.map +1 -0
  218. package/types/zod/TenantZod.d.ts +13 -3
  219. package/types/zod/TenantZod.d.ts.map +1 -1
  220. package/types/zod/UserApiKeyZod.d.ts +23 -3
  221. package/types/zod/UserApiKeyZod.d.ts.map +1 -1
  222. package/types/zod/UserZod.d.ts +6 -6
  223. package/src/zod/RoleZod.ts +0 -14
  224. package/src/zod/TenantZod.ts +0 -14
@@ -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 {createUserSchema, editUserSchema, userBaseSchema} from "../zod/UserZod.js";
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, userBaseSchema);
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.id.toString(), user.username, user.role.id, user.tenant?.id, session)
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.id.toString(), user.username, user.role.id, user.tenant?.id, session)
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.findById(userId)
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.findById(userId)
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.id, {recoveryCode: recoveryCode})
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.id, newPassword)
126
- await this._repository.updatePartial(user.id, {recoveryCode: null})
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.id, {
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.id, {
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 createUserSchema.parseAsync(userData)
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 editUserSchema.parseAsync(userData)
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 = 5,
287
+ limit = 10,
289
288
  orderBy = '',
290
- order = false,
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.id
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
- const r = await roleService.systemUpdate(role.id, roleData)
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.id as string
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.id as string, password)
6
+ const r = await userService.changeUserPassword(user._id as string, password)
7
7
  console.log("User password recovered. Username: " + username)
8
8
  }
9
9
 
@@ -4,7 +4,8 @@ const userApiKey = {
4
4
  _id: "646a661e44c93567c23d8c22",
5
5
  name: "root",
6
6
  secret: "123",
7
- user: user._id
7
+ user: user._id,
8
+ createdBy: user._id
8
9
  };
9
10
 
10
11
  export default userApiKey
@@ -1,7 +1,7 @@
1
1
  const role = {
2
- id: 'b0465ce9-60f8-4ff2-bdcb-214b4bee9135',
2
+ _id: 'b0465ce9-60f8-4ff2-bdcb-214b4bee9135',
3
3
  name: "Admin",
4
- permissions: [],
4
+ permissions: ['create', 'read', 'update', 'delete'],
5
5
  childRoles: [],
6
6
  readonly: false
7
7
  }
@@ -1,5 +1,5 @@
1
1
  const role = {
2
- id: 'b0465ce9-60f8-4ff2-bdcb-214b4bee8545',
2
+ _id: 'b0465ce9-60f8-4ff2-bdcb-214b4bee8545',
3
3
  name: "Operator",
4
4
  permissions: [],
5
5
  childRoles: [],
@@ -0,0 +1,6 @@
1
+ const tenant = {
2
+ _id: 'b0465ce9-60f8-4ff2-bdcb-214b4bee8532',
3
+ name: "Company",
4
+ }
5
+
6
+ export default tenant
@@ -1,7 +1,7 @@
1
1
  import role from "../roles/admin-sqlite-role";
2
2
 
3
3
  const user = {
4
- id: '539f51a6-5d40-4ef2-85c4-c580f042f422',
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.id
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.id as UUID)
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, before, after} from "node:test"
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
- before(async () => {
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
- after(async () => {
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 {before, after, describe, it, test} from "node:test"
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
- test.describe("UserApiKeyRepositoryTest", function () {
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
- before(async () => {
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
- after(async () => {
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 {before, after, describe, it, test} from "node:test"
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
- test.describe("UserRepositoryTest", function () {
11
+ describe("UserRepositoryTest", function () {
12
12
 
13
13
  let userRepository = new UserMongoRepository()
14
14
  let adminRole
15
15
  let userAdminData
16
16
 
17
- before(async () => {
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
- after(async () => {
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, before, after} from "node:test"
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", false)
10
+ const repository = new RoleSqliteRepository("test.db", true)
11
11
 
12
- before(async () => {
13
- repository.table()
12
+ beforeAll(async () => {
13
+ repository.build()
14
14
  return
15
15
  })
16
16
 
17
- after(async () => {
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.id as UUID)
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.id as UUID, 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.id as UUID)
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 {before, after, describe, it, test} from "node:test"
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
- test.describe("UserRepositoryTest", function () {
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
- before(async () => {
18
- userRepository.table()
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
- after(async () => {
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.id as UUID)
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, id: '539f51a6-5d40-4ef2-85c4-f480f042f422', email: "asd123@asd123.com" }
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
- id: '539f51a6-5d40-4ef2-85c4-f480f042f422',
87
+ _id: '539f51a6-5d40-4ef2-85c4-f480f042f422',
82
88
  email: "a456@asd567.com",
83
89
  username: "rolenotexist",
84
90
  role: "notexist"
@@ -0,0 +1,10 @@
1
+ import {PermissionService} from "../../../src/services/PermissionService.js"
2
+
3
+ const role = {
4
+ name: "Admin",
5
+ permissions: PermissionService.getPermissions(),
6
+ childRoles: [],
7
+ readonly: true
8
+ }
9
+
10
+ export default role
@@ -0,0 +1,13 @@
1
+
2
+ const user = {
3
+ active: true,
4
+ groups: [],
5
+ name: "Root",
6
+ username: "root",
7
+ password: "root.123",
8
+ email: "root@example.com",
9
+ phone: "123456789",
10
+ role: "Admin"
11
+ };
12
+
13
+ export default user
@@ -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}