@ackplus/nest-auth 0.1.50 → 1.1.0

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 (505) hide show
  1. package/README.md +6 -513
  2. package/eslint.config.mjs +59 -0
  3. package/jest.config.ts +10 -0
  4. package/package.json +14 -44
  5. package/project.json +86 -0
  6. package/src/index.ts +30 -0
  7. package/src/lib/admin-console/admin-console.module.ts +62 -0
  8. package/src/lib/admin-console/controllers/admin-auth.controller.ts +339 -0
  9. package/src/lib/admin-console/controllers/admin-console.controller.ts +82 -0
  10. package/src/lib/admin-console/controllers/admin-permissions.controller.ts +180 -0
  11. package/src/lib/admin-console/controllers/admin-roles.controller.ts +89 -0
  12. package/src/lib/admin-console/controllers/admin-tenants.controller.ts +68 -0
  13. package/src/lib/admin-console/controllers/admin-users.controller.ts +379 -0
  14. package/src/lib/admin-console/decorators/current-admin.decorator.ts +9 -0
  15. package/src/lib/admin-console/dto/admin-permission.dto.ts +106 -0
  16. package/src/lib/admin-console/dto/admin-role.dto.ts +45 -0
  17. package/src/lib/admin-console/dto/admin-tenant.dto.ts +43 -0
  18. package/src/lib/admin-console/dto/admin-user.dto.ts +87 -0
  19. package/src/lib/admin-console/dto/create-dashboard-admin.dto.ts +34 -0
  20. package/src/lib/admin-console/dto/login.dto.ts +10 -0
  21. package/src/lib/admin-console/dto/reset-password.dto.ts +21 -0
  22. package/src/lib/admin-console/dto/setup-admin.dto.ts +23 -0
  23. package/src/lib/admin-console/dto/signup.dto.ts +51 -0
  24. package/src/lib/admin-console/entities/admin-user.entity.ts +74 -0
  25. package/src/lib/admin-console/guards/admin-session.guard.ts +47 -0
  26. package/src/lib/admin-console/services/admin-auth.service.ts +82 -0
  27. package/src/lib/admin-console/services/admin-console-config.service.ts +62 -0
  28. package/src/lib/admin-console/services/admin-session.service.ts +106 -0
  29. package/src/lib/admin-console/services/admin-user.service.ts +96 -0
  30. package/src/lib/admin-console/static/index.html +771 -0
  31. package/src/lib/auth/auth.module.ts +58 -0
  32. package/src/lib/auth/controllers/auth.controller.ts +393 -0
  33. package/src/lib/auth/controllers/mfa.controller.ts +200 -0
  34. package/src/lib/auth/dto/credentials/email-credentials.dto.ts +24 -0
  35. package/src/lib/auth/dto/credentials/phone-credentials.dto.ts +24 -0
  36. package/src/lib/auth/dto/credentials/social-credentials.dto.ts +15 -0
  37. package/src/lib/auth/dto/index.ts +1 -0
  38. package/src/lib/auth/dto/requests/change-password.request.dto.ts +34 -0
  39. package/src/lib/auth/dto/requests/forgot-password.request.dto.ts +30 -0
  40. package/src/lib/auth/dto/requests/initialize-admin.request.dto.ts +51 -0
  41. package/src/lib/auth/dto/requests/login.request.dto.ts +65 -0
  42. package/src/lib/auth/dto/requests/refresh-token.request.dto.ts +12 -0
  43. package/src/lib/auth/dto/requests/reset-password-with-token.request.dto.ts +22 -0
  44. package/src/lib/auth/dto/requests/reset-password.request.dto.ts +50 -0
  45. package/src/lib/auth/dto/requests/send-email-verification.request.dto.ts +12 -0
  46. package/src/lib/auth/dto/requests/send-mfa-code.request.dto.ts +19 -0
  47. package/src/lib/auth/dto/requests/signup.request.dto.ts +42 -0
  48. package/src/lib/auth/dto/requests/toggle-mfa.request.dto.ts +12 -0
  49. package/src/lib/auth/dto/requests/verify-2fa.request.dto.ts +24 -0
  50. package/src/lib/auth/dto/requests/verify-email.request.dto.ts +22 -0
  51. package/src/lib/auth/dto/requests/verify-forgot-password-otp-request-dto.ts +41 -0
  52. package/src/lib/auth/dto/requests/verify-totp-setup.request.dto.ts +22 -0
  53. package/src/lib/auth/dto/responses/auth-cookie.response.dto.ts +58 -0
  54. package/src/lib/auth/dto/responses/auth-success.response.dto.ts +58 -0
  55. package/src/lib/auth/dto/responses/auth.response.dto.ts +99 -0
  56. package/src/lib/auth/dto/responses/client-config.response.dto.ts +153 -0
  57. package/src/lib/auth/dto/responses/initialize-admin.response.dto.ts +22 -0
  58. package/src/lib/auth/dto/responses/mfa-code-response.dto.ts +27 -0
  59. package/src/lib/auth/dto/responses/mfa-status.response.dto.ts +89 -0
  60. package/src/lib/auth/dto/responses/verify-otp.response.dto.ts +9 -0
  61. package/src/lib/auth/entities/mfa-secret.entity.ts +33 -0
  62. package/src/lib/auth/entities/otp.entity.ts +33 -0
  63. package/src/lib/auth/events/{logged-out-all.event.d.ts → logged-out-all.event.ts} +6 -3
  64. package/src/lib/auth/events/{logged-out.event.d.ts → logged-out.event.ts} +5 -3
  65. package/src/lib/auth/events/{password-reset-requested.event.d.ts → password-reset-requested.event.ts} +6 -3
  66. package/src/lib/auth/events/{password-reset.event.d.ts → password-reset.event.ts} +6 -3
  67. package/src/lib/auth/events/{user-2fa-verified.event.d.ts → user-2fa-verified.event.ts} +6 -3
  68. package/src/lib/auth/events/{user-logged-in.event.d.ts → user-logged-in.event.ts} +7 -3
  69. package/src/lib/auth/events/{user-refresh-token.event.d.ts → user-refresh-token.event.ts} +6 -3
  70. package/src/lib/auth/events/{user-registered.event.d.ts → user-registered.event.ts} +7 -3
  71. package/src/lib/auth/guards/auth.guard.ts +386 -0
  72. package/src/lib/auth/{index.d.ts → index.ts} +28 -1
  73. package/src/lib/auth/interceptors/refresh-token.interceptor.ts +117 -0
  74. package/src/lib/auth/services/auth.service.ts +947 -0
  75. package/src/lib/auth/services/client-config.service.ts +157 -0
  76. package/src/lib/auth/services/cookie.service.ts +43 -0
  77. package/src/lib/auth/services/mfa.service.ts +391 -0
  78. package/src/lib/auth.constants.ts +63 -0
  79. package/src/lib/core/core.module.ts +50 -0
  80. package/src/lib/core/decorators/auth.decorator.ts +38 -0
  81. package/src/lib/core/decorators/permissions.decorator.ts +17 -0
  82. package/src/lib/core/decorators/public.decorator.ts +33 -0
  83. package/src/lib/core/decorators/role.decorator.ts +12 -0
  84. package/src/lib/core/decorators/skip-mfa.decorator.ts +4 -0
  85. package/src/lib/core/dto/message.response.dto.ts +6 -0
  86. package/src/lib/core/{entities.d.ts → entities.ts} +18 -1
  87. package/src/lib/core/{index.d.ts → index.ts} +17 -0
  88. package/src/lib/core/interfaces/auth-module-options.interface.ts +211 -0
  89. package/src/lib/core/interfaces/mfa-options.interface.ts +46 -0
  90. package/src/lib/core/interfaces/otp.interface.ts +6 -0
  91. package/src/lib/core/interfaces/session-options.interface.ts +19 -0
  92. package/src/lib/core/interfaces/{token-payload.interface.d.ts → token-payload.interface.ts} +4 -1
  93. package/src/lib/core/providers/apple-auth.provider.ts +61 -0
  94. package/src/lib/core/providers/base-auth.provider.ts +74 -0
  95. package/src/lib/core/providers/email-auth.provider.ts +71 -0
  96. package/src/lib/core/providers/facebook-auth.provider.ts +55 -0
  97. package/src/lib/core/providers/github-auth.provider.ts +79 -0
  98. package/src/lib/core/providers/google-auth.provider.ts +61 -0
  99. package/src/lib/core/providers/jwt-auth.provider.ts +50 -0
  100. package/src/lib/core/providers/phone-auth.provider.ts +45 -0
  101. package/src/lib/core/services/auth-config.service.ts +184 -0
  102. package/src/lib/core/services/auth-provider-registry.service.ts +93 -0
  103. package/src/lib/core/services/{debug-logger.service.js → debug-logger.service.ts} +92 -59
  104. package/src/lib/core/services/initialization.service.ts +29 -0
  105. package/src/lib/core/services/jwt.service.ts +137 -0
  106. package/src/lib/nest-auth.module.ts +152 -0
  107. package/src/lib/permission/entities/permission.entity.ts +56 -0
  108. package/src/lib/permission/index.ts +4 -0
  109. package/src/lib/permission/permission.module.ts +14 -0
  110. package/src/lib/permission/services/permission.service.ts +233 -0
  111. package/src/lib/request-context/index.ts +2 -0
  112. package/src/lib/request-context/request-context.middleware.ts +13 -0
  113. package/src/lib/request-context/{request-context.js → request-context.ts} +51 -27
  114. package/src/lib/role/entities/role.entity.ts +103 -0
  115. package/src/lib/role/{index.d.ts → index.ts} +2 -0
  116. package/src/lib/role/role.module.ts +15 -0
  117. package/src/lib/role/services/{role.service.js → role.service.ts} +117 -52
  118. package/src/lib/session/entities/session.entity.ts +54 -0
  119. package/src/lib/session/index.ts +20 -0
  120. package/src/lib/session/interfaces/session-repository.interface.ts +58 -0
  121. package/src/lib/session/repositories/base-session.repository.ts +74 -0
  122. package/src/lib/session/repositories/memory-session.repository.ts +153 -0
  123. package/src/lib/session/repositories/redis-session.repository.ts +171 -0
  124. package/src/lib/session/repositories/typeorm-session.repository.ts +86 -0
  125. package/src/lib/session/services/session-manager.service.ts +261 -0
  126. package/src/lib/session/session.module.ts +102 -0
  127. package/src/lib/session/utils/session.util.ts +166 -0
  128. package/src/lib/tenant/entities/tenant.entity.ts +40 -0
  129. package/src/lib/tenant/events/tenant-created.event.ts +9 -0
  130. package/src/lib/tenant/events/tenant-deleted.event.ts +11 -0
  131. package/src/lib/tenant/events/{tenant-updated.event.d.ts → tenant-updated.event.ts} +6 -3
  132. package/src/lib/tenant/index.ts +9 -0
  133. package/src/lib/tenant/services/tenant.service.ts +336 -0
  134. package/src/lib/tenant/tenant.module.ts +19 -0
  135. package/src/lib/types/express.d.ts +14 -0
  136. package/src/lib/user/dto/requests/update-user.dto.ts +15 -0
  137. package/src/lib/user/entities/access-key.entity.ts +53 -0
  138. package/src/lib/user/entities/identity.entity.ts +31 -0
  139. package/src/lib/user/entities/user.entity.ts +212 -0
  140. package/src/lib/user/events/{user-created.event.d.ts → user-created.event.ts} +4 -3
  141. package/src/lib/user/events/{user-deleted.event.d.ts → user-deleted.event.ts} +6 -3
  142. package/src/lib/user/events/{user-updated.event.d.ts → user-updated.event.ts} +6 -3
  143. package/src/lib/user/index.ts +11 -0
  144. package/src/lib/user/services/access-key.service.ts +145 -0
  145. package/src/lib/user/services/{user.service.js → user.service.ts} +199 -95
  146. package/src/lib/user/user.module.ts +26 -0
  147. package/src/lib/utils/database.utils.ts +6 -0
  148. package/src/lib/utils/date.util.ts +106 -0
  149. package/src/lib/utils/device.util.ts +111 -0
  150. package/src/lib/utils/index.ts +6 -0
  151. package/src/lib/utils/otp.ts +3 -0
  152. package/src/lib/utils/security.util.ts +27 -0
  153. package/src/lib/utils/slug.util.ts +58 -0
  154. package/src/types/ms.d.ts +1 -0
  155. package/test/access-key.service.spec.ts +204 -0
  156. package/test/auth.service.spec.ts +541 -0
  157. package/test/mfa.service.spec.ts +359 -0
  158. package/test/role.service.spec.ts +418 -0
  159. package/test/tenant.service.spec.ts +218 -0
  160. package/test/test.setup.ts +66 -0
  161. package/test/user.service.spec.ts +374 -0
  162. package/tsconfig.json +17 -0
  163. package/tsconfig.lib.json +15 -0
  164. package/tsconfig.spec.json +15 -0
  165. package/tsconfig.tsbuildinfo +1 -1
  166. package/ui/.env +1 -0
  167. package/ui/.env.example +1 -0
  168. package/ui/.eslintignore +7 -0
  169. package/ui/README.md +288 -0
  170. package/ui/index.html +17 -0
  171. package/ui/package.json +34 -0
  172. package/ui/postcss.config.js +6 -0
  173. package/ui/src/App.tsx +245 -0
  174. package/ui/src/components/AuthGuard.tsx +59 -0
  175. package/ui/src/components/AuthProvider.tsx +76 -0
  176. package/ui/src/components/Button.tsx +37 -0
  177. package/ui/src/components/Card.tsx +37 -0
  178. package/ui/src/components/ErrorMessage.tsx +15 -0
  179. package/ui/src/components/FormDialog.tsx +61 -0
  180. package/ui/src/components/FormFooter.tsx +37 -0
  181. package/ui/src/components/Layout.tsx +112 -0
  182. package/ui/src/components/LoadingMessage.tsx +11 -0
  183. package/ui/src/components/Modal.tsx +97 -0
  184. package/ui/src/components/MultiSelect.tsx +145 -0
  185. package/ui/src/components/PageHeader.tsx +42 -0
  186. package/ui/src/components/PanelHeader.tsx +28 -0
  187. package/ui/src/components/PermissionInput.tsx +473 -0
  188. package/ui/src/components/SearchInput.tsx +69 -0
  189. package/ui/src/components/Select.tsx +51 -0
  190. package/ui/src/components/SwaggerUIWrapper.tsx +316 -0
  191. package/ui/src/components/Table.tsx +207 -0
  192. package/ui/src/components/Tag.tsx +9 -0
  193. package/ui/src/components/TagsInput.tsx +96 -0
  194. package/ui/src/components/admin/AdminForm.tsx +170 -0
  195. package/ui/src/components/admin/CreateAdminDialog.tsx +38 -0
  196. package/ui/src/components/auth/LoginFooter.tsx +17 -0
  197. package/ui/src/components/auth/LoginHeader.tsx +14 -0
  198. package/ui/src/components/auth/components/CodeBlock.tsx +43 -0
  199. package/ui/src/components/auth/components/CreateAccountCodeExamples.tsx +60 -0
  200. package/ui/src/components/auth/components/PasswordRequirements.tsx +16 -0
  201. package/ui/src/components/auth/components/PasswordStrengthIndicator.tsx +48 -0
  202. package/ui/src/components/auth/components/ResetPasswordCodeExamples.tsx +76 -0
  203. package/ui/src/components/auth/components/Tabs.tsx +32 -0
  204. package/ui/src/components/auth/dialogs/CreateAccountDialog.tsx +79 -0
  205. package/ui/src/components/auth/dialogs/ForgotPasswordDialog.tsx +79 -0
  206. package/ui/src/components/auth/forms/CreateAccountForm.tsx +226 -0
  207. package/ui/src/components/auth/forms/LoginForm.tsx +149 -0
  208. package/ui/src/components/auth/forms/ResetPasswordForm.tsx +202 -0
  209. package/ui/src/components/auth/types.ts +17 -0
  210. package/ui/src/components/auth/utils/security.ts +82 -0
  211. package/ui/src/components/auth/utils/utils.ts +25 -0
  212. package/ui/src/components/form/EmailField.tsx +25 -0
  213. package/ui/src/components/form/FormField.tsx +102 -0
  214. package/ui/src/components/form/FormMultiSelect.tsx +46 -0
  215. package/ui/src/components/form/FormSelect.tsx +60 -0
  216. package/ui/src/components/form/FormTagsInput.tsx +42 -0
  217. package/ui/src/components/form/FormTextarea.tsx +42 -0
  218. package/ui/src/components/form/PasswordField.tsx +93 -0
  219. package/ui/src/components/form/SecretKeyField.tsx +49 -0
  220. package/ui/src/components/permission/CreatePermissionDialog.tsx +44 -0
  221. package/ui/src/components/permission/EditPermissionDialog.tsx +55 -0
  222. package/ui/src/components/permission/PermissionForm.tsx +251 -0
  223. package/ui/src/components/role/CreateRoleDialog.tsx +45 -0
  224. package/ui/src/components/role/EditRoleDialog.tsx +55 -0
  225. package/ui/src/components/role/RoleDialog.tsx +252 -0
  226. package/ui/src/components/role/RoleForm.tsx +246 -0
  227. package/ui/src/components/tenant/CreateTenantDialog.tsx +41 -0
  228. package/ui/src/components/tenant/EditTenantDialog.tsx +52 -0
  229. package/ui/src/components/tenant/TenantForm.tsx +160 -0
  230. package/ui/src/components/user/CreateUserDialog.tsx +45 -0
  231. package/ui/src/components/user/UserDetailModal.tsx +815 -0
  232. package/ui/src/components/user/UserForm.tsx +191 -0
  233. package/ui/src/data/nest-auth.json +1687 -0
  234. package/ui/src/hooks/useApi.ts +69 -0
  235. package/ui/src/hooks/useAuth.ts +100 -0
  236. package/ui/src/hooks/useConfirm.tsx +105 -0
  237. package/ui/src/hooks/useFormFooter.tsx +42 -0
  238. package/ui/src/hooks/usePagination.ts +69 -0
  239. package/ui/src/index.css +59 -0
  240. package/ui/src/main.tsx +13 -0
  241. package/ui/src/pages/AdminsPage.tsx +178 -0
  242. package/ui/src/pages/ApiPage.tsx +89 -0
  243. package/ui/src/pages/DashboardPage.tsx +281 -0
  244. package/ui/src/pages/LoginPage.tsx +39 -0
  245. package/ui/src/pages/PermissionsPage.tsx +376 -0
  246. package/ui/src/pages/RolesPage.tsx +274 -0
  247. package/ui/src/pages/TenantsPage.tsx +221 -0
  248. package/ui/src/pages/UsersPage.tsx +387 -0
  249. package/ui/src/services/api.ts +115 -0
  250. package/ui/src/types/index.ts +136 -0
  251. package/ui/src/vite-env.d.ts +9 -0
  252. package/ui/tailwind.config.js +45 -0
  253. package/ui/tsconfig.json +24 -0
  254. package/ui/tsconfig.node.json +10 -0
  255. package/ui/vite.config.ts +37 -0
  256. package/ui/yarn.lock +3137 -0
  257. package/src/index.d.ts +0 -11
  258. package/src/index.js +0 -18
  259. package/src/index.js.map +0 -1
  260. package/src/lib/auth/auth.module.d.ts +0 -2
  261. package/src/lib/auth/auth.module.js +0 -54
  262. package/src/lib/auth/auth.module.js.map +0 -1
  263. package/src/lib/auth/controllers/auth.controller.d.ts +0 -29
  264. package/src/lib/auth/controllers/auth.controller.js +0 -206
  265. package/src/lib/auth/controllers/auth.controller.js.map +0 -1
  266. package/src/lib/auth/controllers/mfa.controller.d.ts +0 -23
  267. package/src/lib/auth/controllers/mfa.controller.js +0 -131
  268. package/src/lib/auth/controllers/mfa.controller.js.map +0 -1
  269. package/src/lib/auth/dto/index.d.ts +0 -0
  270. package/src/lib/auth/dto/index.js +0 -1
  271. package/src/lib/auth/dto/index.js.map +0 -1
  272. package/src/lib/auth/dto/requests/forgot-password.request.dto.d.ts +0 -5
  273. package/src/lib/auth/dto/requests/forgot-password.request.dto.js +0 -30
  274. package/src/lib/auth/dto/requests/forgot-password.request.dto.js.map +0 -1
  275. package/src/lib/auth/dto/requests/login.request.dto.d.ts +0 -6
  276. package/src/lib/auth/dto/requests/login.request.dto.js +0 -38
  277. package/src/lib/auth/dto/requests/login.request.dto.js.map +0 -1
  278. package/src/lib/auth/dto/requests/refresh-token.request.dto.d.ts +0 -3
  279. package/src/lib/auth/dto/requests/refresh-token.request.dto.js +0 -15
  280. package/src/lib/auth/dto/requests/refresh-token.request.dto.js.map +0 -1
  281. package/src/lib/auth/dto/requests/reset-password.request.dto.d.ts +0 -7
  282. package/src/lib/auth/dto/requests/reset-password.request.dto.js +0 -42
  283. package/src/lib/auth/dto/requests/reset-password.request.dto.js.map +0 -1
  284. package/src/lib/auth/dto/requests/send-mfa-code.request.dto.d.ts +0 -4
  285. package/src/lib/auth/dto/requests/send-mfa-code.request.dto.js +0 -16
  286. package/src/lib/auth/dto/requests/send-mfa-code.request.dto.js.map +0 -1
  287. package/src/lib/auth/dto/requests/signup.request.dto.d.ts +0 -7
  288. package/src/lib/auth/dto/requests/signup.request.dto.js +0 -37
  289. package/src/lib/auth/dto/requests/signup.request.dto.js.map +0 -1
  290. package/src/lib/auth/dto/requests/social-login.request.dto.d.ts +0 -3
  291. package/src/lib/auth/dto/requests/social-login.request.dto.js +0 -16
  292. package/src/lib/auth/dto/requests/social-login.request.dto.js.map +0 -1
  293. package/src/lib/auth/dto/requests/verify-2fa.request.dto.d.ts +0 -5
  294. package/src/lib/auth/dto/requests/verify-2fa.request.dto.js +0 -21
  295. package/src/lib/auth/dto/requests/verify-2fa.request.dto.js.map +0 -1
  296. package/src/lib/auth/dto/requests/verify-forgot-password-otp-request-dto.d.ts +0 -6
  297. package/src/lib/auth/dto/requests/verify-forgot-password-otp-request-dto.js +0 -35
  298. package/src/lib/auth/dto/requests/verify-forgot-password-otp-request-dto.js.map +0 -1
  299. package/src/lib/auth/dto/requests/verify-totp-setup.request.dto.d.ts +0 -4
  300. package/src/lib/auth/dto/requests/verify-totp-setup.request.dto.js +0 -20
  301. package/src/lib/auth/dto/requests/verify-totp-setup.request.dto.js.map +0 -1
  302. package/src/lib/auth/dto/responses/auth.response.dto.d.ts +0 -16
  303. package/src/lib/auth/dto/responses/auth.response.dto.js +0 -50
  304. package/src/lib/auth/dto/responses/auth.response.dto.js.map +0 -1
  305. package/src/lib/auth/entities/mfa-secret.entity.d.ts +0 -12
  306. package/src/lib/auth/entities/mfa-secret.entity.js +0 -50
  307. package/src/lib/auth/entities/mfa-secret.entity.js.map +0 -1
  308. package/src/lib/auth/entities/otp.entity.d.ts +0 -13
  309. package/src/lib/auth/entities/otp.entity.js +0 -50
  310. package/src/lib/auth/entities/otp.entity.js.map +0 -1
  311. package/src/lib/auth/events/logged-out-all.event.js +0 -10
  312. package/src/lib/auth/events/logged-out-all.event.js.map +0 -1
  313. package/src/lib/auth/events/logged-out.event.js +0 -10
  314. package/src/lib/auth/events/logged-out.event.js.map +0 -1
  315. package/src/lib/auth/events/password-reset-requested.event.js +0 -10
  316. package/src/lib/auth/events/password-reset-requested.event.js.map +0 -1
  317. package/src/lib/auth/events/password-reset.event.js +0 -10
  318. package/src/lib/auth/events/password-reset.event.js.map +0 -1
  319. package/src/lib/auth/events/user-2fa-verified.event.js +0 -10
  320. package/src/lib/auth/events/user-2fa-verified.event.js.map +0 -1
  321. package/src/lib/auth/events/user-logged-in.event.js +0 -10
  322. package/src/lib/auth/events/user-logged-in.event.js.map +0 -1
  323. package/src/lib/auth/events/user-refresh-token.event.js +0 -10
  324. package/src/lib/auth/events/user-refresh-token.event.js.map +0 -1
  325. package/src/lib/auth/events/user-registered.event.js +0 -10
  326. package/src/lib/auth/events/user-registered.event.js.map +0 -1
  327. package/src/lib/auth/guards/auth.guard.d.ts +0 -28
  328. package/src/lib/auth/guards/auth.guard.js +0 -304
  329. package/src/lib/auth/guards/auth.guard.js.map +0 -1
  330. package/src/lib/auth/index.js +0 -31
  331. package/src/lib/auth/index.js.map +0 -1
  332. package/src/lib/auth/services/auth.service.d.ts +0 -53
  333. package/src/lib/auth/services/auth.service.js +0 -522
  334. package/src/lib/auth/services/auth.service.js.map +0 -1
  335. package/src/lib/auth/services/cookie.service.d.ts +0 -9
  336. package/src/lib/auth/services/cookie.service.js +0 -43
  337. package/src/lib/auth/services/cookie.service.js.map +0 -1
  338. package/src/lib/auth/services/mfa.service.d.ts +0 -38
  339. package/src/lib/auth/services/mfa.service.js +0 -254
  340. package/src/lib/auth/services/mfa.service.js.map +0 -1
  341. package/src/lib/auth.constants.d.ts +0 -39
  342. package/src/lib/auth.constants.js +0 -43
  343. package/src/lib/auth.constants.js.map +0 -1
  344. package/src/lib/core/core.module.d.ts +0 -2
  345. package/src/lib/core/core.module.js +0 -53
  346. package/src/lib/core/core.module.js.map +0 -1
  347. package/src/lib/core/decorators/auth.decorator.d.ts +0 -1
  348. package/src/lib/core/decorators/auth.decorator.js +0 -8
  349. package/src/lib/core/decorators/auth.decorator.js.map +0 -1
  350. package/src/lib/core/decorators/permissions.decorator.d.ts +0 -2
  351. package/src/lib/core/decorators/permissions.decorator.js +0 -14
  352. package/src/lib/core/decorators/permissions.decorator.js.map +0 -1
  353. package/src/lib/core/decorators/role.decorator.d.ts +0 -3
  354. package/src/lib/core/decorators/role.decorator.js +0 -14
  355. package/src/lib/core/decorators/role.decorator.js.map +0 -1
  356. package/src/lib/core/decorators/skip-mfa.decorator.d.ts +0 -2
  357. package/src/lib/core/decorators/skip-mfa.decorator.js +0 -8
  358. package/src/lib/core/decorators/skip-mfa.decorator.js.map +0 -1
  359. package/src/lib/core/dto/message.response.dto.d.ts +0 -3
  360. package/src/lib/core/dto/message.response.dto.js +0 -13
  361. package/src/lib/core/dto/message.response.dto.js.map +0 -1
  362. package/src/lib/core/entities.js +0 -31
  363. package/src/lib/core/entities.js.map +0 -1
  364. package/src/lib/core/index.js +0 -27
  365. package/src/lib/core/index.js.map +0 -1
  366. package/src/lib/core/interfaces/auth-module-options.interface.d.ts +0 -62
  367. package/src/lib/core/interfaces/auth-module-options.interface.js +0 -3
  368. package/src/lib/core/interfaces/auth-module-options.interface.js.map +0 -1
  369. package/src/lib/core/interfaces/mfa-options.interface.d.ts +0 -25
  370. package/src/lib/core/interfaces/mfa-options.interface.js +0 -10
  371. package/src/lib/core/interfaces/mfa-options.interface.js.map +0 -1
  372. package/src/lib/core/interfaces/otp.interface.d.ts +0 -5
  373. package/src/lib/core/interfaces/otp.interface.js +0 -10
  374. package/src/lib/core/interfaces/otp.interface.js.map +0 -1
  375. package/src/lib/core/interfaces/session-options.interface.d.ts +0 -12
  376. package/src/lib/core/interfaces/session-options.interface.js +0 -9
  377. package/src/lib/core/interfaces/session-options.interface.js.map +0 -1
  378. package/src/lib/core/interfaces/token-payload.interface.js +0 -3
  379. package/src/lib/core/interfaces/token-payload.interface.js.map +0 -1
  380. package/src/lib/core/providers/apple-auth.provider.d.ts +0 -18
  381. package/src/lib/core/providers/apple-auth.provider.js +0 -57
  382. package/src/lib/core/providers/apple-auth.provider.js.map +0 -1
  383. package/src/lib/core/providers/base-auth.provider.d.ts +0 -26
  384. package/src/lib/core/providers/base-auth.provider.js +0 -43
  385. package/src/lib/core/providers/base-auth.provider.js.map +0 -1
  386. package/src/lib/core/providers/email-auth.provider.d.ts +0 -17
  387. package/src/lib/core/providers/email-auth.provider.js +0 -40
  388. package/src/lib/core/providers/email-auth.provider.js.map +0 -1
  389. package/src/lib/core/providers/facebook-auth.provider.d.ts +0 -18
  390. package/src/lib/core/providers/facebook-auth.provider.js +0 -56
  391. package/src/lib/core/providers/facebook-auth.provider.js.map +0 -1
  392. package/src/lib/core/providers/google-auth.provider.d.ts +0 -21
  393. package/src/lib/core/providers/google-auth.provider.js +0 -58
  394. package/src/lib/core/providers/google-auth.provider.js.map +0 -1
  395. package/src/lib/core/providers/jwt-auth.provider.d.ts +0 -33
  396. package/src/lib/core/providers/jwt-auth.provider.js +0 -50
  397. package/src/lib/core/providers/jwt-auth.provider.js.map +0 -1
  398. package/src/lib/core/providers/phone-auth.provider.d.ts +0 -18
  399. package/src/lib/core/providers/phone-auth.provider.js +0 -43
  400. package/src/lib/core/providers/phone-auth.provider.js.map +0 -1
  401. package/src/lib/core/services/auth-config.service.d.ts +0 -12
  402. package/src/lib/core/services/auth-config.service.js +0 -79
  403. package/src/lib/core/services/auth-config.service.js.map +0 -1
  404. package/src/lib/core/services/auth-provider-registry.service.d.ts +0 -24
  405. package/src/lib/core/services/auth-provider-registry.service.js +0 -71
  406. package/src/lib/core/services/auth-provider-registry.service.js.map +0 -1
  407. package/src/lib/core/services/debug-logger.service.d.ts +0 -38
  408. package/src/lib/core/services/debug-logger.service.js.map +0 -1
  409. package/src/lib/core/services/initialization.service.d.ts +0 -10
  410. package/src/lib/core/services/initialization.service.js +0 -34
  411. package/src/lib/core/services/initialization.service.js.map +0 -1
  412. package/src/lib/core/services/jwt.service.d.ts +0 -14
  413. package/src/lib/core/services/jwt.service.js +0 -92
  414. package/src/lib/core/services/jwt.service.js.map +0 -1
  415. package/src/lib/nest-auth.module.d.ts +0 -11
  416. package/src/lib/nest-auth.module.js +0 -177
  417. package/src/lib/nest-auth.module.js.map +0 -1
  418. package/src/lib/request-context/request-context.d.ts +0 -22
  419. package/src/lib/request-context/request-context.js.map +0 -1
  420. package/src/lib/request-context/request-context.middleware.d.ts +0 -4
  421. package/src/lib/request-context/request-context.middleware.js +0 -16
  422. package/src/lib/request-context/request-context.middleware.js.map +0 -1
  423. package/src/lib/role/entities/role.entity.d.ts +0 -20
  424. package/src/lib/role/entities/role.entity.js +0 -110
  425. package/src/lib/role/entities/role.entity.js.map +0 -1
  426. package/src/lib/role/index.js +0 -5
  427. package/src/lib/role/index.js.map +0 -1
  428. package/src/lib/role/role.module.d.ts +0 -2
  429. package/src/lib/role/role.module.js +0 -23
  430. package/src/lib/role/role.module.js.map +0 -1
  431. package/src/lib/role/services/role.service.d.ts +0 -20
  432. package/src/lib/role/services/role.service.js.map +0 -1
  433. package/src/lib/session/entities/session.entity.d.ts +0 -16
  434. package/src/lib/session/entities/session.entity.js +0 -63
  435. package/src/lib/session/entities/session.entity.js.map +0 -1
  436. package/src/lib/session/index.d.ts +0 -3
  437. package/src/lib/session/index.js +0 -7
  438. package/src/lib/session/index.js.map +0 -1
  439. package/src/lib/session/services/base-session.service.d.ts +0 -23
  440. package/src/lib/session/services/base-session.service.js +0 -64
  441. package/src/lib/session/services/base-session.service.js.map +0 -1
  442. package/src/lib/session/services/database-session.service.d.ts +0 -17
  443. package/src/lib/session/services/database-session.service.js +0 -51
  444. package/src/lib/session/services/database-session.service.js.map +0 -1
  445. package/src/lib/session/services/redis-session.service.d.ts +0 -20
  446. package/src/lib/session/services/redis-session.service.js +0 -117
  447. package/src/lib/session/services/redis-session.service.js.map +0 -1
  448. package/src/lib/session/session.module.d.ts +0 -2
  449. package/src/lib/session/session.module.js +0 -33
  450. package/src/lib/session/session.module.js.map +0 -1
  451. package/src/lib/tenant/entities/tenant.entity.d.ts +0 -10
  452. package/src/lib/tenant/entities/tenant.entity.js +0 -44
  453. package/src/lib/tenant/entities/tenant.entity.js.map +0 -1
  454. package/src/lib/tenant/events/tenant-created.event.d.ts +0 -8
  455. package/src/lib/tenant/events/tenant-created.event.js +0 -10
  456. package/src/lib/tenant/events/tenant-created.event.js.map +0 -1
  457. package/src/lib/tenant/events/tenant-deleted.event.d.ts +0 -8
  458. package/src/lib/tenant/events/tenant-deleted.event.js +0 -10
  459. package/src/lib/tenant/events/tenant-deleted.event.js.map +0 -1
  460. package/src/lib/tenant/events/tenant-updated.event.js +0 -10
  461. package/src/lib/tenant/events/tenant-updated.event.js.map +0 -1
  462. package/src/lib/tenant/index.d.ts +0 -1
  463. package/src/lib/tenant/index.js +0 -5
  464. package/src/lib/tenant/index.js.map +0 -1
  465. package/src/lib/tenant/services/tenant.service.d.ts +0 -26
  466. package/src/lib/tenant/services/tenant.service.js +0 -200
  467. package/src/lib/tenant/services/tenant.service.js.map +0 -1
  468. package/src/lib/tenant/tenant.module.d.ts +0 -2
  469. package/src/lib/tenant/tenant.module.js +0 -27
  470. package/src/lib/tenant/tenant.module.js.map +0 -1
  471. package/src/lib/user/dto/requests/update-user.dto.d.ts +0 -5
  472. package/src/lib/user/dto/requests/update-user.dto.js +0 -24
  473. package/src/lib/user/dto/requests/update-user.dto.js.map +0 -1
  474. package/src/lib/user/entities/access-key.entity.d.ts +0 -16
  475. package/src/lib/user/entities/access-key.entity.js +0 -63
  476. package/src/lib/user/entities/access-key.entity.js.map +0 -1
  477. package/src/lib/user/entities/identity.entity.d.ts +0 -12
  478. package/src/lib/user/entities/identity.entity.js +0 -47
  479. package/src/lib/user/entities/identity.entity.js.map +0 -1
  480. package/src/lib/user/entities/user.entity.d.ts +0 -39
  481. package/src/lib/user/entities/user.entity.js +0 -201
  482. package/src/lib/user/entities/user.entity.js.map +0 -1
  483. package/src/lib/user/events/user-created.event.js +0 -10
  484. package/src/lib/user/events/user-created.event.js.map +0 -1
  485. package/src/lib/user/events/user-deleted.event.js +0 -10
  486. package/src/lib/user/events/user-deleted.event.js.map +0 -1
  487. package/src/lib/user/events/user-updated.event.js +0 -10
  488. package/src/lib/user/events/user-updated.event.js.map +0 -1
  489. package/src/lib/user/index.d.ts +0 -3
  490. package/src/lib/user/index.js +0 -7
  491. package/src/lib/user/index.js.map +0 -1
  492. package/src/lib/user/services/access-key.service.d.ts +0 -19
  493. package/src/lib/user/services/access-key.service.js +0 -119
  494. package/src/lib/user/services/access-key.service.js.map +0 -1
  495. package/src/lib/user/services/user.service.d.ts +0 -24
  496. package/src/lib/user/services/user.service.js.map +0 -1
  497. package/src/lib/user/user.module.d.ts +0 -2
  498. package/src/lib/user/user.module.js +0 -34
  499. package/src/lib/user/user.module.js.map +0 -1
  500. package/src/lib/utils/database.utils.d.ts +0 -2
  501. package/src/lib/utils/database.utils.js +0 -8
  502. package/src/lib/utils/database.utils.js.map +0 -1
  503. package/src/lib/utils/otp.d.ts +0 -1
  504. package/src/lib/utils/otp.js +0 -7
  505. package/src/lib/utils/otp.js.map +0 -1
