@ackplus/nest-auth 0.1.51 → 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
@@ -0,0 +1,541 @@
1
+
2
+ import { EMAIL_AUTH_PROVIDER, PHONE_AUTH_PROVIDER } from '../src/lib/auth.constants';
3
+ import { NestAuthUser } from '../src/lib/user/entities/user.entity';
4
+ import { NestAuthOTP } from '../src/lib/auth/entities/otp.entity';
5
+ import { getRepositoryToken } from '@nestjs/typeorm';
6
+ import { DataSource, Repository } from 'typeorm';
7
+ import { createTestApp } from './test.setup';
8
+ import { BaseSessionService } from '../src/lib/session/services/base-session.service';
9
+ import { UnauthorizedException } from '@nestjs/common';
10
+ import { RequestContext } from '../src/lib/request-context/request-context';
11
+ import { v4 as uuidv4 } from 'uuid';
12
+ import { AuthService } from '../src/lib/auth/services/auth.service';
13
+ import { OTPTypeEnum } from '../src/lib/core/interfaces/otp.interface';
14
+ import { JwtService, NestAuthIdentity } from '../src/lib/core';
15
+
16
+
17
+ jest.mock('../src/lib/request-context/request-context', () => ({
18
+ RequestContext: {
19
+ currentRequest: jest.fn(),
20
+ currentUser: jest.fn(),
21
+ currentSession: jest.fn(),
22
+ getDeviceInfo: () => ({
23
+ ipAddress: '127.0.0.1',
24
+ userAgent: 'Test Browser',
25
+ deviceName: 'Test Device',
26
+ }),
27
+ },
28
+ }));
29
+
30
+ describe('AuthService', () => {
31
+ let service: AuthService;
32
+ let jwtService: JwtService;
33
+ let userRepository: Repository<NestAuthUser>;
34
+ let otpRepository: Repository<NestAuthOTP>;
35
+ let dataSource: DataSource;
36
+ let authIdentityRepository: Repository<NestAuthIdentity>;
37
+ let sessionService: BaseSessionService;
38
+
39
+ beforeAll(async () => {
40
+ const app = await createTestApp();
41
+
42
+ service = app.get<AuthService>(AuthService);
43
+ jwtService = app.get<JwtService>(JwtService);
44
+
45
+ sessionService = app.get<BaseSessionService>(BaseSessionService);
46
+
47
+ dataSource = app.get<DataSource>(DataSource);
48
+ userRepository = dataSource.getRepository(NestAuthUser);
49
+ otpRepository = dataSource.getRepository(NestAuthOTP);
50
+ authIdentityRepository = dataSource.getRepository(NestAuthIdentity);
51
+ });
52
+
53
+ afterEach(async () => {
54
+ await dataSource.synchronize(true);
55
+ });
56
+
57
+ afterAll(async () => {
58
+ await dataSource.destroy();
59
+ });
60
+
61
+ describe('signup', () => {
62
+ it('should successfully signup with email and create session', async () => {
63
+ const signupDto = {
64
+ email: 'test@example.com',
65
+ password: 'password123',
66
+ providerName: EMAIL_AUTH_PROVIDER,
67
+ };
68
+
69
+ const result = await service.signup(signupDto);
70
+
71
+ expect(result).toHaveProperty('accessToken');
72
+ expect(result).toHaveProperty('refreshToken');
73
+
74
+ const payload = await jwtService.verifyToken(result.accessToken);
75
+ expect(payload.sessionId).toBeDefined();
76
+
77
+ // Verify session was created
78
+ const sessions = await sessionService.getSession(payload.sessionId);
79
+ expect(sessions).toBeDefined();
80
+ });
81
+
82
+ it('should successfully signup with phone', async () => {
83
+ const signupDto = {
84
+ phone: '+1234567890',
85
+ password: 'password123',
86
+ providerName: PHONE_AUTH_PROVIDER,
87
+ };
88
+
89
+ const result = await service.signup(signupDto);
90
+
91
+ expect(result).toHaveProperty('accessToken');
92
+ expect(result).toHaveProperty('refreshToken');
93
+
94
+ const payload = await jwtService.verifyToken(result.accessToken);
95
+ expect(payload.sessionId).toBeDefined();
96
+
97
+ // Verify session was created
98
+ const sessions = await sessionService.getSession(payload.sessionId);
99
+ expect(sessions).toBeDefined();
100
+ });
101
+
102
+ it('should throw BadRequestException if email already exists', async () => {
103
+ // First create a user with the email
104
+ const user = new NestAuthUser();
105
+ user.email = 'test@example.com';
106
+ await user.setPassword('password123');
107
+ await userRepository.save(user);
108
+
109
+ const authIdentity = new NestAuthIdentity();
110
+ authIdentity.provider = EMAIL_AUTH_PROVIDER;
111
+ authIdentity.providerId = user.email;
112
+ authIdentity.user = user;
113
+ await authIdentityRepository.save(authIdentity);
114
+
115
+ const signupDto = {
116
+ email: 'test@example.com',
117
+ password: 'password123',
118
+ providerName: EMAIL_AUTH_PROVIDER,
119
+ };
120
+
121
+ await expect(service.signup(signupDto)).rejects.toThrow('Email already exists');
122
+ });
123
+
124
+ it('should throw BadRequestException if phone already exists', async () => {
125
+ // First create a user with the phone
126
+ const user = new NestAuthUser();
127
+ user.phone = '+1234567890';
128
+ await user.setPassword('password123');
129
+ await userRepository.save(user);
130
+
131
+ const authIdentity = new NestAuthIdentity();
132
+ authIdentity.provider = PHONE_AUTH_PROVIDER;
133
+ authIdentity.providerId = user.phone;
134
+ authIdentity.user = user;
135
+ await authIdentityRepository.save(authIdentity);
136
+
137
+ const signupDto = {
138
+ phone: '+1234567890',
139
+ password: 'password123',
140
+ providerName: PHONE_AUTH_PROVIDER,
141
+ };
142
+
143
+ await expect(service.signup(signupDto)).rejects.toThrow('Phone number already exists in this tenant');
144
+ });
145
+ });
146
+
147
+ describe('login', () => {
148
+ it('should successfully login and create new session', async () => {
149
+ // Create test user
150
+ const user = new NestAuthUser();
151
+ user.email = 'test@example.com';
152
+ user.isVerified = true;
153
+ await user.setPassword('password123');
154
+ await userRepository.save(user);
155
+
156
+ // Create auth identity with password hash
157
+ const authIdentity = new NestAuthIdentity();
158
+ authIdentity.provider = EMAIL_AUTH_PROVIDER;
159
+ authIdentity.providerId = user.email;
160
+ authIdentity.user = user;
161
+ await authIdentityRepository.save(authIdentity);
162
+
163
+ const loginDto = {
164
+ credentials: {
165
+ email: 'test@example.com',
166
+ password: 'password123',
167
+ },
168
+ providerName: EMAIL_AUTH_PROVIDER,
169
+ };
170
+
171
+ const result = await service.login(loginDto);
172
+
173
+ expect(result).toHaveProperty('accessToken');
174
+ expect(result).toHaveProperty('refreshToken');
175
+
176
+ const payload = await jwtService.verifyToken(result.accessToken);
177
+ expect(payload.sessionId).toBeDefined();
178
+
179
+ // Verify session was created
180
+ const sessions = await sessionService.getSession(payload.sessionId);
181
+ expect(sessions).toBeDefined();
182
+ });
183
+
184
+ it('should successfully login with phone', async () => {
185
+ // First create a user
186
+ const user = new NestAuthUser();
187
+ user.phone = '+1234567890';
188
+ user.isVerified = true;
189
+ await user.setPassword('password123');
190
+ await userRepository.save(user);
191
+
192
+ // Create auth identity with password hash
193
+ const authIdentity = new NestAuthIdentity();
194
+ authIdentity.provider = PHONE_AUTH_PROVIDER;
195
+ authIdentity.providerId = user.phone;
196
+ authIdentity.user = user;
197
+ await authIdentityRepository.save(authIdentity);
198
+
199
+ const loginDto = {
200
+ credentials: {
201
+ phone: '+1234567890',
202
+ password: 'password123',
203
+ },
204
+ providerName: PHONE_AUTH_PROVIDER,
205
+ };
206
+
207
+ const result = await service.login(loginDto);
208
+
209
+ expect(result).toHaveProperty('accessToken');
210
+ expect(result).toHaveProperty('refreshToken');
211
+
212
+ const payload = await jwtService.verifyToken(result.accessToken);
213
+ expect(payload.sessionId).toBeDefined();
214
+
215
+ // Verify session was created
216
+ const sessions = await sessionService.getSession(payload.sessionId);
217
+ expect(sessions).toBeDefined();
218
+ });
219
+
220
+ it('should throw BadRequestException if email is not found', async () => {
221
+ const loginDto = {
222
+ credentials: {
223
+ email: 'test@example.com',
224
+ password: 'password123',
225
+ },
226
+ providerName: EMAIL_AUTH_PROVIDER,
227
+ };
228
+
229
+ await expect(service.login(loginDto)).rejects.toThrow('Invalid credentials');
230
+ });
231
+
232
+ it('should throw BadRequestException if phone is not found', async () => {
233
+ const loginDto = {
234
+ credentials: {
235
+ phone: '+1234567890',
236
+ password: 'password123',
237
+ },
238
+ providerName: PHONE_AUTH_PROVIDER,
239
+ };
240
+
241
+ await expect(service.login(loginDto)).rejects.toThrow('Invalid credentials');
242
+ });
243
+
244
+ it('should throw BadRequestException if password is incorrect', async () => {
245
+ // First create a user
246
+ const user = new NestAuthUser();
247
+ user.email = 'test@example.com';
248
+ user.isVerified = true;
249
+ await user.setPassword('password123');
250
+ await userRepository.save(user);
251
+
252
+ // Create auth identity
253
+ const authIdentity = new NestAuthIdentity();
254
+ authIdentity.provider = EMAIL_AUTH_PROVIDER;
255
+ authIdentity.providerId = user.email;
256
+ authIdentity.user = user;
257
+ await authIdentityRepository.save(authIdentity);
258
+
259
+ const loginDto = {
260
+ credentials: {
261
+ email: 'test@example.com',
262
+ password: 'wrongpassword',
263
+ },
264
+ providerName: EMAIL_AUTH_PROVIDER,
265
+ };
266
+
267
+ await expect(service.login(loginDto)).rejects.toThrow('Invalid credentials');
268
+ });
269
+ });
270
+
271
+ describe('forgotPassword', () => {
272
+ it('should create OTP for email password reset', async () => {
273
+ // First create a user
274
+ const user = new NestAuthUser();
275
+ user.email = 'test@example.com';
276
+ user.isVerified = true;
277
+ await user.setPassword('password123');
278
+ await userRepository.save(user);
279
+
280
+ // Create auth identity
281
+ const authIdentity = new NestAuthIdentity();
282
+ authIdentity.provider = EMAIL_AUTH_PROVIDER;
283
+ authIdentity.providerId = user.email;
284
+ authIdentity.user = user;
285
+ await authIdentityRepository.save(authIdentity);
286
+
287
+ const forgotPasswordDto = {
288
+ email: 'test@example.com',
289
+ };
290
+
291
+ const result = await service.forgotPassword(forgotPasswordDto);
292
+
293
+ expect(result).toBe(true);
294
+
295
+ // Verify OTP was created
296
+ const otp = await otpRepository.findOne({ where: { user: { id: user.id } } });
297
+ expect(otp).toBeDefined();
298
+ expect(otp.type).toBe(OTPTypeEnum.PASSWORD_RESET);
299
+ });
300
+
301
+ it('should create OTP for phone password reset', async () => {
302
+ // First create a user
303
+ const user = new NestAuthUser();
304
+ user.phone = '+1234567890';
305
+ user.isVerified = true;
306
+ await user.setPassword('password123');
307
+ await userRepository.save(user);
308
+
309
+ // Create auth identity
310
+ const authIdentity = new NestAuthIdentity();
311
+ authIdentity.provider = PHONE_AUTH_PROVIDER;
312
+ authIdentity.providerId = user.phone;
313
+ authIdentity.user = user;
314
+ await authIdentityRepository.save(authIdentity);
315
+
316
+ const forgotPasswordDto = {
317
+ phone: '+1234567890',
318
+ };
319
+
320
+ const result = await service.forgotPassword(forgotPasswordDto);
321
+
322
+ expect(result).toBe(true);
323
+
324
+ // Verify OTP was created
325
+ const otp = await otpRepository.findOne({ where: { userId: user.id } });
326
+ expect(otp).toBeDefined();
327
+ expect(otp.type).toBe(OTPTypeEnum.PASSWORD_RESET);
328
+ });
329
+ });
330
+
331
+ describe('resetPassword', () => {
332
+ it('should successfully reset password with valid email OTP', async () => {
333
+ // Create a test user
334
+ const user = new NestAuthUser();
335
+ user.email = 'test@example.com';
336
+ user.isVerified = true;
337
+ await user.setPassword('oldpassword');
338
+ await userRepository.save(user);
339
+
340
+ // Create OTP
341
+ const otp = new NestAuthOTP();
342
+ otp.user = user;
343
+ otp.code = '123456';
344
+ otp.type = OTPTypeEnum.PASSWORD_RESET;
345
+ otp.expiresAt = new Date(Date.now() + 3600000);
346
+ await otpRepository.save(otp);
347
+
348
+ const resetPasswordDto = {
349
+ email: user.email,
350
+ otp: otp.code,
351
+ newPassword: 'newpassword123',
352
+ };
353
+
354
+ const result = await service.resetPassword(resetPasswordDto);
355
+
356
+ expect(result).toBe(true);
357
+
358
+ // Verify password was changed
359
+ const updatedUser = await userRepository.findOne({ where: { id: user.id } });
360
+ expect(await updatedUser.validatePassword('newpassword123')).toBe(true);
361
+ });
362
+
363
+ it('should successfully reset password with valid phone OTP', async () => {
364
+ // Create a test user
365
+ const user = new NestAuthUser();
366
+ user.phone = '+1234567890';
367
+ user.isVerified = true;
368
+ await user.setPassword('oldpassword');
369
+ await userRepository.save(user);
370
+
371
+ // Create OTP
372
+ const otp = new NestAuthOTP();
373
+ otp.user = user;
374
+ otp.code = '123456';
375
+ otp.type = OTPTypeEnum.PASSWORD_RESET;
376
+ otp.expiresAt = new Date(Date.now() + 3600000);
377
+ await otpRepository.save(otp);
378
+
379
+ const resetPasswordDto = {
380
+ phone: user.phone,
381
+ otp: otp.code,
382
+ newPassword: 'newpassword123',
383
+ };
384
+
385
+ const result = await service.resetPassword(resetPasswordDto);
386
+
387
+ expect(result).toBe(true);
388
+
389
+ // Verify password was changed
390
+ const updatedUser = await userRepository.findOne({ where: { id: user.id } });
391
+ expect(await updatedUser.validatePassword('newpassword123')).toBe(true);
392
+ });
393
+
394
+ it('should throw BadRequestException for invalid email OTP', async () => {
395
+ // Create a test user
396
+ const user = new NestAuthUser();
397
+ user.email = 'test@example.com';
398
+ user.isVerified = true;
399
+ await user.setPassword('oldpassword');
400
+ await userRepository.save(user);
401
+
402
+ const resetPasswordDto = {
403
+ email: user.email,
404
+ otp: 'invalid',
405
+ newPassword: 'newpassword123',
406
+ };
407
+
408
+ await expect(service.resetPassword(resetPasswordDto)).rejects.toThrow('Invalid or expired OTP');
409
+ });
410
+
411
+ it('should throw BadRequestException for invalid phone OTP', async () => {
412
+ // Create a test user
413
+ const user = new NestAuthUser();
414
+ user.phone = '+1234567890';
415
+ user.isVerified = true;
416
+ await user.setPassword('oldpassword');
417
+ await userRepository.save(user);
418
+
419
+ const resetPasswordDto = {
420
+ phone: user.phone,
421
+ otp: 'invalid',
422
+ newPassword: 'newpassword123',
423
+ };
424
+
425
+ await expect(service.resetPassword(resetPasswordDto)).rejects.toThrow('Invalid or expired OTP');
426
+ });
427
+ });
428
+
429
+ describe('refreshToken', () => {
430
+ it('should generate new tokens and delete old session', async () => {
431
+ // Create test user
432
+ const user = new NestAuthUser();
433
+ user.email = 'test@example.com';
434
+ user.isVerified = true;
435
+ user.isMfaEnabled = true;
436
+ await user.setPassword('password123');
437
+ await userRepository.save(user);
438
+
439
+ const oldSession = await sessionService.createSessionFromUser(user);
440
+
441
+ const tokenPayload = {
442
+ sub: user.id,
443
+ exp: Math.floor(Date.now() / 1000) + 3600,
444
+ iat: Math.floor(Date.now() / 1000),
445
+ email: user.email,
446
+ phone: user.phone,
447
+ isVerified: user.isVerified,
448
+ isMfaEnabled: user.isMfaEnabled,
449
+ sessionId: oldSession.id,
450
+ };
451
+ const refreshToken = await jwtService.generateRefreshToken(tokenPayload);
452
+
453
+ const result = await service.refreshToken(refreshToken);
454
+
455
+ expect(result).toHaveProperty('accessToken');
456
+ expect(result).toHaveProperty('refreshToken');
457
+
458
+ // Verify old session was deleted
459
+ const deletedSession = await sessionService.getSession(oldSession.id);
460
+ expect(deletedSession).toBeNull();
461
+
462
+ // Verify new session was created
463
+ const payload = await jwtService.verifyToken(result.accessToken);
464
+ expect(payload.sessionId).toBeDefined();
465
+ const sessions = await sessionService.getSession(payload.sessionId);
466
+ expect(sessions).toBeDefined();
467
+ });
468
+
469
+ it('should throw UnauthorizedException for non-existent session', async () => {
470
+ // Create test user
471
+ const user = new NestAuthUser();
472
+ user.email = 'test@example.com';
473
+ await userRepository.save(user);
474
+
475
+ const nonExistentSessionId = uuidv4();
476
+ // Mock JWT verification
477
+ jest.spyOn(jwtService, 'verifyToken').mockResolvedValue({
478
+ sub: user.id,
479
+ sessionId: nonExistentSessionId,
480
+ });
481
+
482
+ await expect(service.refreshToken('invalid-token'))
483
+ .rejects
484
+ .toThrow(UnauthorizedException);
485
+ });
486
+ });
487
+
488
+ describe('logout', () => {
489
+ it('should delete session', async () => {
490
+ // Create test user
491
+ const user = new NestAuthUser();
492
+ user.email = 'test@example.com';
493
+ user.isVerified = true;
494
+ await user.setPassword('password123');
495
+ await userRepository.save(user);
496
+
497
+ // Create session
498
+ const session = await sessionService.createSessionFromUser(user);
499
+
500
+ // Mock RequestContext
501
+ (RequestContext.currentSession as jest.Mock).mockReturnValue(session);
502
+
503
+ const result = await service.logout();
504
+ expect(result).toBe(true);
505
+
506
+ // Verify session was deleted
507
+ const deletedSession = await sessionService.getSession(session.id);
508
+ expect(deletedSession).toBeNull();
509
+
510
+ });
511
+
512
+ it('should not throw error if session not found', async () => {
513
+ const result = await service.logout();
514
+ expect(result).toBe(true);
515
+ });
516
+ });
517
+
518
+ describe('logoutAll', () => {
519
+ it('should delete all user sessions', async () => {
520
+ // Create test user
521
+ const user = new NestAuthUser();
522
+ user.email = 'test@example.com';
523
+ user.isVerified = true;
524
+ await user.setPassword('password123');
525
+ await userRepository.save(user);
526
+
527
+ // Create multiple sessions
528
+ const sessions = [];
529
+ for (let i = 0; i < 3; i++) {
530
+ const session = await sessionService.createSessionFromUser(user);
531
+ sessions.push(session);
532
+ }
533
+
534
+ await service.logoutAll(user.id);
535
+
536
+ // Verify all sessions were deleted
537
+ const remainingSessions = await sessionService.getUserSessions(user.id);
538
+ expect(remainingSessions).toHaveLength(0);
539
+ });
540
+ });
541
+ });