@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,166 @@
1
+ import { NestAuthSession } from '../entities/session.entity';
2
+ import { SessionPayload } from '../../core/interfaces/token-payload.interface';
3
+ import ms from 'ms';
4
+
5
+ /**
6
+ * Session utility functions
7
+ */
8
+ export class SessionUtil {
9
+ /**
10
+ * Extract session metadata (device, location, etc.)
11
+ */
12
+ static extractMetadata(session: NestAuthSession): {
13
+ device: string;
14
+ ip: string;
15
+ location?: string;
16
+ browser?: string;
17
+ os?: string;
18
+ } {
19
+ return {
20
+ device: session.deviceName || 'Unknown Device',
21
+ ip: session.ipAddress || 'Unknown IP',
22
+ // Can be extended with geo-location, browser detection, etc.
23
+ };
24
+ }
25
+
26
+ /**
27
+ * Calculate remaining session time
28
+ */
29
+ static getRemainingTime(session: NestAuthSession): {
30
+ milliseconds: number;
31
+ seconds: number;
32
+ minutes: number;
33
+ hours: number;
34
+ formatted: string;
35
+ } {
36
+ if (!session.expiresAt) {
37
+ return {
38
+ milliseconds: 0,
39
+ seconds: 0,
40
+ minutes: 0,
41
+ hours: 0,
42
+ formatted: 'Never',
43
+ };
44
+ }
45
+
46
+ const now = Date.now();
47
+ const expiresAt = new Date(session.expiresAt).getTime();
48
+ const remaining = Math.max(0, expiresAt - now);
49
+
50
+ const seconds = Math.floor(remaining / 1000);
51
+ const minutes = Math.floor(seconds / 60);
52
+ const hours = Math.floor(minutes / 60);
53
+
54
+ return {
55
+ milliseconds: remaining,
56
+ seconds,
57
+ minutes,
58
+ hours,
59
+ formatted: ms(remaining, { long: true }),
60
+ };
61
+ }
62
+
63
+ /**
64
+ * Check if session is about to expire (within threshold)
65
+ */
66
+ static isExpiringSoon(session: NestAuthSession, thresholdMs: number = 5 * 60 * 1000): boolean {
67
+ const remaining = this.getRemainingTime(session);
68
+ return remaining.milliseconds > 0 && remaining.milliseconds < thresholdMs;
69
+ }
70
+
71
+ /**
72
+ * Check if session is expired
73
+ */
74
+ static isExpired(session: NestAuthSession): boolean {
75
+ if (!session.expiresAt) return false;
76
+ return new Date() > new Date(session.expiresAt);
77
+ }
78
+
79
+ /**
80
+ * Check if session is active (not expired)
81
+ */
82
+ static isActive(session: NestAuthSession): boolean {
83
+ return !this.isExpired(session);
84
+ }
85
+
86
+ /**
87
+ * Format session for display
88
+ */
89
+ static formatForDisplay(session: NestAuthSession): {
90
+ id: string;
91
+ device: string;
92
+ ipAddress: string;
93
+ lastActive: string;
94
+ expiresAt: string;
95
+ isActive: boolean;
96
+ isCurrent?: boolean;
97
+ } {
98
+ return {
99
+ id: session.id,
100
+ device: session.deviceName || 'Unknown',
101
+ ipAddress: session.ipAddress || 'Unknown',
102
+ lastActive: session.lastActive
103
+ ? new Date(session.lastActive).toLocaleString()
104
+ : 'Unknown',
105
+ expiresAt: session.expiresAt
106
+ ? new Date(session.expiresAt).toLocaleString()
107
+ : 'Never',
108
+ isActive: this.isActive(session),
109
+ };
110
+ }
111
+
112
+ /**
113
+ * Sanitize session data (remove sensitive information)
114
+ */
115
+ static sanitize(session: NestAuthSession): Partial<NestAuthSession> {
116
+ const { refreshToken, data, ...sanitized } = session;
117
+ return sanitized;
118
+ }
119
+
120
+ /**
121
+ * Compare two sessions
122
+ */
123
+ static isSameDevice(session1: NestAuthSession, session2: NestAuthSession): boolean {
124
+ return (
125
+ session1.deviceName === session2.deviceName &&
126
+ session1.userAgent === session2.userAgent &&
127
+ session1.ipAddress === session2.ipAddress
128
+ );
129
+ }
130
+
131
+ /**
132
+ * Get session age
133
+ */
134
+ static getAge(session: NestAuthSession): {
135
+ milliseconds: number;
136
+ formatted: string;
137
+ } {
138
+ if (!session.createdAt) {
139
+ return { milliseconds: 0, formatted: 'Unknown' };
140
+ }
141
+
142
+ const age = Date.now() - new Date(session.createdAt).getTime();
143
+ return {
144
+ milliseconds: age,
145
+ formatted: ms(age, { long: true }),
146
+ };
147
+ }
148
+
149
+ /**
150
+ * Get idle time (time since last activity)
151
+ */
152
+ static getIdleTime(session: NestAuthSession): {
153
+ milliseconds: number;
154
+ formatted: string;
155
+ } {
156
+ if (!session.lastActive) {
157
+ return { milliseconds: 0, formatted: 'Unknown' };
158
+ }
159
+
160
+ const idle = Date.now() - new Date(session.lastActive).getTime();
161
+ return {
162
+ milliseconds: idle,
163
+ formatted: ms(idle, { long: true }),
164
+ };
165
+ }
166
+ }
@@ -0,0 +1,40 @@
1
+ import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from "typeorm";
2
+
3
+ @Entity('nest_auth_tenants')
4
+ export class NestAuthTenant {
5
+ @PrimaryGeneratedColumn('uuid')
6
+ id: string;
7
+
8
+ @Column()
9
+ name: string;
10
+
11
+ /**
12
+ * Unique slug/identifier for the tenant
13
+ * Format: lowercase, letters, numbers, hyphens, underscores only
14
+ * Examples: 'my-app', 'acme_corp', 'tenant123'
15
+ */
16
+ @Column({ unique: true, nullable: true })
17
+ slug: string;
18
+
19
+ /**
20
+ * @deprecated Use 'slug' instead. Will be removed in v2.0.0
21
+ * Legacy domain field - kept for backward compatibility
22
+ */
23
+ @Column({ unique: true, nullable: true })
24
+ domain: string;
25
+
26
+ @Column({ nullable: true })
27
+ description: string;
28
+
29
+ @Column({ type: 'simple-json', nullable: true, default: '{}' })
30
+ metadata: Record<string, any>;
31
+
32
+ @Column({ default: true })
33
+ isActive: boolean;
34
+
35
+ @CreateDateColumn()
36
+ createdAt: Date;
37
+
38
+ @UpdateDateColumn()
39
+ updatedAt: Date;
40
+ }
@@ -0,0 +1,9 @@
1
+ import { NestAuthTenant } from "../entities/tenant.entity";
2
+
3
+ export interface TenantCreatedEventPayload {
4
+ tenant: NestAuthTenant;
5
+ }
6
+
7
+ export class TenantCreatedEvent {
8
+ constructor(public readonly payload: TenantCreatedEventPayload) { }
9
+ }
@@ -0,0 +1,11 @@
1
+ import { NestAuthTenant } from "../entities/tenant.entity";
2
+
3
+ export interface TenantDeletedEventPayload {
4
+ tenant: NestAuthTenant;
5
+ }
6
+
7
+ export class TenantDeletedEvent {
8
+ constructor(
9
+ public readonly payload: TenantDeletedEventPayload,
10
+ ) { }
11
+ }
@@ -1,9 +1,12 @@
1
1
  import { NestAuthTenant } from "../entities/tenant.entity";
