@drax/identity-back 0.11.5 → 0.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/dist/controllers/RoleController.js +8 -39
  2. package/dist/controllers/TenantController.js +1 -28
  3. package/dist/controllers/UserApiKeyController.js +3 -3
  4. package/dist/controllers/UserController.js +48 -209
  5. package/dist/errors/BadCredentialsError.js +12 -0
  6. package/dist/factory/RoleServiceFactory.js +1 -0
  7. package/dist/factory/TenantServiceFactory.js +1 -0
  8. package/dist/factory/UserApiKeyServiceFactory.js +5 -4
  9. package/dist/factory/UserServiceFactory.js +1 -0
  10. package/dist/graphql/resolvers/role.resolvers.js +2 -2
  11. package/dist/graphql/resolvers/tenant.resolvers.js +2 -2
  12. package/dist/graphql/resolvers/user-api-key.resolvers.js +2 -2
  13. package/dist/graphql/resolvers/user.resolvers.js +1 -1
  14. package/dist/index.js +6 -0
  15. package/dist/middleware/apiKeyMiddleware.js +2 -2
  16. package/dist/models/RoleModel.js +10 -7
  17. package/dist/models/TenantModel.js +11 -8
  18. package/dist/models/UserApiKeyModel.js +10 -7
  19. package/dist/models/UserGroupModel.js +7 -7
  20. package/dist/models/UserModel.js +10 -8
  21. package/dist/rbac/Rbac.js +10 -8
  22. package/dist/repository/mongo/RoleMongoRepository.js +20 -65
  23. package/dist/repository/mongo/TenantMongoRepository.js +18 -66
  24. package/dist/repository/mongo/UserApiKeyMongoRepository.js +29 -47
  25. package/dist/repository/mongo/UserMongoRepository.js +56 -85
  26. package/dist/repository/sqlite/RoleSqliteRepository.js +30 -115
  27. package/dist/repository/sqlite/TenantSqliteRepository.js +15 -105
  28. package/dist/repository/sqlite/UserApiKeySqliteRepository.js +42 -117
  29. package/dist/repository/sqlite/UserSqliteRepository.js +49 -130
  30. package/dist/routes/RoleRoutes.js +35 -10
  31. package/dist/routes/TenantRoutes.js +18 -9
  32. package/dist/routes/UserApiKeyRoutes.js +20 -4
  33. package/dist/routes/UserRoutes.js +92 -17
  34. package/dist/schemas/LoginSchema.js +9 -0
  35. package/dist/schemas/PasswordSchema.js +12 -0
  36. package/dist/schemas/RegisterSchema.js +19 -0
  37. package/dist/schemas/RoleSchema.js +23 -0
  38. package/dist/schemas/TenantSchema.js +13 -0
  39. package/dist/schemas/UserApiKeySchema.js +14 -0
  40. package/dist/schemas/UserSchema.js +39 -0
  41. package/dist/services/PermissionService.js +5 -5
  42. package/dist/services/RoleService.js +6 -6
  43. package/dist/services/TenantService.js +6 -6
  44. package/dist/services/UserApiKeyService.js +5 -5
  45. package/dist/services/UserService.js +14 -14
  46. package/dist/setup/CreateOrUpdateRole.js +5 -2
  47. package/dist/setup/CreateUserIfNotExist.js +3 -1
  48. package/dist/setup/RecoveryUserPassword.js +1 -1
  49. package/dist/zod/EndpointZod.js +9 -0
  50. package/dist/zod/TenantSchema.js +12 -0
  51. package/dist/zod/TenantZod.js +5 -3
  52. package/dist/zod/UserApiKeyZod.js +7 -3
  53. package/package.json +10 -9
  54. package/src/controllers/RoleController.ts +8 -36
  55. package/src/controllers/TenantController.ts +2 -25
  56. package/src/controllers/UserApiKeyController.ts +3 -3
  57. package/src/controllers/UserController.ts +50 -183
  58. package/src/errors/BadCredentialsError.ts +18 -1
  59. package/src/factory/RoleServiceFactory.ts +1 -0
  60. package/src/factory/TenantServiceFactory.ts +1 -0
  61. package/src/factory/UserApiKeyServiceFactory.ts +5 -4
  62. package/src/factory/UserServiceFactory.ts +1 -0
  63. package/src/graphql/resolvers/role.resolvers.ts +3 -2
  64. package/src/graphql/resolvers/tenant.resolvers.ts +3 -2
  65. package/src/graphql/resolvers/user-api-key.resolvers.ts +3 -2
  66. package/src/graphql/resolvers/user.resolvers.ts +2 -1
  67. package/src/index.ts +16 -0
  68. package/src/interfaces/ITenantRepository.ts +2 -2
  69. package/src/interfaces/IUserApiKeyRepository.ts +2 -2
  70. package/src/interfaces/IUserRepository.ts +3 -2
  71. package/src/middleware/apiKeyMiddleware.ts +2 -2
  72. package/src/models/RoleModel.ts +12 -7
  73. package/src/models/TenantModel.ts +13 -8
  74. package/src/models/UserApiKeyModel.ts +12 -7
  75. package/src/models/UserGroupModel.ts +7 -7
  76. package/src/models/UserModel.ts +10 -8
  77. package/src/rbac/Rbac.ts +12 -9
  78. package/src/repository/mongo/RoleMongoRepository.ts +23 -94
  79. package/src/repository/mongo/TenantMongoRepository.ts +19 -98
  80. package/src/repository/mongo/UserApiKeyMongoRepository.ts +31 -56
  81. package/src/repository/mongo/UserMongoRepository.ts +71 -130
  82. package/src/repository/sqlite/RoleSqliteRepository.ts +37 -146
  83. package/src/repository/sqlite/TenantSqliteRepository.ts +16 -156
  84. package/src/repository/sqlite/UserApiKeySqliteRepository.ts +46 -151
  85. package/src/repository/sqlite/UserSqliteRepository.ts +59 -173
  86. package/src/routes/RoleRoutes.ts +35 -12
  87. package/src/routes/TenantRoutes.ts +25 -9
  88. package/src/routes/UserApiKeyRoutes.ts +23 -7
  89. package/src/routes/UserRoutes.ts +117 -34
  90. package/src/schemas/LoginSchema.ts +12 -0
  91. package/src/schemas/PasswordSchema.ts +16 -0
  92. package/src/{zod/UserZod.ts → schemas/RegisterSchema.ts} +7 -10
  93. package/src/schemas/RoleSchema.ts +29 -0
  94. package/src/schemas/TenantSchema.ts +22 -0
  95. package/src/{zod/UserApiKeyZod.ts → schemas/UserApiKeySchema.ts} +8 -3
  96. package/src/schemas/UserSchema.ts +57 -0
  97. package/src/services/PermissionService.ts +6 -5
  98. package/src/services/RoleService.ts +6 -6
  99. package/src/services/TenantService.ts +10 -10
  100. package/src/services/UserApiKeyService.ts +5 -5
  101. package/src/services/UserService.ts +15 -16
  102. package/src/setup/CreateOrUpdateRole.ts +7 -4
  103. package/src/setup/CreateUserIfNotExist.ts +5 -3
  104. package/src/setup/RecoveryUserPassword.ts +1 -1
  105. package/test/data-obj/apikey/root-mongo-user-apikey.ts +2 -1
  106. package/test/data-obj/roles/admin-sqlite-role.ts +2 -2
  107. package/test/data-obj/roles/operator-sqlite-role.ts +1 -1
  108. package/test/data-obj/tenants/company-sqlite-tenant.ts +6 -0
  109. package/test/data-obj/users/root-sqlite-user.ts +2 -2
  110. package/test/initializers/RoleSqliteInitializer.ts +1 -1
  111. package/test/repository/mongo/role-mongo-repository.test.ts +3 -3
  112. package/test/repository/mongo/user-apikey-mongo-repository.test.ts +5 -4
  113. package/test/repository/mongo/user-mongo-repository.test.ts +4 -4
  114. package/test/repository/sqlite/role-sqlite-repository.test.ts +21 -9
  115. package/test/repository/sqlite/tenant-sqlite-repository.test.ts +74 -0
  116. package/test/repository/sqlite/user-sqlite-repository.test.ts +15 -9
  117. package/test/routes/data/admin-role.ts +10 -0
  118. package/test/routes/data/root-user.ts +13 -0
  119. package/test/routes/helpers/CreateRootUserAndAdminRole.ts +17 -0
  120. package/test/routes/helpers/FastifyTestServerFactory.ts +34 -0
  121. package/test/routes/helpers/InitializePermissions.ts +23 -0
  122. package/test/routes/helpers/SetupIdentityDrax.ts +22 -0
  123. package/test/routes/tenant-route.test.ts +336 -0
  124. package/test/routes/user-route.test.ts +186 -0
  125. package/test/schemas/lab-schema.test.ts +110 -0
  126. package/test/service/mock-service.test.ts +3 -3
  127. package/test/service/role-service.test.ts +3 -3
  128. package/test/service/user-service.test.ts +16 -25
  129. package/test.db +0 -0
  130. package/tsconfig.tsbuildinfo +1 -1
  131. package/types/controllers/RoleController.d.ts +0 -1
  132. package/types/controllers/RoleController.d.ts.map +1 -1
  133. package/types/controllers/TenantController.d.ts +0 -1
  134. package/types/controllers/TenantController.d.ts.map +1 -1
  135. package/types/controllers/UserController.d.ts +11 -4
  136. package/types/controllers/UserController.d.ts.map +1 -1
  137. package/types/errors/BadCredentialsError.d.ts +9 -1
  138. package/types/errors/BadCredentialsError.d.ts.map +1 -1
  139. package/types/factory/RoleServiceFactory.d.ts.map +1 -1
  140. package/types/factory/TenantServiceFactory.d.ts.map +1 -1
  141. package/types/factory/UserApiKeyServiceFactory.d.ts.map +1 -1
  142. package/types/factory/UserServiceFactory.d.ts.map +1 -1
  143. package/types/graphql/resolvers/role.resolvers.d.ts +3 -9
  144. package/types/graphql/resolvers/role.resolvers.d.ts.map +1 -1
  145. package/types/graphql/resolvers/tenant.resolvers.d.ts +3 -9
  146. package/types/graphql/resolvers/tenant.resolvers.d.ts.map +1 -1
  147. package/types/graphql/resolvers/user-api-key.resolvers.d.ts +3 -9
  148. package/types/graphql/resolvers/user-api-key.resolvers.d.ts.map +1 -1
  149. package/types/graphql/resolvers/user.resolvers.d.ts +3 -9
  150. package/types/graphql/resolvers/user.resolvers.d.ts.map +1 -1
  151. package/types/index.d.ts +5 -1
  152. package/types/index.d.ts.map +1 -1
  153. package/types/interfaces/ITenantRepository.d.ts +2 -2
  154. package/types/interfaces/ITenantRepository.d.ts.map +1 -1
  155. package/types/interfaces/IUserApiKeyRepository.d.ts +2 -2
  156. package/types/interfaces/IUserApiKeyRepository.d.ts.map +1 -1
  157. package/types/interfaces/IUserRepository.d.ts +3 -2
  158. package/types/interfaces/IUserRepository.d.ts.map +1 -1
  159. package/types/models/RoleModel.d.ts +7 -7
  160. package/types/models/RoleModel.d.ts.map +1 -1
  161. package/types/models/TenantModel.d.ts +7 -7
  162. package/types/models/TenantModel.d.ts.map +1 -1
  163. package/types/models/UserApiKeyModel.d.ts +7 -7
  164. package/types/models/UserApiKeyModel.d.ts.map +1 -1
  165. package/types/models/UserGroupModel.d.ts +2 -2
  166. package/types/models/UserGroupModel.d.ts.map +1 -1
  167. package/types/models/UserModel.d.ts +7 -7
  168. package/types/models/UserModel.d.ts.map +1 -1
  169. package/types/rbac/Rbac.d.ts +1 -1
  170. package/types/rbac/Rbac.d.ts.map +1 -1
  171. package/types/repository/mongo/RoleMongoRepository.d.ts +9 -11
  172. package/types/repository/mongo/RoleMongoRepository.d.ts.map +1 -1
  173. package/types/repository/mongo/TenantMongoRepository.d.ts +8 -11
  174. package/types/repository/mongo/TenantMongoRepository.d.ts.map +1 -1
  175. package/types/repository/mongo/UserApiKeyMongoRepository.d.ts +12 -5
  176. package/types/repository/mongo/UserApiKeyMongoRepository.d.ts.map +1 -1
  177. package/types/repository/mongo/UserMongoRepository.d.ts +11 -12
  178. package/types/repository/mongo/UserMongoRepository.d.ts.map +1 -1
  179. package/types/repository/sqlite/RoleSqliteRepository.d.ts +14 -14
  180. package/types/repository/sqlite/RoleSqliteRepository.d.ts.map +1 -1
  181. package/types/repository/sqlite/TenantSqliteRepository.d.ts +12 -14
  182. package/types/repository/sqlite/TenantSqliteRepository.d.ts.map +1 -1
  183. package/types/repository/sqlite/UserApiKeySqliteRepository.d.ts +15 -11
  184. package/types/repository/sqlite/UserApiKeySqliteRepository.d.ts.map +1 -1
  185. package/types/repository/sqlite/UserSqliteRepository.d.ts +15 -12
  186. package/types/repository/sqlite/UserSqliteRepository.d.ts.map +1 -1
  187. package/types/routes/RoleRoutes.d.ts.map +1 -1
  188. package/types/routes/TenantRoutes.d.ts.map +1 -1
  189. package/types/routes/UserApiKeyRoutes.d.ts.map +1 -1
  190. package/types/routes/UserRoutes.d.ts.map +1 -1
  191. package/types/schemas/LoginSchema.d.ts +20 -0
  192. package/types/schemas/LoginSchema.d.ts.map +1 -0
  193. package/types/schemas/PasswordSchema.d.ts +27 -0
  194. package/types/schemas/PasswordSchema.d.ts.map +1 -0
  195. package/types/schemas/RegisterSchema.d.ts +32 -0
  196. package/types/schemas/RegisterSchema.d.ts.map +1 -0
  197. package/types/schemas/RoleSchema.d.ts +67 -0
  198. package/types/schemas/RoleSchema.d.ts.map +1 -0
  199. package/types/schemas/TenantSchema.d.ts +29 -0
  200. package/types/schemas/TenantSchema.d.ts.map +1 -0
  201. package/types/schemas/UserApiKeySchema.d.ts +39 -0
  202. package/types/schemas/UserApiKeySchema.d.ts.map +1 -0
  203. package/types/schemas/UserSchema.d.ts +161 -0
  204. package/types/schemas/UserSchema.d.ts.map +1 -0
  205. package/types/services/PermissionService.d.ts +1 -0
  206. package/types/services/PermissionService.d.ts.map +1 -1
  207. package/types/services/TenantService.d.ts +3 -3
  208. package/types/services/TenantService.d.ts.map +1 -1
  209. package/types/services/UserService.d.ts.map +1 -1
  210. package/types/setup/CreateOrUpdateRole.d.ts +2 -2
  211. package/types/setup/CreateOrUpdateRole.d.ts.map +1 -1
  212. package/types/setup/CreateUserIfNotExist.d.ts +2 -2
  213. package/types/setup/CreateUserIfNotExist.d.ts.map +1 -1
  214. package/types/zod/EndpointZod.d.ts +20 -0
  215. package/types/zod/EndpointZod.d.ts.map +1 -0
  216. package/types/zod/TenantSchema.d.ts +26 -0
  217. package/types/zod/TenantSchema.d.ts.map +1 -0
  218. package/types/zod/TenantZod.d.ts +13 -3
  219. package/types/zod/TenantZod.d.ts.map +1 -1
  220. package/types/zod/UserApiKeyZod.d.ts +23 -3
  221. package/types/zod/UserApiKeyZod.d.ts.map +1 -1
  222. package/types/zod/UserZod.d.ts +6 -6
  223. package/src/zod/RoleZod.ts +0 -14
  224. package/src/zod/TenantZod.ts +0 -14