@@ -1,43 +1,59 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RoleService = void 0;
4
- const tslib_1 = require("tslib");
5
- const common_1 = require("@nestjs/common");
6
- const typeorm_1 = require("@nestjs/typeorm");
7
- const typeorm_2 = require("typeorm");
8
- const role_entity_1 = require("../entities/role.entity");
9
- const tenant_1 = require("../../tenant");
10
- let RoleService = class RoleService {
11
- constructor(roleRepository, tenantService) {
12
- this.roleRepository = roleRepository;
13
- this.tenantService = tenantService;
14
- }
15
- async createRole(name, guard, tenantId = null, isSystem = false, permissionIds) {
1
+ import { Injectable, NotFoundException, BadRequestException, ConflictException } from '@nestjs/common';
2
+ import { InjectRepository } from '@nestjs/typeorm';
3
+ import { FindManyOptions, FindOneOptions, IsNull, Repository } from 'typeorm';
4
+ import { NestAuthRole } from '../entities/role.entity';
5
+ import { TenantService } from '../../tenant';
6
+
7
+ @Injectable()
8
+ export class RoleService {
9
+ constructor(
10
+ @InjectRepository(NestAuthRole)
11
+ private roleRepository: Repository<NestAuthRole>,
12
+ private tenantService: TenantService,
13
+ ) { }
14
+
15
+ async createRole(
16
+ name: string,
17
+ guard: string,
18
+ tenantId: string = null,
19
+ isSystem: boolean = false,
20
+ permissionIds?: string | string[],
21
+ ): Promise<NestAuthRole> {
22
+
16
23
  tenantId = await this.tenantService.resolveTenantId(tenantId);
24
+
25
+ // Check for existing role with same name in the same guard and tenant
17
26
  const existingRole = await this.roleRepository.findOne({
18
27
  where: {
19
28
  name,
20
29
  guard,
21
- tenantId: tenantId || (0, typeorm_2.IsNull)()
30
+ tenantId: tenantId || IsNull()
22
31
  },
23
32
  });
33
+
24
34
  if (existingRole) {
25
- throw new common_1.ConflictException({
35
+ throw new ConflictException({
26
36
  message: `Role with name '${name}' already exists in guard '${guard}'${tenantId ? ` for tenant '${tenantId}'` : ''}`,
27
37
  code: 'ROLE_ALREADY_EXISTS'
28
38
  });
29
39
  }
30
- const role = await role_entity_1.NestAuthRole.createRole(name, guard, isSystem, tenantId);
40
+
41
+ const role = await NestAuthRole.createRole(name, guard, isSystem, tenantId);
42
+
31
43
  if (permissionIds) {
32
44
  await role.syncPermissions(permissionIds);
33
45
  }
46
+
34
47
  await this.roleRepository.save(role);
35
48
  return role;
49
+
36
50
  }
37
- async getRoleById(id, options) {
51
+
52
+ async getRoleById(id: string, options?: FindOneOptions<NestAuthRole>): Promise<NestAuthRole> {
38
53
  if (!id) {
39
54
  return null;
40
55
  }
56
+
41
57
  const role = await this.roleRepository.findOne({
42
58
  ...(options ? options : {}),
43
59
  where: { id }
@@ -47,7 +63,14 @@ let RoleService = class RoleService {
47
63
  }
48
64
  return role;
49
65
  }
50
- async getRoleByName(name, guard, tenantId, options) {
66
+
67
+ async getRoleByName(
68
+ name: string,
69
+ guard?: string,
70
+ tenantId?: string,
71
+ options?: FindOneOptions<NestAuthRole>
72
+ ): Promise<NestAuthRole> {
73
+ // First check for system roles with this name
51
74
  const systemRole = await this.roleRepository.findOne({
52
75
  ...(options ? options : {}),
53
76
  where: {
@@ -56,25 +79,30 @@ let RoleService = class RoleService {
56
79
  isSystem: true
57
80
  }
58
81
  });
82
+
59
83
  if (systemRole) {
60
84
  return systemRole;
61
85
  }
86
+
87
+ // Then check for tenant-specific roles
62
88
  const role = await this.roleRepository.findOne({
63
89
  ...(options ? options : {}),
64
90
  where: {
65
91
  name,
66
92
  ...(guard ? { guard } : {}),
67
- ...(tenantId ? { tenantId } : { tenantId: (0, typeorm_2.IsNull)() })
93
+ ...(tenantId ? { tenantId } : { tenantId: IsNull() })
68
94
  }
69
95
  });
96
+
70
97
  return role;
71
98
  }
72
- async getSystemRoles(options) {
99
+
100
+ async getSystemRoles(options?: FindManyOptions<NestAuthRole>): Promise<NestAuthRole[]> {
73
101
  return this.roleRepository.find({
74
102
  ...(options ? options : {}),
75
103
  where: {
76
104
  isSystem: true,
77
- tenantId: (0, typeorm_2.IsNull)(),
105
+ tenantId: IsNull(),
78
106
  ...(options?.where ? options.where : {})
79
107
  },
80
108
  order: {
@@ -82,10 +110,12 @@ let RoleService = class RoleService {
82
110
  }
83
111
  });
84
112
  }
85
- async getRoles(options) {
113
+
114
+ async getRoles(options?: FindManyOptions<NestAuthRole>): Promise<NestAuthRole[]> {
86
115
  return this.roleRepository.find(options);
87
116
  }
88
- async getSystemRolesByGuard(guard, options) {
117
+
118
+ async getSystemRolesByGuard(guard: string, options?: FindManyOptions<NestAuthRole>): Promise<NestAuthRole[]> {
89
119
  return this.roleRepository.find({
90
120
  ...(options ? options : {}),
91
121
  where: {
@@ -98,7 +128,12 @@ let RoleService = class RoleService {
98
128
  }
99
129
  });
100
130
  }
101
- async getRolesByGuard(guard, tenantId, options) {
131
+
132
+ async getRolesByGuard(
133
+ guard: string,
134
+ tenantId?: string,
135
+ options?: FindManyOptions<NestAuthRole>
136
+ ): Promise<NestAuthRole[]> {
102
137
  if (!guard) {
103
138
  return [];
104
139
  }
@@ -106,28 +141,36 @@ let RoleService = class RoleService {
106
141
  ...(options ? options : {}),
107
142
  where: {
108
143
  guard,
109
- ...(tenantId ? { tenantId } : { tenantId: (0, typeorm_2.IsNull)() }),
144
+ ...(tenantId ? { tenantId } : { tenantId: IsNull() }),
110
145
  ...(options?.where ? options.where : {})
111
146
  },
112
147
  });
113
148
  }
114
- async getRolesByTenant(tenantId, includeSystemRoles = true, options) {
149
+
150
+ async getRolesByTenant(tenantId: string, includeSystemRoles: boolean = true, options?: FindManyOptions<NestAuthRole>): Promise<NestAuthRole[]> {
115
151
  tenantId = await this.tenantService.resolveTenantId(tenantId);
116
152
  if (!tenantId) {
117
153
  return [];
118
154
  }
155
+
119
156
  const query = this.roleRepository.createQueryBuilder('role');
157
+
158
+ // Add tenant condition
120
159
  query.where('role.tenantId = :tenantId', { tenantId });
160
+
161
+ // Add system roles condition if needed
121
162
  if (includeSystemRoles) {
122
163
  query.orWhere('role.tenantId IS NULL AND role.isSystem = :isSystem', { isSystem: true });
123
164
  }
165
+
166
+ // Apply any additional options
124
167
  if (options) {
125
168
  if (options.where) {
126
169
  query.andWhere(options.where);
127
170
  }
128
171
  if (options.order) {
129
172
  Object.entries(options.order).forEach(([key, value]) => {
130
- query.addOrderBy(`role.${key}`, value);
173
+ query.addOrderBy(`role.${key}`, value as 'ASC' | 'DESC');
131
174
  });
132
175
  }
133
176
  if (options.skip) {
@@ -137,88 +180,110 @@ let RoleService = class RoleService {
137
180
  query.take(options.take);
138
181
  }
139
182
  }
183
+
140
184
  return query.getMany();
141
185
  }
142
- async updateRole(id, data) {
186
+
187
+ async updateRole(id: string, data: Partial<NestAuthRole>): Promise<NestAuthRole> {
143
188
  const role = await this.getRoleById(id);
189
+
144
190
  if (!role) {
145
- throw new common_1.NotFoundException({
191
+ throw new NotFoundException({
146
192
  message: `Role with ID ${id} not found`,
147
193
  code: 'ROLE_NOT_FOUND'
148
194
  });
149
195
  }
196
+
150
197
  if (role.isSystem) {
151
- throw new common_1.ConflictException({
198
+ throw new ConflictException({
152
199
  message: 'Cannot update system role',
153
200
  code: 'SYSTEM_ROLE_UPDATE_ERROR',
154
201
  });
155
202
  }
203
+
204
+ // Prevent changing system status and tenant
156
205
  delete data.isSystem;
157
206
  delete data.tenantId;
207
+
208
+ // If name or guard is being changed, check for conflicts
158
209
  if ((data.name && data.name !== role.name) || (data.guard && data.guard !== role.guard)) {
159
- const systemRole = await this.getRoleByName(data.name || role.name, data.guard || role.guard);
210
+ // First check for system role conflicts
211
+ const systemRole = await this.getRoleByName(
212
+ data.name || role.name,
213
+ data.guard || role.guard
214
+ );
215
+
160
216
  if (systemRole) {
161
- throw new common_1.ConflictException({
217
+ throw new ConflictException({
162
218
  message: `Cannot use name '${data.name || role.name}' as it conflicts with a system role`,
163
219
  code: 'SYSTEM_ROLE_CONFLICT'
164
220
  });
165
221
  }
166
- const existingRole = await this.getRoleByName(data.name || role.name, data.guard || role.guard, role.tenantId);
222
+
223
+ // Then check for tenant role conflicts
224
+ const existingRole = await this.getRoleByName(
225
+ data.name || role.name,
226
+ data.guard || role.guard,
227
+ role.tenantId
228
+ );
229
+
167
230
  if (existingRole && existingRole.id !== role.id) {
168
- throw new common_1.ConflictException({
231
+ throw new ConflictException({
169
232
  message: `Role with name '${data.name || role.name}' already exists in guard '${data.guard || role.guard}'${role.tenantId ? ` for tenant '${role.tenantId}'` : ''}`,
170
233
  code: 'ROLE_ALREADY_EXISTS'
171
234
  });
172
235
  }
173
236
  }
237
+
174
238
  Object.assign(role, data);
175
239
  return this.roleRepository.save(role);
176
240
  }
177
- async updateRolePermissions(id, permissionIds) {
241
+
242
+ async updateRolePermissions(id: string, permissionIds: string | string[]): Promise<NestAuthRole> {
178
243
  const role = await this.getRoleById(id);
244
+
179
245
  if (!role) {
180
- throw new common_1.NotFoundException({
246
+ throw new NotFoundException({
181
247
  message: `Role with ID ${id} not found`,
182
248
  code: 'ROLE_NOT_FOUND'
183
249
  });
184
250
  }
251
+
185
252
  if (role.isSystem) {
186
- throw new common_1.BadRequestException({
253
+ throw new BadRequestException({
187
254
  message: 'Cannot update system role',
188
255
  code: 'SYSTEM_ROLE_UPDATE_ERROR',
189
256
  });
190
257
  }
258
+
191
259
  await role.syncPermissions(permissionIds);
192
260
  return this.roleRepository.save(role);
193
261
  }
194
- async deleteRole(id) {
262
+
263
+ async deleteRole(id: string): Promise<void> {
195
264
  const role = await this.getRoleById(id);
265
+
196
266
  if (!role) {
197
- throw new common_1.NotFoundException({
267
+ throw new NotFoundException({
198
268
  message: `Role with ID ${id} not found`,
199
269
  code: 'ROLE_NOT_FOUND'
200
270
  });
201
271
  }
272
+
202
273
  if (role.isSystem) {
203
- throw new common_1.BadRequestException({
274
+ throw new BadRequestException({
204
275
  message: 'Cannot delete system role',
205
276
  code: 'SYSTEM_ROLE_DELETE_ERROR',
206
277
  });
207
278
  }
279
+
208
280
  await this.roleRepository.remove(role);
209
281
  }
210
- async deleteSystemRole(id) {
282
+
283
+ async deleteSystemRole(id: string): Promise<void> {
211
284
  const role = await this.getRoleById(id);
212
285
  if (role?.isSystem) {
213
286
  await this.roleRepository.remove(role);
214
287
  }
215
288
  }
216
- };
217
- exports.RoleService = RoleService;
218
- exports.RoleService = RoleService = tslib_1.__decorate([
219
- (0, common_1.Injectable)(),
220
- tslib_1.__param(0, (0, typeorm_1.InjectRepository)(role_entity_1.NestAuthRole)),
221
- tslib_1.__metadata("design:paramtypes", [typeorm_2.Repository,
222
- tenant_1.TenantService])
223
- ], RoleService);
224
- //# sourceMappingURL=role.service.js.map
289
+ }
@@ -0,0 +1,54 @@
1
+ import {
2
+ Entity,
3
+ Column,
4
+ PrimaryGeneratedColumn,
5
+ CreateDateColumn,
6
+ UpdateDateColumn,
7
+ ManyToOne,
8
+ JoinColumn,
9
+ BaseEntity,
10
+ RelationId
11
+ } from 'typeorm';
12
+ import { NestAuthUser } from '../../user/entities/user.entity';
13
+
14
+
15
+ @Entity('nest_auth_sessions')
16
+ export class NestAuthSession extends BaseEntity {
17
+ @PrimaryGeneratedColumn('uuid')
18
+ id: string;
19
+
20
+ @Column({ nullable: true })
21
+ @RelationId((session: NestAuthSession) => session.user)
22
+ userId: string;
23
+
24
+ @ManyToOne(() => NestAuthUser, { onDelete: 'CASCADE' })
25
+ @JoinColumn({ name: 'userId' })
26
+ user: NestAuthUser;
27
+
28
+ @Column('simple-json', { nullable: true, default: '{}' })
29
+ data?: any;
30
+
31
+ @Column({ nullable: true })
32
+ refreshToken: string;
33
+
34
+ @Column({ nullable: true })
35
+ expiresAt: Date;
36
+
37
+ @Column({ nullable: true })
38
+ userAgent?: string;
39
+
40
+ @Column({ nullable: true })
41
+ deviceName?: string;
42
+
43
+ @Column({ nullable: true })
44
+ ipAddress?: string;
45
+
46
+ @Column({ nullable: true })
47
+ lastActive: Date;
48
+
49
+ @CreateDateColumn()
50
+ createdAt?: Date;
51
+
52
+ @UpdateDateColumn()
53
+ updatedAt?: Date;
54
+ }
@@ -0,0 +1,20 @@
1
+ // Entities
2
+ export * from './entities/session.entity';
3
+
4
+ // Interfaces
5
+ export * from './interfaces/session-repository.interface';
6
+
7
+ // Repositories
8
+ export * from './repositories/base-session.repository';
9
+ export * from './repositories/typeorm-session.repository';
10
+ export * from './repositories/redis-session.repository';
11
+ export * from './repositories/memory-session.repository';
12
+
13
+ // Services
14
+ export * from './services/session-manager.service';
15
+
16
+ // Utils
17
+ export * from './utils/session.util';
18
+
19
+ // Module
20
+ export * from './session.module';
@@ -0,0 +1,58 @@
1
+ import { NestAuthSession } from '../entities/session.entity';
2
+ import { SessionPayload } from '../../core/interfaces/token-payload.interface';
3
+
4
+ /**
5
+ * Interface for session repository implementations
6
+ * Allows different storage backends (Database, Redis, Memory)
7
+ */
8
+ export interface ISessionRepository {
9
+ /**
10
+ * Create a new session
11
+ */
12
+ create(session: SessionPayload): Promise<NestAuthSession>;
13
+
14
+ /**
15
+ * Find session by ID
16
+ */
17
+ findById(sessionId: string): Promise<NestAuthSession | null>;
18
+
19
+ /**
20
+ * Find all sessions for a user
21
+ */
22
+ findByUserId(userId: string): Promise<NestAuthSession[]>;
23
+
24
+ /**
25
+ * Find active sessions for a user (not expired)
26
+ */
27
+ findActiveByUserId(userId: string): Promise<NestAuthSession[]>;
28
+
29
+ /**
30
+ * Update session
31
+ */
32
+ update(sessionId: string, updates: Partial<NestAuthSession>): Promise<NestAuthSession>;
33
+
34
+ /**
35
+ * Delete session by ID
36
+ */
37
+ delete(sessionId: string): Promise<void>;
38
+
39
+ /**
40
+ * Delete all sessions for a user
41
+ */
42
+ deleteByUserId(userId: string): Promise<void>;
43
+
44
+ /**
45
+ * Delete expired sessions
46
+ */
47
+ deleteExpired(): Promise<number>;
48
+
49
+ /**
50
+ * Count active sessions for a user
51
+ */
52
+ countActiveByUserId(userId: string): Promise<number>;
53
+
54
+ /**
55
+ * Update last active timestamp
56
+ */
57
+ updateLastActive(sessionId: string): Promise<void>;
58
+ }
@@ -0,0 +1,74 @@
1
+ import { NestAuthSession } from '../entities/session.entity';
2
+ import { SessionPayload } from '../../core/interfaces/token-payload.interface';
3
+ import { ISessionRepository } from '../interfaces/session-repository.interface';
4
+ import ms from 'ms';
5
+
6
+ /**
7
+ * Abstract base class for session repositories
8
+ * Provides common functionality and helper methods
9
+ */
10
+ export abstract class BaseSessionRepository implements ISessionRepository {
11
+
12
+ // Abstract methods that must be implemented by subclasses
13
+ abstract create(session: SessionPayload): Promise<NestAuthSession>;
14
+ abstract findById(sessionId: string): Promise<NestAuthSession | null>;
15
+ abstract findByUserId(userId: string): Promise<NestAuthSession[]>;
16
+ abstract findActiveByUserId(userId: string): Promise<NestAuthSession[]>;
17
+ abstract update(sessionId: string, updates: Partial<NestAuthSession>): Promise<NestAuthSession>;
18
+ abstract delete(sessionId: string): Promise<void>;
19
+ abstract deleteByUserId(userId: string): Promise<void>;
20
+ abstract deleteExpired(): Promise<number>;
21
+ abstract countActiveByUserId(userId: string): Promise<number>;
22
+ abstract updateLastActive(sessionId: string): Promise<void>;
23
+
24
+ /**
25
+ * Helper: Check if session is expired
26
+ */
27
+ protected isExpired(session: NestAuthSession): boolean {
28
+ if (!session.expiresAt) return false;
29
+ return new Date() > new Date(session.expiresAt);
30
+ }
31
+
32
+ /**
33
+ * Helper: Calculate expiration date from duration string
34
+ */
35
+ protected calculateExpiresAt(duration: string | number): Date {
36
+ const milliseconds = typeof duration === 'string' ? ms(duration) : duration;
37
+ return new Date(Date.now() + milliseconds);
38
+ }
39
+
40
+ /**
41
+ * Helper: Serialize session data for storage
42
+ */
43
+ protected serializeSession(session: SessionPayload | NestAuthSession): Record<string, any> {
44
+ return {
45
+ ...session,
46
+ data: session.data ? JSON.stringify(session.data) : null,
47
+ expiresAt: session.expiresAt instanceof Date
48
+ ? session.expiresAt.toISOString()
49
+ : session.expiresAt,
50
+ lastActive: session.lastActive instanceof Date
51
+ ? session.lastActive.toISOString()
52
+ : session.lastActive,
53
+ };
54
+ }
55
+
56
+ /**
57
+ * Helper: Deserialize session data from storage
58
+ */
59
+ protected deserializeSession(data: Record<string, any>): NestAuthSession {
60
+ return {
61
+ ...data,
62
+ data: data['data'] ? JSON.parse(data['data']) : null,
63
+ expiresAt: data['expiresAt'] ? new Date(data['expiresAt']) : null,
64
+ lastActive: data['lastActive'] ? new Date(data['lastActive']) : null,
65
+ } as NestAuthSession;
66
+ }
67
+
68
+ /**
69
+ * Helper: Filter only active sessions (not expired)
70
+ */
71
+ protected filterActive(sessions: NestAuthSession[]): NestAuthSession[] {
72
+ return sessions.filter(session => !this.isExpired(session));
73
+ }
74
+ }
@@ -0,0 +1,153 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { BaseSessionRepository } from './base-session.repository';
3
+ import { NestAuthSession } from '../entities/session.entity';
4
+ import { SessionPayload } from '../../core/interfaces/token-payload.interface';
5
+ import { v4 as uuidv4 } from 'uuid';
6
+
7
+ /**
8
+ * In-memory implementation of session repository
9
+ * Useful for testing and development
10
+ * WARNING: Sessions are lost on server restart!
11
+ */
12
+ @Injectable()
13
+ export class MemorySessionRepository extends BaseSessionRepository {
14
+ private sessions: Map<string, NestAuthSession> = new Map();
15
+ private userSessions: Map<string, Set<string>> = new Map();
16
+
17
+ async create(session: SessionPayload): Promise<NestAuthSession> {
18
+ const sessionId = session.id || uuidv4();
19
+
20
+ const sessionData: NestAuthSession = {
21
+ id: sessionId,
22
+ userId: session.userId,
23
+ refreshToken: session.refreshToken,
24
+ data: session.data,
25
+ expiresAt: session.expiresAt,
26
+ userAgent: session.userAgent,
27
+ deviceName: session.deviceName,
28
+ ipAddress: session.ipAddress,
29
+ lastActive: session.lastActive || new Date(),
30
+ createdAt: new Date(),
31
+ updatedAt: new Date(),
32
+ } as NestAuthSession;
33
+
34
+ this.sessions.set(sessionId, sessionData);
35
+
36
+ // Track user sessions
37
+ if (!this.userSessions.has(session.userId)) {
38
+ this.userSessions.set(session.userId, new Set());
39
+ }
40
+ this.userSessions.get(session.userId)!.add(sessionId);
41
+
42
+ return sessionData;
43
+ }
44
+
45
+ async findById(sessionId: string): Promise<NestAuthSession | null> {
46
+ const session = this.sessions.get(sessionId);
47
+ if (!session) return null;
48
+
49
+ // Check expiration
50
+ if (this.isExpired(session)) {
51
+ await this.delete(sessionId);
52
+ return null;
53
+ }
54
+
55
+ return session;
56
+ }
57
+
58
+ async findByUserId(userId: string): Promise<NestAuthSession[]> {
59
+ const sessionIds = this.userSessions.get(userId) || new Set();
60
+ const sessions: NestAuthSession[] = [];
61
+
62
+ for (const sessionId of sessionIds) {
63
+ const session = await this.findById(sessionId);
64
+ if (session) {
65
+ sessions.push(session);
66
+ }
67
+ }
68
+
69
+ return sessions.sort((a, b) =>
70
+ (b.createdAt?.getTime() || 0) - (a.createdAt?.getTime() || 0)
71
+ );
72
+ }
73
+
74
+ async findActiveByUserId(userId: string): Promise<NestAuthSession[]> {
75
+ const allSessions = await this.findByUserId(userId);
76
+ return this.filterActive(allSessions);
77
+ }
78
+
79
+ async update(sessionId: string, updates: Partial<NestAuthSession>): Promise<NestAuthSession> {
80
+ const session = await this.findById(sessionId);
81
+ if (!session) {
82
+ throw new Error(`Session ${sessionId} not found`);
83
+ }
84
+
85
+ const updated = {
86
+ ...session,
87
+ ...updates,
88
+ updatedAt: new Date(),
89
+ } as NestAuthSession;
90
+
91
+ this.sessions.set(sessionId, updated);
92
+ return updated;
93
+ }
94
+
95
+ async delete(sessionId: string): Promise<void> {
96
+ const session = this.sessions.get(sessionId);
97
+ if (!session) return;
98
+
99
+ this.sessions.delete(sessionId);
100
+
101
+ // Remove from user sessions
102
+ const userSessionIds = this.userSessions.get(session.userId);
103
+ if (userSessionIds) {
104
+ userSessionIds.delete(sessionId);
105
+ if (userSessionIds.size === 0) {
106
+ this.userSessions.delete(session.userId);
107
+ }
108
+ }
109
+ }
110
+
111
+ async deleteByUserId(userId: string): Promise<void> {
112
+ const sessionIds = this.userSessions.get(userId) || new Set();
113
+
114
+ for (const sessionId of sessionIds) {
115
+ this.sessions.delete(sessionId);
116
+ }
117
+
118
+ this.userSessions.delete(userId);
119
+ }
120
+
121
+ async deleteExpired(): Promise<number> {
122
+ let count = 0;
123
+ const now = new Date();
124
+
125
+ for (const [sessionId, session] of this.sessions.entries()) {
126
+ if (this.isExpired(session)) {
127
+ await this.delete(sessionId);
128
+ count++;
129
+ }
130
+ }
131
+
132
+ return count;
133
+ }
134
+
135
+ async countActiveByUserId(userId: string): Promise<number> {
136
+ const activeSessions = await this.findActiveByUserId(userId);
137
+ return activeSessions.length;
138
+ }
139
+
140
+ async updateLastActive(sessionId: string): Promise<void> {
141
+ await this.update(sessionId, {
142
+ lastActive: new Date(),
143
+ } as any);
144
+ }
145
+
146
+ /**
147
+ * Clear all sessions (useful for testing)
148
+ */
149
+ clear(): void {
150
+ this.sessions.clear();
151
+ this.userSessions.clear();
152
+ }
153
+ }