2
+
2
3
  export interface TenantUpdatedEventPayload {
3
4
  tenant: NestAuthTenant;
4
5
  updatedFields: string[];
5
6
  }
6
- export declare class TenantUpdatedEvent {
7
- readonly payload: TenantUpdatedEventPayload;
8
- constructor(payload: TenantUpdatedEventPayload);
7
+
8
+ export class TenantUpdatedEvent {
9
+ constructor(
10
+ public readonly payload: TenantUpdatedEventPayload,
11
+ ) { }
9
12
  }
@@ -0,0 +1,9 @@
1
+ export * from './tenant.module';
2
+ export * from './services/tenant.service';
3
+ export * from './events/tenant-created.event';
4
+ export * from './events/tenant-deleted.event';
5
+ export * from './events/tenant-updated.event';
6
+ export * from './entities/tenant.entity';
7
+
8
+ // Re-export slug utilities for convenience
9
+ export { isValidSlug, toSlug } from '../utils/slug.util';
@@ -0,0 +1,336 @@
1
+ import { Injectable, NotFoundException, BadRequestException, ConflictException } from '@nestjs/common';
2
+ import { InjectRepository } from '@nestjs/typeorm';
3
+ import { FindManyOptions, FindOneOptions, Repository } from 'typeorm';
4
+ import { NestAuthTenant } from '../entities/tenant.entity';
5
+ import { EventEmitter2 } from '@nestjs/event-emitter';
6
+ import { TenantCreatedEvent } from '../events/tenant-created.event';
7
+ import { TenantUpdatedEvent } from '../events/tenant-updated.event';
8
+ import { TenantDeletedEvent } from '../events/tenant-deleted.event';
9
+ import { NestAuthEvents } from '../../auth.constants';
10
+ import { AuthConfigService } from '../../core/services/auth-config.service';
11
+ import { DebugLoggerService } from '../../core/services/debug-logger.service';
12
+ import { isValidSlug, toSlug } from '../../utils/slug.util';
13
+
14
+ @Injectable()
15
+ export class TenantService {
16
+
17
+ private defaultTenant: NestAuthTenant | null = null;
18
+
19
+ constructor(
20
+ @InjectRepository(NestAuthTenant)
21
+ private tenantRepository: Repository<NestAuthTenant>,
22
+ private eventEmitter: EventEmitter2,
23
+ private authConfig: AuthConfigService,
24
+ private debugLogger: DebugLoggerService
25
+ ) { }
26
+
27
+ async createTenant(data: Partial<NestAuthTenant>): Promise<NestAuthTenant> {
28
+ // Use slug if provided, fallback to domain for backward compatibility
29
+ const identifier = data.slug || data.domain;
30
+ this.debugLogger.logTenantOperation('createTenant', undefined, { slug: data.slug, domain: data.domain, name: data.name });
31
+
32
+ // Validate slug format if provided
33
+ if (data.slug && !isValidSlug(data.slug)) {
34
+ throw new BadRequestException({
35
+ message: `Invalid slug format. Slug must be lowercase with only letters, numbers, hyphens (-) and underscores (_). Got: '${data.slug}'`,
36
+ code: 'INVALID_SLUG_FORMAT'
37
+ });
38
+ }
39
+
40
+ // Check for existing tenant with same slug or domain
41
+ this.debugLogger.debug('Checking for existing tenant', 'TenantService', { slug: data.slug, domain: data.domain });
42
+
43
+ let existingTenant: NestAuthTenant | null = null;
44
+ if (data.slug) {
45
+ existingTenant = await this.getTenantBySlug(data.slug);
46
+ } else if (data.domain) {
47
+ existingTenant = await this.getTenantByDomain(data.domain);
48
+ }
49
+
50
+ if (existingTenant) {
51
+ const identifier = data.slug || data.domain;
52
+ this.debugLogger.warn('Tenant already exists', 'TenantService', { identifier, existingTenantId: existingTenant.id });
53
+ throw new ConflictException({
54
+ message: `Tenant with ${data.slug ? 'slug' : 'domain'} '${identifier}' already exists`,
55
+ code: 'TENANT_ALREADY_EXISTS'
56
+ });
57
+ }
58
+
59
+ const tenant = this.tenantRepository.create(data);
60
+ await this.tenantRepository.save(tenant);
61
+
62
+ // Emit tenant created event
63
+ await this.eventEmitter.emitAsync(
64
+ NestAuthEvents.TENANT_CREATED,
65
+ new TenantCreatedEvent({
66
+ tenant
67
+ })
68
+ );
69
+
70
+ return tenant;
71
+ }
72
+
73
+ async getTenantById(id: string, options?: FindOneOptions<NestAuthTenant>): Promise<NestAuthTenant> {
74
+ if (!id) {
75
+ return null;
76
+ }
77
+
78
+ const tenant = await this.tenantRepository.findOne({
79
+ ...(options ? options : {}),
80
+ where: { id }
81
+ });
82
+
83
+ if (!tenant) {
84
+ return null;
85
+ }
86
+ return tenant;
87
+ }
88
+
89
+ /**
90
+ * Get tenant by slug (recommended)
91
+ */
92
+ async getTenantBySlug(slug: string, options?: FindOneOptions<NestAuthTenant>): Promise<NestAuthTenant> {
93
+ if (!slug) {
94
+ return null;
95
+ }
96
+
97
+ const tenant = await this.tenantRepository.findOne({
98
+ ...(options ? options : {}),
99
+ where: { slug }
100
+ });
101
+
102
+ return tenant;
103
+ }
104
+
105
+ /**
106
+ * @deprecated Use getTenantBySlug instead. Will be removed in v2.0.0
107
+ * Get tenant by domain (legacy method)
108
+ */
109
+ async getTenantByDomain(domain: string, options?: FindOneOptions<NestAuthTenant>): Promise<NestAuthTenant> {
110
+ if (!domain) {
111
+ return null;
112
+ }
113
+
114
+ const tenant = await this.tenantRepository.findOne({
115
+ ...(options ? options : {}),
116
+ where: { domain }
117
+ });
118
+
119
+ return tenant;
120
+ }
121
+
122
+ async getTenants(options?: FindManyOptions<NestAuthTenant>): Promise<NestAuthTenant[]> {
123
+ return this.tenantRepository.find(options);
124
+ }
125
+
126
+ async updateTenant(id: string, data: Partial<NestAuthTenant>): Promise<NestAuthTenant> {
127
+ const tenant = await this.getTenantById(id);
128
+
129
+ if (!tenant) {
130
+ throw new NotFoundException({
131
+ message: `Tenant with ID ${id} not found`,
132
+ code: 'TENANT_NOT_FOUND'
133
+ });
134
+ }
135
+
136
+ // Validate slug format if being changed
137
+ if (data.slug && !isValidSlug(data.slug)) {
138
+ throw new BadRequestException({
139
+ message: `Invalid slug format. Slug must be lowercase with only letters, numbers, hyphens (-) and underscores (_). Got: '${data.slug}'`,
140
+ code: 'INVALID_SLUG_FORMAT'
141
+ });
142
+ }
143
+
144
+ // If slug is being changed, check for conflicts
145
+ if (data.slug && data.slug !== tenant.slug) {
146
+ const existingTenant = await this.getTenantBySlug(data.slug);
147
+
148
+ if (existingTenant && existingTenant.id !== tenant.id) {
149
+ throw new ConflictException({
150
+ message: `Tenant with slug '${data.slug}' already exists`,
151
+ code: 'TENANT_ALREADY_EXISTS'
152
+ });
153
+ }
154
+ }
155
+
156
+ // If domain is being changed, check for conflicts (legacy support)
157
+ if (data.domain && data.domain !== tenant.domain) {
158
+ const existingTenant = await this.getTenantByDomain(data.domain);
159
+
160
+ if (existingTenant && existingTenant.id !== tenant.id) {
161
+ throw new ConflictException({
162
+ message: `Tenant with domain '${data.domain}' already exists`,
163
+ code: 'TENANT_ALREADY_EXISTS'
164
+ });
165
+ }
166
+ }
167
+
168
+ Object.assign(tenant, data);
169
+ const updatedTenant = await this.tenantRepository.save(tenant);
170
+
171
+ // Emit tenant updated event
172
+ await this.eventEmitter.emitAsync(
173
+ NestAuthEvents.TENANT_UPDATED,
174
+ new TenantUpdatedEvent({
175
+ tenant: updatedTenant,
176
+ updatedFields: Object.keys(data)
177
+ })
178
+ );
179
+
180
+ return updatedTenant;
181
+ }
182
+
183
+ async deleteTenant(id: string): Promise<void> {
184
+ const tenant = await this.getTenantById(id);
185
+
186
+ if (!tenant) {
187
+ throw new NotFoundException({
188
+ message: `Tenant with ID ${id} not found`,
189
+ code: 'TENANT_NOT_FOUND'
190
+ });
191
+ }
192
+
193
+ // Emit tenant deleted event before deletion
194
+ await this.eventEmitter.emitAsync(
195
+ NestAuthEvents.TENANT_DELETED,
196
+ new TenantDeletedEvent({
197
+ tenant
198
+ })
199
+ );
200
+
201
+ await this.tenantRepository.remove(tenant);
202
+ }
203
+
204
+ async updateTenantStatus(id: string, isActive: boolean): Promise<NestAuthTenant> {
205
+ const tenant = await this.getTenantById(id);
206
+
207
+ if (!tenant) {
208
+ throw new NotFoundException({
209
+ message: `Tenant with ID ${id} not found`,
210
+ code: 'TENANT_NOT_FOUND'
211
+ });
212
+ }
213
+
214
+ tenant.isActive = isActive;
215
+ const updatedTenant = await this.tenantRepository.save(tenant);
216
+ return updatedTenant;
217
+ }
218
+
219
+ async updateTenantMetadata(id: string, metadata: Record<string, any>): Promise<NestAuthTenant> {
220
+ const tenant = await this.getTenantById(id);
221
+
222
+ if (!tenant) {
223
+ throw new NotFoundException({
224
+ message: `Tenant with ID ${id} not found`,
225
+ code: 'TENANT_NOT_FOUND'
226
+ });
227
+ }
228
+
229
+ tenant.metadata = {
230
+ ...tenant.metadata,
231
+ ...metadata
232
+ };
233
+
234
+ const updatedTenant = await this.tenantRepository.save(tenant);
235
+ return updatedTenant;
236
+ }
237
+
238
+ async initializeDefaultTenant(): Promise<NestAuthTenant | null> {
239
+ const config = this.authConfig.getConfig();
240
+
241
+ if (!config.defaultTenant) {
242
+ return null;
243
+ }
244
+
245
+ // Support both slug and domain for backward compatibility
246
+ // Prefer slug over domain
247
+ const identifier = config.defaultTenant.slug || config.defaultTenant.domain;
248
+
249
+ if (!identifier) {
250
+ throw new BadRequestException({
251
+ message: 'defaultTenant must have either "slug" or "domain" field',
252
+ code: 'MISSING_TENANT_IDENTIFIER'
253
+ });
254
+ }
255
+
256
+ // Validate slug format if provided
257
+ if (config.defaultTenant.slug && !isValidSlug(config.defaultTenant.slug)) {
258
+ throw new BadRequestException({
259
+ message: `Invalid slug format in defaultTenant. Slug must be lowercase with only letters, numbers, hyphens (-) and underscores (_). Got: '${config.defaultTenant.slug}'`,
260
+ code: 'INVALID_SLUG_FORMAT'
261
+ });
262
+ }
263
+
264
+ // Check if default tenant already exists
265
+ let defaultTenant: NestAuthTenant | null = null;
266
+
267
+ if (config.defaultTenant.slug) {
268
+ defaultTenant = await this.getTenantBySlug(config.defaultTenant.slug);
269
+ } else if (config.defaultTenant.domain) {
270
+ defaultTenant = await this.getTenantByDomain(config.defaultTenant.domain);
271
+ }
272
+
273
+ if (!defaultTenant) {
274
+ // Create the default tenant
275
+ try {
276
+ defaultTenant = await this.createTenant({
277
+ name: config.defaultTenant.name,
278
+ slug: config.defaultTenant.slug || null,
279
+ domain: config.defaultTenant.domain || null, // Legacy support
280
+ description: config.defaultTenant.description || 'Default tenant',
281
+ metadata: config.defaultTenant.metadata || {},
282
+ isActive: true
283
+ });
284
+ } catch (error) {
285
+ // If tenant already exists, try to find it
286
+ if (error.code === 'TENANT_ALREADY_EXISTS') {
287
+ if (config.defaultTenant.slug) {
288
+ defaultTenant = await this.getTenantBySlug(config.defaultTenant.slug);
289
+ } else if (config.defaultTenant.domain) {
290
+ defaultTenant = await this.getTenantByDomain(config.defaultTenant.domain);
291
+ }
292
+ }
293
+
294
+ if (!defaultTenant) {
295
+ throw error;
296
+ }
297
+ }
298
+ }
299
+
300
+ this.defaultTenant = defaultTenant;
301
+ return defaultTenant;
302
+ }
303
+
304
+ getDefaultTenant(): NestAuthTenant | null {
305
+ return this.defaultTenant;
306
+ }
307
+
308
+ getDefaultTenantId(): string | null {
309
+ return this.defaultTenant?.id || null;
310
+ }
311
+
312
+ async getOrCreateDefaultTenant(): Promise<NestAuthTenant | null> {
313
+ if (this.defaultTenant) {
314
+ return this.defaultTenant;
315
+ }
316
+
317
+ return await this.initializeDefaultTenant();
318
+ }
319
+
320
+ async resolveTenantId(providedTenantId?: string | null): Promise<string | null> {
321
+ this.debugLogger.logTenantOperation('resolveTenantId', providedTenantId, { providedTenantId });
322
+
323
+ // If tenant ID is explicitly provided, use it
324
+ if (providedTenantId) {
325
+ this.debugLogger.debug('Using provided tenant ID', 'TenantService', { tenantId: providedTenantId });
326
+ return providedTenantId;
327
+ }
328
+
329
+ // If no tenant ID provided, try to get default tenant
330
+ const defaultTenant = await this.getOrCreateDefaultTenant();
331
+ const resolvedTenantId = defaultTenant?.id || null;
332
+ this.debugLogger.debug('Resolved tenant ID', 'TenantService', { resolvedTenantId, hasDefaultTenant: !!defaultTenant });
333
+ return resolvedTenantId;
334
+ }
335
+
336
+ }
@@ -0,0 +1,19 @@
1
+ import { Module } from '@nestjs/common';
2
+ import { TypeOrmModule } from '@nestjs/typeorm';
3
+ import { TenantService } from './services/tenant.service';
4
+ import { NestAuthTenant } from './entities/tenant.entity';
5
+ import { EventEmitterModule } from '@nestjs/event-emitter';
6
+
7
+ @Module({
8
+ imports: [
9
+ EventEmitterModule,
10
+ TypeOrmModule.forFeature([NestAuthTenant]),
11
+ ],
12
+ providers: [
13
+ TenantService,
14
+ ],
15
+ exports: [
16
+ TenantService,
17
+ ],
18
+ })
19
+ export class TenantModule { }
@@ -0,0 +1,14 @@
1
+ import { JWTTokenPayload, SessionPayload } from '../interfaces/token-payload.interface';
2
+
3
+ declare global {
4
+ namespace Express {
5
+ interface Request {
6
+ user?: JWTTokenPayload;
7
+ session?: SessionPayload;
8
+ newTokens?: {
9
+ accessToken: string;
10
+ refreshToken: string;
11
+ };
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,15 @@
1
+ import { IsString, IsOptional } from 'class-validator';
2
+
3
+ export class UpdateUserDto {
4
+ @IsString()
5
+ @IsOptional()
6
+ firstName?: string;
7
+
8
+ @IsString()
9
+ @IsOptional()
10
+ lastName?: string;
11
+
12
+ @IsString()
13
+ @IsOptional()
14
+ displayName?: string;
15
+ }
@@ -0,0 +1,53 @@
1
+ import {
2
+ Entity,
3
+ PrimaryGeneratedColumn,
4
+ Column,
5
+ CreateDateColumn,
6
+ UpdateDateColumn,
7
+ ManyToOne,
8
+ BaseEntity,
9
+ RelationId,
10
+ JoinColumn
11
+ } from "typeorm";
12
+ import { NestAuthUser } from "./user.entity";
13
+
14
+ @Entity('nest_auth_access_keys')
15
+ export class NestAuthAccessKey extends BaseEntity {
16
+ @PrimaryGeneratedColumn('uuid')
17
+ id: string;
18
+
19
+ @Column()
20
+ name: string;
21
+
22
+ @Column({ unique: true })
23
+ publicKey: string;
24
+
25
+ @Column()
26
+ privateKey: string;
27
+
28
+ @Column({ nullable: true })
29
+ description?: string;
30
+
31
+ @Column({ default: true })
32
+ isActive: boolean;
33
+
34
+ @Column({ nullable: true })
35
+ expiresAt?: Date;
36
+
37
+ @Column({ nullable: true })
38
+ lastUsedAt?: Date;
39
+
40
+ @Column()
41
+ @RelationId((accessKey: NestAuthAccessKey) => accessKey.user)
42
+ userId: string;
43
+
44
+ @ManyToOne(() => NestAuthUser, { onDelete: 'CASCADE' })
45
+ @JoinColumn({ name: 'userId' })
46
+ user: NestAuthUser;
47
+
48
+ @CreateDateColumn()
49
+ createdAt: Date;
50
+
51
+ @UpdateDateColumn()
52
+ updatedAt: Date;
53
+ }