@@ -5,10 +5,8 @@ import {
5
5
  CommonConfig,
6
6
  DraxConfig,
7
7
  StoreManager,
8
- UploadFileError,
9
8
  ValidationError,
10
9
  UnauthorizedError,
11
- SecuritySensitiveError
12
10
  } from "@drax/common-back";
13
11
 
14
12
  import UserServiceFactory from "../factory/UserServiceFactory.js";
@@ -19,6 +17,7 @@ import BadCredentialsError from "../errors/BadCredentialsError.js";
19
17
  import {join} from "path";
20
18
  import {IdentityConfig} from "../config/IdentityConfig.js";
21
19
  import UserEmailService from "../services/UserEmailService.js";
20
+ import {IDraxFieldFilter} from "@drax/crud-share";
22
21
 
23
22
  const BASE_FILE_DIR = DraxConfig.getOrLoad(CommonConfig.FileDir) || 'files';
24
23
  const AVATAR_DIR = DraxConfig.getOrLoad(IdentityConfig.AvatarDir) || 'avatar';
@@ -42,8 +41,8 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
42
41
  } catch (e) {
43
42
  console.error('/api/auth error', e)
44
43
  if (e instanceof BadCredentialsError) {
45
- reply.code(401)
46
- reply.send({error: e.message})
44
+ reply.code(e.statusCode)
45
+ reply.send(e.body)
47
46
  }
48
47
  reply.code(500)
49
48
  reply.send({error: 'error.server'})
@@ -54,7 +53,7 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
54
53
  try {
55
54
  if (request.authUser) {
56
55
  const userService = UserServiceFactory()
57
- let user = await userService.findById(request.authUser.id)
56
+ let user = await userService.findById(request.rbac.userId)
58
57
  user.password = undefined
59
58
  delete user.password
60
59
  return user
@@ -63,16 +62,7 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
63
62
 
64
63
  }
65
64
  } catch (e) {
66
- if (e instanceof UnauthorizedError) {
67
- reply.code(401)
68
- reply.send({error: "Unauthorized"})
69
- } else if (e instanceof UnauthorizedError) {
70
- reply.statusCode = e.statusCode
71
- reply.send({error: e.message})
72
- } else {
73
- reply.statusCode = 500
74
- reply.send({error: 'error.server'})
75
- }
65
+ this.handleError(e,reply)
76
66
  }
77
67
  }
