@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
package/ui/README.md ADDED
@@ -0,0 +1,288 @@
1
+ # Admin Console UI - Build Guide
2
+
3
+ Beautiful Tailwind CSS admin dashboard for `@ackplus/nest-auth`
4
+
5
+ ## 🚀 Quick Start
6
+
7
+ ### 1. Install Dependencies
8
+
9
+ ```bash
10
+ cd packages/nest-auth/src/lib/admin-console/ui
11
+ npm install
12
+ ```
13
+
14
+ ### 2. Development Mode (with Hot Reload)
15
+
16
+ ```bash
17
+ npm run dev
18
+ ```
19
+
20
+ This will start the Vite dev server at `http://localhost:5173` with hot module reloading.
21
+
22
+ ### 3. Build for Production
23
+
24
+ ```bash
25
+ npm run build
26
+ ```
27
+
28
+ This will:
29
+ - Compile TypeScript
30
+ - Build React app with Vite
31
+ - Output bundled files to `../static/` folder:
32
+ - `../static/index.html` (main entry)
33
+ - `../static/assets/app.js` (bundled JS)
34
+
35
+ ## 📦 Build Output
36
+
37
+ ```plaintext
38
+ packages/nest-auth/src/lib/admin-console/static/
39
+ ├── index.html # Built HTML entry point
40
+ ├── styles.css # Existing CSS (not overwritten)
41
+ └── assets/
42
+ └── app.js # Bundled React application
43
+ ```
44
+
45
+ ## 🔧 Integration with nest-auth Package
46
+
47
+ ### Option 1: Manual Build
48
+
49
+ ```bash
50
+ # Step 1: Build UI
51
+ cd packages/nest-auth/src/lib/admin-console/ui
52
+ npm install
53
+ npm run build
54
+
55
+ # Step 2: Build nest-auth package
56
+ cd ../../../.. # back to nest-auth root
57
+ npm run build
58
+ ```
59
+
60
+ ### Option 2: Add to nest-auth Build Script
61
+
62
+ Edit `packages/nest-auth/package.json`:
63
+
64
+ ```json
65
+ {
66
+ "scripts": {
67
+ "build:ui": "cd src/lib/admin-console/ui && npm install && npm run build",
68
+ "prebuild": "npm run build:ui",
69
+ "build": "tsc && your-existing-build-command"
70
+ }
71
+ }
72
+ ```
73
+
74
+ Now `npm run build` will automatically build the UI first.
75
+
76
+ ### Option 3: Using Nx (if in Nx workspace)
77
+
78
+ Add to `packages/nest-auth/project.json`:
79
+
80
+ ```json
81
+ {
82
+ "targets": {
83
+ "build-ui": {
84
+ "executor": "nx:run-commands",
85
+ "options": {
86
+ "cwd": "packages/nest-auth/src/lib/admin-console/ui",
87
+ "commands": [
88
+ "npm install",
89
+ "npm run build"
90
+ ]
91
+ }
92
+ },
93
+ "build": {
94
+ "dependsOn": ["build-ui"],
95
+ // ... your existing build config
96
+ }
97
+ }
98
+ }
99
+ ```
100
+
101
+ ## 🛠️ Development Workflow
102
+
103
+ ### Local Development
104
+
105
+ ```bash
106
+ # Terminal 1: Run UI dev server
107
+ cd packages/nest-auth/src/lib/admin-console/ui
108
+ npm run dev
109
+
110
+ # Terminal 2: Run your NestJS backend
111
+ cd packages/nest-examples # or your app
112
+ npm run start:dev
113
+ ```
114
+
115
+ Then:
116
+ - UI dev server: <http://localhost:5173>
117
+ - Backend API: <http://localhost:3000>
118
+
119
+ ### Configuring API Base URL in Dev Mode
120
+
121
+ When running the dev server in watch mode, you can configure the API base URL using the `VITE_API_BASE_URL` environment variable. Create a `.env` file in the `ui` directory:
122
+
123
+ ```bash
124
+ # .env
125
+ VITE_API_BASE_URL=http://localhost:3000
126
+ ```
127
+
128
+ This sets the origin (protocol + host + port), and the default path `/api/auth/admin` will be appended automatically.
129
+
130
+ **Priority order:**
131
+ 1. Server-injected config (production) - highest priority
132
+ 2. `VITE_API_BASE_URL` (origin only) + default path - for dev mode
133
+ 3. Current window origin + default path (fallback)
134
+
135
+ **Note:** After creating or modifying `.env`, restart the dev server for changes to take effect.
136
+
137
+ For production testing:
138
+
139
+ ```bash
140
+ # Build UI
141
+ cd packages/nest-auth/src/lib/admin-console/ui
142
+ npm run build
143
+
144
+ # Start backend (serves built UI from static folder)
145
+ cd packages/nest-examples
146
+ npm run start:dev
147
+
148
+ # Visit: http://localhost:3000/auth/admin
149
+ ```
150
+
151
+ ## 📋 Available Scripts
152
+
153
+ ```bash
154
+ npm run dev # Start dev server with hot reload
155
+ npm run build # Build for production
156
+ npm run preview # Preview production build locally
157
+ ```
158
+
159
+ ## 🎯 What Gets Built
160
+
161
+ ### Dependencies Bundled
162
+
163
+ - React & React DOM
164
+ - React Router DOM
165
+ - Lucide React (icons)
166
+ - Recharts (charts)
167
+ - All your components and pages
168
+
169
+ ### Output Size (approximate)
170
+
171
+ - `app.js`: ~150-200KB (minified + gzipped)
172
+ - `index.html`: ~2KB
173
+ - Total: ~150-202KB
174
+
175
+ ## 🔍 Troubleshooting
176
+
177
+ ### Build Fails
178
+
179
+ ```bash
180
+ # Clear node_modules and reinstall
181
+ rm -rf node_modules package-lock.json
182
+ npm install
183
+ npm run build
184
+ ```
185
+
186
+ ### TypeScript Errors
187
+
188
+ ```bash
189
+ # Check TypeScript configuration
190
+ npx tsc --noEmit
191
+ ```
192
+
193
+ ### Port Already in Use
194
+
195
+ ```bash
196
+ # Kill process on port 5173
197
+ lsof -ti:5173 | xargs kill -9
198
+
199
+ # Or use different port
200
+ npm run dev -- --port 3001
201
+ ```
202
+
203
+ ### Build Output Not Working
204
+
205
+ Make sure the Vite config outputs to the correct location:
206
+
207
+ ```typescript
208
+ // vite.config.ts
209
+ build: {
210
+ outDir: '../static', // Must point to static folder
211
+ emptyOutDir: false, // Don't delete styles.css
212
+ }
213
+ ```
214
+
215
+ ## 🎨 Tech Stack
216
+
217
+ - **React 18** - UI library
218
+ - **TypeScript 5** - Type safety
219
+ - **Tailwind CSS 3** - Styling
220
+ - **Vite 5** - Build tool (super fast!)
221
+ - **Recharts 2** - Charts & data visualization
222
+ - **Lucide React** - Beautiful icons
223
+
224
+ ## 📁 Project Structure
225
+
226
+ ```plaintext
227
+ ui/
228
+ ├── src/
229
+ │ ├── components/ # Reusable components
230
+ │ ├── pages/ # Page components
231
+ │ ├── services/ # API service layer
232
+ │ ├── hooks/ # Custom React hooks
233
+ │ ├── types/ # TypeScript interfaces
234
+ │ ├── App.tsx # Main app
235
+ │ ├── main.tsx # Entry point
236
+ │ └── index.css # Tailwind imports
237
+ ├── package.json # Dependencies & scripts
238
+ ├── vite.config.ts # Vite configuration
239
+ ├── tailwind.config.js # Tailwind theme
240
+ ├── tsconfig.json # TypeScript config
241
+ └── index.html # HTML template
242
+ ```
243
+
244
+ ## ✨ Features
245
+
246
+ - 📊 Dashboard with statistics & charts
247
+ - 👥 User management
248
+ - 🛡️ Role & permission management
249
+ - 🏢 Multi-tenant support
250
+ - 👨‍💼 Admin management
251
+ - 📚 API documentation
252
+ - 🎨 Beautiful Tailwind UI
253
+ - 📱 Fully responsive
254
+ - ⚡ Lightning fast (Vite)
255
+
256
+ ## 🔗 How It Works
257
+
258
+ 1. **Development**: Vite dev server runs on port 5173
259
+ 2. **Build**: Compiles to `../static/` folder
260
+ 3. **Production**: NestJS serves files from `static/` folder
261
+ 4. **API**: SPA calls backend at `/auth/admin/api/*`
262
+
263
+ ## 📝 Notes
264
+
265
+ - The `styles.css` in static folder is NOT overwritten by build
266
+ - Build output goes to `../static/` relative to UI folder
267
+ - Hot reload works in dev mode for instant updates
268
+ - TypeScript ensures type safety throughout
269
+
270
+ ## 🆘 Need Help?
271
+
272
+ Check these files:
273
+ - `vite.config.ts` - Build configuration
274
+ - `tailwind.config.js` - Theme customization
275
+ - `tsconfig.json` - TypeScript settings
276
+ - `src/services/api.ts` - API client setup
277
+
278
+ ---
279
+
280
+ **Ready to build?** Run these commands:
281
+
282
+ ```bash
283
+ cd packages/nest-auth/src/lib/admin-console/ui
284
+ npm install
285
+ npm run build
286
+ ```
287
+
288
+ That's it! Your beautiful admin console is ready to use! 🎉
package/ui/index.html ADDED
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <meta
7
+ http-equiv="Content-Security-Policy"
8
+ content="script-src 'self' 'unsafe-inline'"
9
+ />
10
+
11
+ <title>Nest Auth Dashboard</title>
12
+ </head>
13
+ <body>
14
+ <main id="root"></main>
15
+ <script type="module" src="/src/main.tsx"></script>
16
+ </body>
17
+ </html>
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@nest-auth/admin-console-ui",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "build:check": "tsc && vite build",
10
+ "preview": "vite preview"
11
+ },
12
+ "dependencies": {
13
+ "@hookform/resolvers": "^5.2.2",
14
+ "lucide-react": "^0.294.0",
15
+ "react": "^18.2.0",
16
+ "react-dom": "^18.2.0",
17
+ "react-hook-form": "^7.66.0",
18
+ "react-router-dom": "^6.20.0",
19
+ "recharts": "^2.10.0",
20
+ "swagger-ui-react": "^5.30.1",
21
+ "yup": "^1.7.1"
22
+ },
23
+ "devDependencies": {
24
+ "@types/react": "^18.2.0",
25
+ "@types/react-dom": "^18.2.0",
26
+ "@vitejs/plugin-react": "^4.2.0",
27
+ "autoprefixer": "^10.4.16",
28
+ "postcss": "^8.4.32",
29
+ "tailwindcss": "^3.3.6",
30
+ "typescript": "^5.3.0",
31
+ "vite": "^5.0.0",
32
+ "vite-plugin-singlefile": "^2.3.0"
33
+ }
34
+ }
@@ -0,0 +1,6 @@
1
+ export default {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ }
package/ui/src/App.tsx ADDED
@@ -0,0 +1,245 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { HashRouter, Routes, Route, Navigate } from 'react-router-dom';
3
+ import { api } from './services/api';
4
+ import { ConfirmProvider } from './hooks/useConfirm';
5
+ import type { DashboardConfig } from './types';
6
+ import { Layout } from './components/Layout';
7
+ import { LoginPage } from './pages/LoginPage';
8
+ import { DashboardPage } from './pages/DashboardPage';
9
+ import { UsersPage } from './pages/UsersPage';
10
+ import { RolesPage } from './pages/RolesPage';
11
+ import { TenantsPage } from './pages/TenantsPage';
12
+ import { AdminsPage } from './pages/AdminsPage';
13
+ import { PermissionsPage } from './pages/PermissionsPage';
14
+ import { ApiPage } from './pages/ApiPage';
15
+
16
+ // Protected Route Wrapper
17
+ const ProtectedRoute: React.FC<{
18
+ children: React.ReactNode;
19
+ authenticated: boolean | null;
20
+ }> = ({ children, authenticated }) => {
21
+ // While checking auth, show loading
22
+ if (authenticated === null) {
23
+ return (
24
+ <div className="min-h-screen bg-gray-50 flex items-center justify-center">
25
+ <div className="text-center">
26
+ <div className="animate-spin rounded-full h-16 w-16 border-b-4 border-primary-600 mx-auto mb-4"></div>
27
+ <p className="text-gray-600 font-medium">Verifying authentication...</p>
28
+ </div>
29
+ </div>
30
+ );
31
+ }
32
+
33
+ // If not authenticated, redirect to login
34
+ if (!authenticated) {
35
+ return <Navigate to="/login" replace />;
36
+ }
37
+
38
+ // If authenticated, render children
39
+ return <>{children}</>;
40
+ };
41
+
42
+ export const App: React.FC = () => {
43
+ const [authenticated, setAuthenticated] = useState<boolean | null>(null);
44
+ const [config, setConfig] = useState<DashboardConfig | null>(null);
45
+ const [authChecked, setAuthChecked] = useState(false);
46
+ const [loginError, setLoginError] = useState<string | null>(null);
47
+
48
+ useEffect(() => {
49
+ checkAuthAndLoadConfig();
50
+ }, []);
51
+
52
+ const checkAuthAndLoadConfig = async () => {
53
+ try {
54
+ // First check authentication
55
+ await api.get('/me');
56
+ setAuthenticated(true);
57
+
58
+ // Then load config
59
+ const configData = await api.get<DashboardConfig>('/config');
60
+ setConfig(configData);
61
+ } catch (err: any) {
62
+ console.error('Auth check failed:', err);
63
+ setAuthenticated(false);
64
+
65
+ // Still load config for login page
66
+ try {
67
+ const configData = await api.get<DashboardConfig>('/config');
68
+ setConfig(configData);
69
+ } catch (configErr) {
70
+ console.error('Failed to load config:', configErr);
71
+ // Set default config
72
+ setConfig({
73
+ allowAdminManagement: false,
74
+ });
75
+ }
76
+ } finally {
77
+ setAuthChecked(true);
78
+ }
79
+ };
80
+
81
+ const handleLogin = async (credentials: any) => {
82
+ setLoginError(null);
83
+ try {
84
+ await api.post('/login', credentials);
85
+ setAuthenticated(true);
86
+ // Recheck auth after successful login
87
+ await checkAuthAndLoadConfig();
88
+ } catch (err: any) {
89
+ setAuthenticated(false);
90
+ setLoginError(err?.message || 'Login failed');
91
+ throw err;
92
+ }
93
+ };
94
+
95
+ const handleLogout = async () => {
96
+ try {
97
+ await api.post('/logout', {});
98
+ } catch (err) {
99
+ console.error('Logout failed:', err);
100
+ }
101
+ setAuthenticated(false);
102
+ };
103
+
104
+ // Show loading screen while checking auth or loading config
105
+ if (!authChecked || config === null) {
106
+ return (
107
+ <div className="min-h-screen bg-gradient-to-br from-primary-50 via-blue-50 to-purple-50 flex items-center justify-center">
108
+ <div className="text-center">
109
+ <div className="inline-flex items-center justify-center w-16 h-16 bg-primary-600 rounded-full mb-4 shadow-lg">
110
+ <svg className="w-8 h-8 text-white animate-spin" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
111
+ <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4"></circle>
112
+ <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
113
+ </svg>
114
+ </div>
115
+ <p className="text-gray-700 font-medium text-lg">Loading Nest Auth Dashboard...</p>
116
+ <p className="text-gray-500 text-sm mt-2">Verifying authentication</p>
117
+ </div>
118
+ </div>
119
+ );
120
+ }
121
+
122
+ return (
123
+ <ConfirmProvider>
124
+ <HashRouter>
125
+ <Routes>
126
+ {/* Login Route - Only accessible when NOT authenticated */}
127
+ <Route
128
+ path="/login"
129
+ element={
130
+ authenticated ? (
131
+ <Navigate to="/dashboard" replace />
132
+ ) : (
133
+ <LoginPage onLogin={handleLogin} error={loginError} />
134
+ )
135
+ }
136
+ />
137
+
138
+ {/* Protected Routes - Only accessible when authenticated */}
139
+ <Route
140
+ path="/dashboard"
141
+ element={
142
+ <ProtectedRoute authenticated={authenticated}>
143
+ <Layout config={config} onLogout={handleLogout}>
144
+ <DashboardPage />
145
+ </Layout>
146
+ </ProtectedRoute>
147
+ }
148
+ />
149
+
150
+ <Route
151
+ path="/users"
152
+ element={
153
+ <ProtectedRoute authenticated={authenticated}>
154
+ <Layout config={config} onLogout={handleLogout}>
155
+ <UsersPage />
156
+ </Layout>
157
+ </ProtectedRoute>
158
+ }
159
+ />
160
+
161
+ <Route
162
+ path="/roles"
163
+ element={
164
+ <ProtectedRoute authenticated={authenticated}>
165
+ <Layout config={config} onLogout={handleLogout}>
166
+ <RolesPage />
167
+ </Layout>
168
+ </ProtectedRoute>
169
+ }
170
+ />
171
+
172
+ <Route
173
+ path="/tenants"
174
+ element={
175
+ <ProtectedRoute authenticated={authenticated}>
176
+ <Layout config={config} onLogout={handleLogout}>
177
+ <TenantsPage />
178
+ </Layout>
179
+ </ProtectedRoute>
180
+ }
181
+ />
182
+
183
+ <Route
184
+ path="/permissions"
185
+ element={
186
+ <ProtectedRoute authenticated={authenticated}>
187
+ <Layout config={config} onLogout={handleLogout}>
188
+ <PermissionsPage />
189
+ </Layout>
190
+ </ProtectedRoute>
191
+ }
192
+ />
193
+
194
+ <Route
195
+ path="/api"
196
+ element={
197
+ <ProtectedRoute authenticated={authenticated}>
198
+ <Layout config={config} onLogout={handleLogout}>
199
+ <ApiPage />
200
+ </Layout>
201
+ </ProtectedRoute>
202
+ }
203
+ />
204
+
205
+ {config.allowAdminManagement && (
206
+ <Route
207
+ path="/admins"
208
+ element={
209
+ <ProtectedRoute authenticated={authenticated}>
210
+ <Layout config={config} onLogout={handleLogout}>
211
+ <AdminsPage />
212
+ </Layout>
213
+ </ProtectedRoute>
214
+ }
215
+ />
216
+ )}
217
+
218
+ {/* Default redirects */}
219
+ <Route
220
+ path="/"
221
+ element={
222
+ authenticated ? (
223
+ <Navigate to="/dashboard" replace />
224
+ ) : (
225
+ <Navigate to="/login" replace />
226
+ )
227
+ }
228
+ />
229
+
230
+ {/* Catch all - redirect based on auth status */}
231
+ <Route
232
+ path="*"
233
+ element={
234
+ authenticated ? (
235
+ <Navigate to="/dashboard" replace />
236
+ ) : (
237
+ <Navigate to="/login" replace />
238
+ )
239
+ }
240
+ />
241
+ </Routes>
242
+ </HashRouter>
243
+ </ConfirmProvider>
244
+ );
245
+ };
@@ -0,0 +1,59 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { useNavigate, useLocation } from 'react-router-dom';
3
+ import { api, ApiError } from '../services/api';
4
+
5
+ interface AuthGuardProps {
6
+ children: React.ReactNode;
7
+ onAuthChange?: (authenticated: boolean) => void;
8
+ }
9
+
10
+ export const AuthGuard: React.FC<AuthGuardProps> = ({ children, onAuthChange }) => {
11
+ const [checking, setChecking] = useState(true);
12
+ const [authenticated, setAuthenticated] = useState(false);
13
+ const navigate = useNavigate();
14
+ const location = useLocation();
15
+
16
+ useEffect(() => {
17
+ checkAuth();
18
+ }, []);
19
+
20
+ const checkAuth = async () => {
21
+ try {
22
+ setChecking(true);
23
+ await api.get('/me');
24
+ setAuthenticated(true);
25
+ if (onAuthChange) {
26
+ onAuthChange(true);
27
+ }
28
+ } catch (error) {
29
+ setAuthenticated(false);
30
+ if (onAuthChange) {
31
+ onAuthChange(false);
32
+ }
33
+ // Redirect to login, preserving intended destination
34
+ navigate('/login', {
35
+ replace: true,
36
+ state: { from: location.pathname }
37
+ });
38
+ } finally {
39
+ setChecking(false);
40
+ }
41
+ };
42
+
43
+ if (checking) {
44
+ return (
45
+ <div className="min-h-screen bg-gray-50 flex items-center justify-center">
46
+ <div className="text-center">
47
+ <div className="animate-spin rounded-full h-16 w-16 border-b-4 border-primary-600 mx-auto mb-4"></div>
48
+ <p className="text-gray-600 font-medium">Verifying authentication...</p>
49
+ </div>
50
+ </div>
51
+ );
52
+ }
53
+
54
+ if (!authenticated) {
55
+ return null; // Will be redirected by useEffect
56
+ }
57
+
58
+ return <>{children}</>;
59
+ };