78
68
 
@@ -85,7 +75,7 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
85
75
  const order = request.query.order
86
76
  const search = request.query.search
87
77
  const userService = UserServiceFactory()
88
- const filters = []
78
+ const filters: IDraxFieldFilter[] = this.parseFilters(request.query.filters)
89
79
  if (request.rbac.getAuthUser.tenantId) {
90
80
  filters.push({field: 'tenant', operator: 'eq', value: request.rbac.getAuthUser.tenantId})
91
81
  }
@@ -96,16 +86,7 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
96
86
  }
97
87
  return paginateResult
98
88
  } catch (e) {
99
- if (e instanceof ValidationError) {
100
- reply.statusCode = e.statusCode
101
- reply.send({error: e.message, inputErrors: e.errors})
102
- } else if (e instanceof UnauthorizedError) {
103
- reply.statusCode = e.statusCode
104
- reply.send({error: e.message})
105
- } else {
106
- reply.statusCode = 500
107
- reply.send({error: 'error.server'})
108
- }
89
+ this.handleError(e,reply)
109
90
  }
110
91
  }
111
92
 
@@ -121,17 +102,7 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
121
102
  let item = await this.service.search(search, 1000, filters)
122
103
  return item
123
104
  } catch (e) {
124
- console.error(e)
125
- if (e instanceof ValidationError) {
126
- reply.statusCode = e.statusCode
127
- reply.send({error: e.message, inputErrors: e.errors})
128
- } else if (e instanceof UnauthorizedError) {
129
- reply.statusCode = e.statusCode
130
- reply.send({error: e.message})
131
- } else {
132
- reply.statusCode = 500
133
- reply.send({error: 'INTERNAL_SERVER_ERROR'})
134
- }
105
+ this.handleError(e,reply)
135
106
  }
136
107
  }
137
108
 
@@ -158,28 +129,25 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
158
129
  payload.tenant = null
159
130
  }
160
131
 
161
- payload.role = role.id
132
+ payload.role = role._id.toString()
162
133
  payload.origin ??= 'Registry'
163
134
 
164
135
  const userService = UserServiceFactory()
165
136
  let user = await userService.register(payload)
166
137
 
167
- //SEND EMAIL FOR EMAIL VERIFICATION
168
- await UserEmailService.emailVerifyCode(user.emailCode, user.email)
138
+ if(user){
139
+ //SEND EMAIL FOR EMAIL VERIFICATION
140
+ await UserEmailService.emailVerifyCode(user.emailCode, user.email)
169
141
 
170
- return user
171
- } catch (e) {
172
- console.error(e)
173
- if (e instanceof ValidationError) {
174
- reply.statusCode = e.statusCode
175
- reply.send({error: e.message, inputErrors: e.errors})
176
- } else if (e instanceof UnauthorizedError) {
177
- reply.statusCode = e.statusCode
178
- reply.send({error: e.message})
179
- } else {
180
- reply.statusCode = 500
181
- reply.send({error: 'error.server'})
142
+ return {
143
+ success: true,
144
+ message: 'User registered successfully.'
145
+ }
182
146
  }
147
+
148
+
149
+ } catch (e) {
150
+ this.handleError(e,reply)
183
151
  }
184
152
  }
185
153
 
@@ -193,13 +161,7 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
193
161
  reply.header('Content-Type', 'text/html; charset=utf-8').send(html)
194
162
  }
195
163
  } catch (e) {
196
- console.error(e)
197
- if (e instanceof ValidationError) {
198
- reply.statusCode = e.statusCode
199
- reply.send({error: e.message, inputErrors: e.errors})
200
- }
201
- reply.code(500)
202
- reply.send({error: 'error.server'})
164
+ this.handleError(e,reply)
203
165
  }
204
166
  }
205
167
 
@@ -209,13 +171,7 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
209
171
  const userService = UserServiceFactory()
210
172
  return await userService.verifyPhone(phoneCode)
211
173
  } catch (e) {
212
- console.error(e)
213
- if (e instanceof ValidationError) {
214
- reply.statusCode = e.statusCode
215
- reply.send({error: e.message, inputErrors: e.errors})
216
- }
217
- reply.code(500)
218
- reply.send({error: 'error.server'})
174
+ this.handleError(e,reply)
219
175
  }
220
176
  }
221
177
 
@@ -224,13 +180,7 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
224
180
  request.rbac.assertPermission(UserPermissions.Create)
225
181
  const payload = request.body
226
182
 
227
- const roleService = RoleServiceFactory()
228
- const role = await roleService.findById(payload.role)
229
- if (!role) {
230
- throw new ValidationError([{field: 'role', reason: 'Role not found'}])
231
- } else if (role.name === 'Admin') {
232
- payload.tenant = null
233
- } else if (request.rbac.getAuthUser.tenantId) {
183
+ if (request.rbac.getAuthUser.tenantId) {
234
184
  payload.tenant = request.rbac.getAuthUser.tenantId
235
185
  }
236
186
 
@@ -240,17 +190,7 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
240
190
  let user = await userService.create(payload)
241
191
  return user
242
192
  } catch (e) {
243
- console.error(e)
244
- if (e instanceof ValidationError) {
245
- reply.statusCode = e.statusCode
246
- reply.send({error: e.message, inputErrors: e.errors})
247
- } else if (e instanceof UnauthorizedError) {
248
- reply.statusCode = e.statusCode
249
- reply.send({error: e.message})
250
- } else {
251
- reply.statusCode = 500
252
- reply.send({error: 'error.server'})
253
- }
193
+ this.handleError(e,reply)
254
194
  }
255
195
  }
256
196
 
@@ -260,14 +200,7 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
260
200
  const id = request.params.id
261
201
  const payload = request.body
262
202
 
263
-
264
- const roleService = RoleServiceFactory()
265
- const role = await roleService.findById(payload.role)
266
- if (!role) {
267
- throw new ValidationError([{field: 'role', reason: 'Role not found'}])
268
- } else if (role.name === 'Admin') {
269
- payload.tenant = null
270
- } else if (request.rbac.getAuthUser.tenantId) {
203
+ if (request.rbac.getAuthUser.tenantId) {
271
204
  payload.tenant = request.rbac.getAuthUser.tenantId
272
205
  }
273
206
 
@@ -275,21 +208,7 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
275
208
  let user = await userService.update(id, payload)
276
209
  return user
277
210
  } catch (e) {
278
- console.error(e)
279
- if (e instanceof ValidationError) {
280
- reply.statusCode = e.statusCode
281
- reply.send({error: e.message, inputErrors: e.errors})
282
- }
283
- if (e instanceof UnauthorizedError) {
284
- reply.statusCode = e.statusCode
285
- reply.send({error: e.message})
286
- } else if (e instanceof UnauthorizedError) {
287
- reply.statusCode = e.statusCode
288
- reply.send({error: e.message})
289
- } else {
290
- reply.statusCode = 500
291
- reply.send({error: 'error.server'})
292
- }
211
+ this.handleError(e,reply)
293
212
  }
294
213
  }
295
214
 
@@ -300,22 +219,22 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
300
219
  const userService = UserServiceFactory()
301
220
  let r: boolean = await userService.delete(id)
302
221
  if (r) {
303
- reply.send({message: 'Deleted successfully'})
222
+ reply.send({
223
+ id: id,
224
+ message: 'Item deleted successfully',
225
+ deleted: true,
226
+ deletedAt: new Date(),
227
+ })
304
228
  } else {
305
- reply.statusCode(400).send({message: 'Not deleted'})
229
+ reply.send({
230
+ id: id,
231
+ message: 'Item not deleted',
232
+ deleted: false,
233
+ deletedAt: new Date(),
234
+ })
306
235
  }
307
236
  } catch (e) {
308
- console.error(e)
309
- if (e instanceof ValidationError) {
310
- reply.statusCode = e.statusCode
311
- reply.send({error: e.message, inputErrors: e.errors})
312
- } else if (e instanceof UnauthorizedError) {
313
- reply.statusCode = e.statusCode
314
- reply.send({error: e.message})
315
- } else {
316
- reply.statusCode = 500
317
- reply.send({error: 'error.server'})
318
- }
237
+ this.handleError(e,reply)
319
238
  }
320
239
  }
321
240
 
@@ -341,17 +260,7 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
341
260
  reply.send({message})
342
261
 
343
262
  } catch (e) {
344
- console.error('recoveryPassword error', e)
345
- if (e instanceof ValidationError) {
346
- reply.statusCode = e.statusCode
347
- reply.send({error: e.message, inputErrors: e.errors})
348
- }else if (e instanceof SecuritySensitiveError) {
349
- reply.statusCode = e.statusCode
350
- reply.send({message})
351
- } else {
352
- reply.statusCode = 500
353
- reply.send({error: 'error.server'})
354
- }
263
+ this.handleError(e,reply)
355
264
  }
356
265
  }
357
266
 
@@ -379,14 +288,7 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
379
288
  }
380
289
 
381
290
  } catch (e) {
382
- console.error('recoveryPassword error', e)
383
- if (e instanceof ValidationError) {
384
- reply.statusCode = e.statusCode
385
- reply.send({error: e.message, inputErrors: e.errors})
386
- } else {
387
- reply.statusCode = 500
388
- reply.send({error: 'error.server'})
389
- }
291
+ this.handleError(e,reply)
390
292
  }
391
293
  }
392
294
 
@@ -400,19 +302,10 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
400
302
  const currentPassword = request.body.currentPassword
401
303
  const newPassword = request.body.newPassword
402
304
  const userService = UserServiceFactory()
403
- return await userService.changeOwnPassword(userId, currentPassword, newPassword)
305
+ await userService.changeOwnPassword(userId, currentPassword, newPassword)
306
+ return {message: 'Password updated successfully'}
404
307
  } catch (e) {
405
- console.error('changeMyPassword error', e)
406
- if (e instanceof ValidationError) {
407
- reply.statusCode = e.statusCode
408
- reply.send({error: e.message, inputErrors: e.errors})
409
- } else if (e instanceof UnauthorizedError) {
410
- reply.statusCode = e.statusCode
411
- reply.send({error: e.message})
412
- } else {
413
- reply.statusCode = 500
414
- reply.send({error: 'error.server'})
415
- }
308
+ this.handleError(e,reply)
416
309
  }
417
310
  }
418
311
 
@@ -425,19 +318,10 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
425
318
  }
426
319
  const newPassword = request.body.newPassword
427
320
  const userService = UserServiceFactory()
428
- return await userService.changeUserPassword(userId, newPassword)
321
+ await userService.changeUserPassword(userId, newPassword)
322
+ return {message: 'Password updated successfully'}
429
323
  } catch (e) {
430
- console.error('/api/password error', e)
431
- if (e instanceof ValidationError) {
432
- reply.statusCode = e.statusCode
433
- reply.send({error: e.message, inputErrors: e.errors})
434
- } else if (e instanceof UnauthorizedError) {
435
- reply.statusCode = e.statusCode
436
- reply.send({error: e.message})
437
- } else {
438
- reply.statusCode = 500
439
- reply.send({error: 'error.server'})
440
- }
324
+ this.handleError(e,reply)
441
325
  }
442
326
  }
443
327
 
@@ -445,7 +329,7 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
445
329
  async updateAvatar(request, reply) {
446
330
  try {
447
331
  request.rbac.assertAuthenticated()
448
- const userId = request.rbac.getAuthUser.id
332
+ const userId = request.rbac.userId
449
333
 
450
334
  const data = await request.file()
451
335
 
@@ -470,17 +354,7 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
470
354
  url: urlFile,
471
355
  }
472
356
  } catch (e) {
473
- console.error(e)
474
- if (e instanceof UploadFileError) {
475
- reply.statusCode = e.statusCode
476
- reply.send({error: e.message})
477
- } else if (e instanceof UnauthorizedError) {
478
- reply.statusCode = e.statusCode
479
- reply.send({error: e.message})
480
- } else {
481
- reply.statusCode = 500
482
- reply.send({error: 'INTERNAL_SERVER_ERROR'})
483
- }
357
+ this.handleError(e,reply)
484
358
  }
485
359
 
486
360
  }
@@ -493,14 +367,7 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
493
367
  //console.log("FILE_DIR: ",fileDir, " FILENAME:", filename)
494
368
  return reply.sendFile(filename, fileDir)
495
369
  } catch (e) {
496
- console.error(e)
497
- if (e instanceof UnauthorizedError) {
498
- reply.statusCode = e.statusCode
499
- reply.send({error: e.message})
500
- } else {
501
- reply.statusCode = 500
502
- reply.send({error: 'INTERNAL_SERVER_ERROR'})
503
- }
370
+ this.handleError(e,reply)
504
371
  }
505
372
 
506
373
  }
@@ -1,13 +1,30 @@
1
- class BadCredentialsError extends Error {
1
+ import type {IError} from "@drax/common-back";
2
+
3
+ class BadCredentialsError extends Error implements IError{
2
4
  constructor() {
3
5
  super('error.badCredentials')
4
6
  this.name = 'BadCredentialsError';
7
+ this.message = 'error.badCredentials'
5
8
  }
6
9
 
7
10
  get statusCode(){
8
11
  return 401
9
12
  }
10
13
 
14
+
15
+ get i18nMessage(){
16
+ return 'error.badCredentials'
17
+ }
18
+
19
+ get body(){
20
+ return {
21
+ statusCode: this.statusCode,
22
+ error: this.name,
23
+ message: this.message,
24
+ i18nMessage: this.i18nMessage,
25
+ }
26
+ }
27
+
11
28
  }
12
29
 
13
30
  export default BadCredentialsError
@@ -18,6 +18,7 @@ const RoleServiceFactory = (verbose: boolean = false): RoleService => {
18
18
  case COMMON.DB_ENGINES.SQLITE:
19
19
  const dbFile = DraxConfig.getOrLoad(CommonConfig.SqliteDbFile)
20
20
  roleRepository = new RoleSqliteRepository(dbFile, verbose)
21
+ roleRepository.build()
21
22
  break;
22
23
  default:
23
24
  throw new Error("DraxConfig.DB_ENGINE must be one of " + Object.values(COMMON.DB_ENGINES).join(", "));
@@ -18,6 +18,7 @@ const TenantServiceFactory = (verbose: boolean = false): TenantService => {
18
18
  case COMMON.DB_ENGINES.SQLITE:
19
19
  const dbFile = DraxConfig.getOrLoad(CommonConfig.SqliteDbFile)
20
20
  tenantRepository = new TenantSqliteRepository(dbFile, verbose)
21
+ tenantRepository.build()
21
22
  break;
22
23
  default:
23
24
  throw new Error("DraxConfig.DB_ENGINE must be one of " + Object.values(COMMON.DB_ENGINES).join(", "));
@@ -8,20 +8,21 @@ let userService: UserApiKeyService
8
8
 
9
9
  const UserApiKeyServiceFactory = (verbose: boolean = false): UserApiKeyService => {
10
10
  if (!userService) {
11
- let userRepository: IUserApiKeyRepository
11
+ let userApiKeyRepository: IUserApiKeyRepository
12
12
  switch (DraxConfig.getOrLoad(CommonConfig.DbEngine)) {
13
13
  case COMMON.DB_ENGINES.MONGODB:
14
- userRepository = new UserApiKeyMongoRepository()
14
+ userApiKeyRepository = new UserApiKeyMongoRepository()
15
15
  break;
16
16
  case COMMON.DB_ENGINES.SQLITE:
17
17
  const dbFile = DraxConfig.getOrLoad(CommonConfig.SqliteDbFile)
18
- userRepository = new UserApiKeySqliteRepository(dbFile, verbose)
18
+ userApiKeyRepository = new UserApiKeySqliteRepository(dbFile, verbose)
19
+ userApiKeyRepository.build()
19
20
  break;
20
21
  default:
21
22
  throw new Error("DraxConfig.DB_ENGINE must be one of " + Object.values(COMMON.DB_ENGINES).join(", "));
22
23
  }
23
24
 
24
- userService = new UserApiKeyService(userRepository)
25
+ userService = new UserApiKeyService(userApiKeyRepository)
25
26
  }
26
27
 
27
28
  return userService
@@ -16,6 +16,7 @@ const UserServiceFactory = (verbose:boolean = false) : UserService => {
16
16
  case COMMON.DB_ENGINES.SQLITE:
17
17
  const dbFile = DraxConfig.getOrLoad(CommonConfig.SqliteDbFile)
18
18
  userRepository = new UserSqliteRepository(dbFile,verbose)
19
+ userRepository.build()
19
20
  break;
20
21
  default:
21
22
  throw new Error("DraxConfig.DB_ENGINE must be one of " + Object.values(COMMON.DB_ENGINES).join(", "));
@@ -3,6 +3,7 @@ import {IdentityPermissions} from "../../permissions/IdentityPermissions.js";
3
3
  import {ValidationError, ValidationErrorToGraphQLError, UnauthorizedError} from "@drax/common-back";
4
4
  import {GraphQLError} from "graphql";
5
5
  import {PermissionService} from "../../services/PermissionService.js";
6
+ import {IDraxPaginateOptions} from "@drax/crud-share";
6
7
 
7
8
 
8
9
  export default {
@@ -37,7 +38,7 @@ export default {
37
38
  const roleService = RoleServiceFactory()
38
39
  const roles = await roleService.fetchAll()
39
40
  if(rbac.getRole?.childRoles?.length > 0) {
40
- return roles.filter(role => rbac.getRole.childRoles.some(childRole => childRole.id === role.id));
41
+ return roles.filter(role => rbac.getRole.childRoles.some(childRole => childRole._id === role._id));
41
42
  }else{
42
43
  return roles
43
44
  }
@@ -61,7 +62,7 @@ export default {
61
62
  throw new GraphQLError('error.server')
62
63
  }
63
64
  },
64
- paginateRole: async (_, {options= {page:1, limit:5, orderBy:"", order:false, search:"", filters: []} }, {rbac}) => {
65
+ paginateRole: async (_, {options= {page:1, limit:5, orderBy:"", order:"asc", search:"", filters: []} as IDraxPaginateOptions }, {rbac}) => {
65
66
  try {
66
67
  rbac.assertPermission(IdentityPermissions.ViewRole)
67
68
  const roleService = RoleServiceFactory()
@@ -2,6 +2,7 @@ import TenantServiceFactory from "../../factory/TenantServiceFactory.js";
2
2
  import {IdentityPermissions} from "../../permissions/IdentityPermissions.js";
3
3
  import {ValidationError, ValidationErrorToGraphQLError, UnauthorizedError} from "@drax/common-back";
4
4
  import {GraphQLError} from "graphql";
5
+ import {IDraxPaginateOptions} from "@drax/crud-share";
5
6
 
6
7
 
7
8
  export default {
@@ -36,7 +37,7 @@ export default {
36
37
  const tenantService = TenantServiceFactory()
37
38
  const tenants = await tenantService.fetchAll()
38
39
  if(rbac.getAuthUser.tenantId){
39
- return tenants.filter(t => t.id === rbac.getAuthUser.tenantId)
40
+ return tenants.filter(t => t._id === rbac.getAuthUser.tenantId)
40
41
  }else{
41
42
  return tenants
42
43
  }
@@ -48,7 +49,7 @@ export default {
48
49
  throw new GraphQLError('error.server')
49
50
  }
50
51
  },
51
- paginateTenant: async (_, {options= {page:1, limit:5, orderBy:"", order:false, search:"", filters: []} }, {rbac}) => {
52
+ paginateTenant: async (_, {options= {page:1, limit:5, orderBy:"", order:"asc", search:"", filters: []} as IDraxPaginateOptions }, {rbac}) => {
52
53
  try {
53
54
  rbac.assertPermission(IdentityPermissions.ViewTenant)
54
55
  const tenantService = TenantServiceFactory()
@@ -3,11 +3,12 @@ import {IdentityPermissions} from "../../permissions/IdentityPermissions.js";
3
3
  import {ValidationError, ValidationErrorToGraphQLError, UnauthorizedError} from "@drax/common-back";
4
4
  import {GraphQLError} from "graphql";
5
5
  import * as crypto from "node:crypto";
6
+ import {IDraxPaginateOptions} from "@drax/crud-share";
6
7
 
7
8
 
8
9
  export default {
9
10
  Query: {
10
- paginateUserApiKey: async (_, {options= {page:1, limit:5, orderBy:"", order:false, search:"", filters: []} }, {rbac, authUser}) => {
11
+ paginateUserApiKey: async (_, {options= {page:1, limit:5, orderBy:"", order:"asc", search:"", filters: []} as IDraxPaginateOptions }, {rbac, authUser}) => {
11
12
  try {
12
13
  rbac.assertAuthenticated()
13
14
 
@@ -22,7 +23,7 @@ export default {
22
23
  }
23
24
 
24
25
  if(!rbac.hasPermission(IdentityPermissions.ViewUserApiKey)){
25
- options.filters.push({field: "user", operator: "eq", value: rbac.authUser.id})
26
+ options.filters.push({field: "user", operator: "eq", value: rbac.userId})
26
27
  }
27
28
 
28
29
  const userApiKeyService = UserApiKeyServiceFactory()
@@ -12,6 +12,7 @@ import {UnauthorizedError} from "@drax/common-back";
12
12
  import BadCredentialsError from "../../errors/BadCredentialsError.js";
13
13
  import {join} from "path";
14
14
  import IdentityConfig from "../../config/IdentityConfig.js";
15
+ import {IDraxPaginateOptions} from "@drax/crud-share";
15
16
 
16
17
  export default {
17
18
  Query: {
@@ -45,7 +46,7 @@ export default {
45
46
  }
46
47
 
47
48
  },
48
- paginateUser: async (_, { options= {page:1, limit:5, orderBy:"", order:false, search:"", filters: []} }, {rbac}) => {
49
+ paginateUser: async (_, { options= {page:1, limit:5, orderBy:"", order:"asc", search:"", filters: []} as IDraxPaginateOptions }, {rbac}) => {
49
50
  try {
50
51
  rbac.assertPermission(IdentityPermissions.ViewUser)
51
52
  let userService = UserServiceFactory()
package/src/index.ts CHANGED
@@ -42,6 +42,11 @@ import {TenantPermissions} from "./permissions/TenantPermissions.js";
42
42
  import {UserPermissions} from "./permissions/UserPermissions.js";
43
43
  import {UserApiKeyPermissions} from "./permissions/UserApiKeyPermissions.js";
44
44
 
45
+ import {UserSchema, UserBaseSchema} from "./schemas/UserSchema.js";
46
+ import {TenantSchema,TenantBaseSchema} from "./schemas/TenantSchema.js";
47
+ import {RoleSchema, RoleBaseSchema} from "./schemas/RoleSchema.js";
48
+ import {UserApiKeySchema, UserApiKeyBaseSchema} from "./schemas/UserApiKeySchema.js";
49
+
45
50
 
46
51
  const graphqlMergeResult = await GraphqlMerge()
47
52
  const identityTypeDefs = await graphqlMergeResult.typeDefs;
@@ -56,6 +61,17 @@ export type {
56
61
  }
57
62
 
58
63
  export {
64
+
65
+ //Schemas
66
+ UserSchema,
67
+ UserBaseSchema,
68
+ TenantSchema,
69
+ TenantBaseSchema,
70
+ RoleSchema,
71
+ RoleBaseSchema,
72
+ UserApiKeyBaseSchema,
73
+ UserApiKeySchema,
74
+
59
75
  //Service
60
76
  UserService,
61
77
  RoleService,
@@ -1,6 +1,6 @@
1
1
  import {ITenant, ITenantBase} from '@drax/identity-share'
2
- import {IDraxCrud} from "@drax/crud-share";
3
- interface ITenantRepository extends IDraxCrud<ITenant,ITenantBase,ITenantBase>{
2
+ import {IDraxCrudRepository} from "@drax/crud-share";
3
+ interface ITenantRepository extends IDraxCrudRepository<ITenant,ITenantBase,ITenantBase>{
4
4
  findById(id: string): Promise<ITenant | null>;
5
5
  findByName(name: string): Promise<ITenant | null>;
6
6
  fetchAll(): Promise<ITenant[]>;
@@ -1,7 +1,7 @@
1
1
  import {IUserApiKey, IUserApiKeyBase} from '@drax/identity-share'
2
- import {IDraxCrud} from "@drax/crud-share";
2
+ import {IDraxCrudRepository} from "@drax/crud-share";
3
3
 
4
- interface IUserApiKeyRepository extends IDraxCrud<IUserApiKey, IUserApiKeyBase, IUserApiKeyBase>{
4
+ interface IUserApiKeyRepository extends IDraxCrudRepository<IUserApiKey, IUserApiKeyBase, IUserApiKeyBase>{
5
5
  findBySecret(username: string): Promise<IUserApiKey | null>;
6
6
  }
7
7
 
@@ -1,10 +1,11 @@
1
1
  import {IUser, IUserCreate, IUserUpdate} from '@drax/identity-share'
2
- import {IDraxCrud, IDraxFieldFilter} from "@drax/crud-share";
2
+ import {IDraxCrudRepository} from "@drax/crud-share";
3
3
 
4
- interface IUserRepository extends IDraxCrud<IUser, IUserCreate, IUserUpdate>{
4
+ interface IUserRepository extends IDraxCrudRepository<IUser, IUserCreate, IUserUpdate>{
5
5
  findById(id: string): Promise<IUser | null>;
6
6
  findByUsername(username: string): Promise<IUser | null>;
7
7
  findByUsernameWithPassword(username: string): Promise<IUser | null>;
8
+ findByIdWithPassword(id: string): Promise<IUser | null>;
8
9
  findByEmail(email: string): Promise<IUser | null>;
9
10
  changePassword(id: string, password:string):Promise<Boolean>;
10
11
  changeAvatar(id: string, avatarUrl: string): Promise<Boolean>;
@@ -30,8 +30,8 @@ async function apiKeyMiddleware (request, reply) {
30
30
  const userApiKey = await draxCache.getOrLoad(apiKey, userApiKeyLoader)
31
31
  if(userApiKey && userApiKey.user){
32
32
  request.authUser = userApiKey.user
33
- request.authUser.roleId = userApiKey.user.role.id
34
- request.authUser.tenantId = userApiKey.user?.tenant?.id
33
+ request.authUser.roleId = userApiKey.user.role._id
34
+ request.authUser.tenantId = userApiKey.user?.tenant?._id
35
35
  }
36
36
  }
37
37
  return