@ackplus/nest-auth 0.1.50 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -513
- package/eslint.config.mjs +59 -0
- package/jest.config.ts +10 -0
- package/package.json +14 -44
- package/project.json +86 -0
- package/src/index.ts +30 -0
- package/src/lib/admin-console/admin-console.module.ts +62 -0
- package/src/lib/admin-console/controllers/admin-auth.controller.ts +339 -0
- package/src/lib/admin-console/controllers/admin-console.controller.ts +82 -0
- package/src/lib/admin-console/controllers/admin-permissions.controller.ts +180 -0
- package/src/lib/admin-console/controllers/admin-roles.controller.ts +89 -0
- package/src/lib/admin-console/controllers/admin-tenants.controller.ts +68 -0
- package/src/lib/admin-console/controllers/admin-users.controller.ts +379 -0
- package/src/lib/admin-console/decorators/current-admin.decorator.ts +9 -0
- package/src/lib/admin-console/dto/admin-permission.dto.ts +106 -0
- package/src/lib/admin-console/dto/admin-role.dto.ts +45 -0
- package/src/lib/admin-console/dto/admin-tenant.dto.ts +43 -0
- package/src/lib/admin-console/dto/admin-user.dto.ts +87 -0
- package/src/lib/admin-console/dto/create-dashboard-admin.dto.ts +34 -0
- package/src/lib/admin-console/dto/login.dto.ts +10 -0
- package/src/lib/admin-console/dto/reset-password.dto.ts +21 -0
- package/src/lib/admin-console/dto/setup-admin.dto.ts +23 -0
- package/src/lib/admin-console/dto/signup.dto.ts +51 -0
- package/src/lib/admin-console/entities/admin-user.entity.ts +74 -0
- package/src/lib/admin-console/guards/admin-session.guard.ts +47 -0
- package/src/lib/admin-console/services/admin-auth.service.ts +82 -0
- package/src/lib/admin-console/services/admin-console-config.service.ts +62 -0
- package/src/lib/admin-console/services/admin-session.service.ts +106 -0
- package/src/lib/admin-console/services/admin-user.service.ts +96 -0
- package/src/lib/admin-console/static/index.html +771 -0
- package/src/lib/auth/auth.module.ts +58 -0
- package/src/lib/auth/controllers/auth.controller.ts +393 -0
- package/src/lib/auth/controllers/mfa.controller.ts +200 -0
- package/src/lib/auth/dto/credentials/email-credentials.dto.ts +24 -0
- package/src/lib/auth/dto/credentials/phone-credentials.dto.ts +24 -0
- package/src/lib/auth/dto/credentials/social-credentials.dto.ts +15 -0
- package/src/lib/auth/dto/index.ts +1 -0
- package/src/lib/auth/dto/requests/change-password.request.dto.ts +34 -0
- package/src/lib/auth/dto/requests/forgot-password.request.dto.ts +30 -0
- package/src/lib/auth/dto/requests/initialize-admin.request.dto.ts +51 -0
- package/src/lib/auth/dto/requests/login.request.dto.ts +65 -0
- package/src/lib/auth/dto/requests/refresh-token.request.dto.ts +12 -0
- package/src/lib/auth/dto/requests/reset-password-with-token.request.dto.ts +22 -0
- package/src/lib/auth/dto/requests/reset-password.request.dto.ts +50 -0
- package/src/lib/auth/dto/requests/send-email-verification.request.dto.ts +12 -0
- package/src/lib/auth/dto/requests/send-mfa-code.request.dto.ts +19 -0
- package/src/lib/auth/dto/requests/signup.request.dto.ts +42 -0
- package/src/lib/auth/dto/requests/toggle-mfa.request.dto.ts +12 -0
- package/src/lib/auth/dto/requests/verify-2fa.request.dto.ts +24 -0
- package/src/lib/auth/dto/requests/verify-email.request.dto.ts +22 -0
- package/src/lib/auth/dto/requests/verify-forgot-password-otp-request-dto.ts +41 -0
- package/src/lib/auth/dto/requests/verify-totp-setup.request.dto.ts +22 -0
- package/src/lib/auth/dto/responses/auth-cookie.response.dto.ts +58 -0
- package/src/lib/auth/dto/responses/auth-success.response.dto.ts +58 -0
- package/src/lib/auth/dto/responses/auth.response.dto.ts +99 -0
- package/src/lib/auth/dto/responses/client-config.response.dto.ts +153 -0
- package/src/lib/auth/dto/responses/initialize-admin.response.dto.ts +22 -0
- package/src/lib/auth/dto/responses/mfa-code-response.dto.ts +27 -0
- package/src/lib/auth/dto/responses/mfa-status.response.dto.ts +89 -0
- package/src/lib/auth/dto/responses/verify-otp.response.dto.ts +9 -0
- package/src/lib/auth/entities/mfa-secret.entity.ts +33 -0
- package/src/lib/auth/entities/otp.entity.ts +33 -0
- package/src/lib/auth/events/{logged-out-all.event.d.ts → logged-out-all.event.ts} +6 -3
- package/src/lib/auth/events/{logged-out.event.d.ts → logged-out.event.ts} +5 -3
- package/src/lib/auth/events/{password-reset-requested.event.d.ts → password-reset-requested.event.ts} +6 -3
- package/src/lib/auth/events/{password-reset.event.d.ts → password-reset.event.ts} +6 -3
- package/src/lib/auth/events/{user-2fa-verified.event.d.ts → user-2fa-verified.event.ts} +6 -3
- package/src/lib/auth/events/{user-logged-in.event.d.ts → user-logged-in.event.ts} +7 -3
- package/src/lib/auth/events/{user-refresh-token.event.d.ts → user-refresh-token.event.ts} +6 -3
- package/src/lib/auth/events/{user-registered.event.d.ts → user-registered.event.ts} +7 -3
- package/src/lib/auth/guards/auth.guard.ts +386 -0
- package/src/lib/auth/{index.d.ts → index.ts} +28 -1
- package/src/lib/auth/interceptors/refresh-token.interceptor.ts +117 -0
- package/src/lib/auth/services/auth.service.ts +947 -0
- package/src/lib/auth/services/client-config.service.ts +157 -0
- package/src/lib/auth/services/cookie.service.ts +43 -0
- package/src/lib/auth/services/mfa.service.ts +391 -0
- package/src/lib/auth.constants.ts +63 -0
- package/src/lib/core/core.module.ts +50 -0
- package/src/lib/core/decorators/auth.decorator.ts +38 -0
- package/src/lib/core/decorators/permissions.decorator.ts +17 -0
- package/src/lib/core/decorators/public.decorator.ts +33 -0
- package/src/lib/core/decorators/role.decorator.ts +12 -0
- package/src/lib/core/decorators/skip-mfa.decorator.ts +4 -0
- package/src/lib/core/dto/message.response.dto.ts +6 -0
- package/src/lib/core/{entities.d.ts → entities.ts} +18 -1
- package/src/lib/core/{index.d.ts → index.ts} +17 -0
- package/src/lib/core/interfaces/auth-module-options.interface.ts +211 -0
- package/src/lib/core/interfaces/mfa-options.interface.ts +46 -0
- package/src/lib/core/interfaces/otp.interface.ts +6 -0
- package/src/lib/core/interfaces/session-options.interface.ts +19 -0
- package/src/lib/core/interfaces/{token-payload.interface.d.ts → token-payload.interface.ts} +4 -1
- package/src/lib/core/providers/apple-auth.provider.ts +61 -0
- package/src/lib/core/providers/base-auth.provider.ts +74 -0
- package/src/lib/core/providers/email-auth.provider.ts +71 -0
- package/src/lib/core/providers/facebook-auth.provider.ts +55 -0
- package/src/lib/core/providers/github-auth.provider.ts +79 -0
- package/src/lib/core/providers/google-auth.provider.ts +61 -0
- package/src/lib/core/providers/jwt-auth.provider.ts +50 -0
- package/src/lib/core/providers/phone-auth.provider.ts +45 -0
- package/src/lib/core/services/auth-config.service.ts +184 -0
- package/src/lib/core/services/auth-provider-registry.service.ts +93 -0
- package/src/lib/core/services/{debug-logger.service.js → debug-logger.service.ts} +92 -59
- package/src/lib/core/services/initialization.service.ts +29 -0
- package/src/lib/core/services/jwt.service.ts +137 -0
- package/src/lib/nest-auth.module.ts +152 -0
- package/src/lib/permission/entities/permission.entity.ts +56 -0
- package/src/lib/permission/index.ts +4 -0
- package/src/lib/permission/permission.module.ts +14 -0
- package/src/lib/permission/services/permission.service.ts +233 -0
- package/src/lib/request-context/index.ts +2 -0
- package/src/lib/request-context/request-context.middleware.ts +13 -0
- package/src/lib/request-context/{request-context.js → request-context.ts} +51 -27
- package/src/lib/role/entities/role.entity.ts +103 -0
- package/src/lib/role/{index.d.ts → index.ts} +2 -0
- package/src/lib/role/role.module.ts +15 -0
- package/src/lib/role/services/{role.service.js → role.service.ts} +117 -52
- package/src/lib/session/entities/session.entity.ts +54 -0
- package/src/lib/session/index.ts +20 -0
- package/src/lib/session/interfaces/session-repository.interface.ts +58 -0
- package/src/lib/session/repositories/base-session.repository.ts +74 -0
- package/src/lib/session/repositories/memory-session.repository.ts +153 -0
- package/src/lib/session/repositories/redis-session.repository.ts +171 -0
- package/src/lib/session/repositories/typeorm-session.repository.ts +86 -0
- package/src/lib/session/services/session-manager.service.ts +261 -0
- package/src/lib/session/session.module.ts +102 -0
- package/src/lib/session/utils/session.util.ts +166 -0
- package/src/lib/tenant/entities/tenant.entity.ts +40 -0
- package/src/lib/tenant/events/tenant-created.event.ts +9 -0
- package/src/lib/tenant/events/tenant-deleted.event.ts +11 -0
- package/src/lib/tenant/events/{tenant-updated.event.d.ts → tenant-updated.event.ts} +6 -3
- package/src/lib/tenant/index.ts +9 -0
- package/src/lib/tenant/services/tenant.service.ts +336 -0
- package/src/lib/tenant/tenant.module.ts +19 -0
- package/src/lib/types/express.d.ts +14 -0
- package/src/lib/user/dto/requests/update-user.dto.ts +15 -0
- package/src/lib/user/entities/access-key.entity.ts +53 -0
- package/src/lib/user/entities/identity.entity.ts +31 -0
- package/src/lib/user/entities/user.entity.ts +212 -0
- package/src/lib/user/events/{user-created.event.d.ts → user-created.event.ts} +4 -3
- package/src/lib/user/events/{user-deleted.event.d.ts → user-deleted.event.ts} +6 -3
- package/src/lib/user/events/{user-updated.event.d.ts → user-updated.event.ts} +6 -3
- package/src/lib/user/index.ts +11 -0
- package/src/lib/user/services/access-key.service.ts +145 -0
- package/src/lib/user/services/{user.service.js → user.service.ts} +199 -95
- package/src/lib/user/user.module.ts +26 -0
- package/src/lib/utils/database.utils.ts +6 -0
- package/src/lib/utils/date.util.ts +106 -0
- package/src/lib/utils/device.util.ts +111 -0
- package/src/lib/utils/index.ts +6 -0
- package/src/lib/utils/otp.ts +3 -0
- package/src/lib/utils/security.util.ts +27 -0
- package/src/lib/utils/slug.util.ts +58 -0
- package/src/types/ms.d.ts +1 -0
- package/test/access-key.service.spec.ts +204 -0
- package/test/auth.service.spec.ts +541 -0
- package/test/mfa.service.spec.ts +359 -0
- package/test/role.service.spec.ts +418 -0
- package/test/tenant.service.spec.ts +218 -0
- package/test/test.setup.ts +66 -0
- package/test/user.service.spec.ts +374 -0
- package/tsconfig.json +17 -0
- package/tsconfig.lib.json +15 -0
- package/tsconfig.spec.json +15 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/ui/.env +1 -0
- package/ui/.env.example +1 -0
- package/ui/.eslintignore +7 -0
- package/ui/README.md +288 -0
- package/ui/index.html +17 -0
- package/ui/package.json +34 -0
- package/ui/postcss.config.js +6 -0
- package/ui/src/App.tsx +245 -0
- package/ui/src/components/AuthGuard.tsx +59 -0
- package/ui/src/components/AuthProvider.tsx +76 -0
- package/ui/src/components/Button.tsx +37 -0
- package/ui/src/components/Card.tsx +37 -0
- package/ui/src/components/ErrorMessage.tsx +15 -0
- package/ui/src/components/FormDialog.tsx +61 -0
- package/ui/src/components/FormFooter.tsx +37 -0
- package/ui/src/components/Layout.tsx +112 -0
- package/ui/src/components/LoadingMessage.tsx +11 -0
- package/ui/src/components/Modal.tsx +97 -0
- package/ui/src/components/MultiSelect.tsx +145 -0
- package/ui/src/components/PageHeader.tsx +42 -0
- package/ui/src/components/PanelHeader.tsx +28 -0
- package/ui/src/components/PermissionInput.tsx +473 -0
- package/ui/src/components/SearchInput.tsx +69 -0
- package/ui/src/components/Select.tsx +51 -0
- package/ui/src/components/SwaggerUIWrapper.tsx +316 -0
- package/ui/src/components/Table.tsx +207 -0
- package/ui/src/components/Tag.tsx +9 -0
- package/ui/src/components/TagsInput.tsx +96 -0
- package/ui/src/components/admin/AdminForm.tsx +170 -0
- package/ui/src/components/admin/CreateAdminDialog.tsx +38 -0
- package/ui/src/components/auth/LoginFooter.tsx +17 -0
- package/ui/src/components/auth/LoginHeader.tsx +14 -0
- package/ui/src/components/auth/components/CodeBlock.tsx +43 -0
- package/ui/src/components/auth/components/CreateAccountCodeExamples.tsx +60 -0
- package/ui/src/components/auth/components/PasswordRequirements.tsx +16 -0
- package/ui/src/components/auth/components/PasswordStrengthIndicator.tsx +48 -0
- package/ui/src/components/auth/components/ResetPasswordCodeExamples.tsx +76 -0
- package/ui/src/components/auth/components/Tabs.tsx +32 -0
- package/ui/src/components/auth/dialogs/CreateAccountDialog.tsx +79 -0
- package/ui/src/components/auth/dialogs/ForgotPasswordDialog.tsx +79 -0
- package/ui/src/components/auth/forms/CreateAccountForm.tsx +226 -0
- package/ui/src/components/auth/forms/LoginForm.tsx +149 -0
- package/ui/src/components/auth/forms/ResetPasswordForm.tsx +202 -0
- package/ui/src/components/auth/types.ts +17 -0
- package/ui/src/components/auth/utils/security.ts +82 -0
- package/ui/src/components/auth/utils/utils.ts +25 -0
- package/ui/src/components/form/EmailField.tsx +25 -0
- package/ui/src/components/form/FormField.tsx +102 -0
- package/ui/src/components/form/FormMultiSelect.tsx +46 -0
- package/ui/src/components/form/FormSelect.tsx +60 -0
- package/ui/src/components/form/FormTagsInput.tsx +42 -0
- package/ui/src/components/form/FormTextarea.tsx +42 -0
- package/ui/src/components/form/PasswordField.tsx +93 -0
- package/ui/src/components/form/SecretKeyField.tsx +49 -0
- package/ui/src/components/permission/CreatePermissionDialog.tsx +44 -0
- package/ui/src/components/permission/EditPermissionDialog.tsx +55 -0
- package/ui/src/components/permission/PermissionForm.tsx +251 -0
- package/ui/src/components/role/CreateRoleDialog.tsx +45 -0
- package/ui/src/components/role/EditRoleDialog.tsx +55 -0
- package/ui/src/components/role/RoleDialog.tsx +252 -0
- package/ui/src/components/role/RoleForm.tsx +246 -0
- package/ui/src/components/tenant/CreateTenantDialog.tsx +41 -0
- package/ui/src/components/tenant/EditTenantDialog.tsx +52 -0
- package/ui/src/components/tenant/TenantForm.tsx +160 -0
- package/ui/src/components/user/CreateUserDialog.tsx +45 -0
- package/ui/src/components/user/UserDetailModal.tsx +815 -0
- package/ui/src/components/user/UserForm.tsx +191 -0
- package/ui/src/data/nest-auth.json +1687 -0
- package/ui/src/hooks/useApi.ts +69 -0
- package/ui/src/hooks/useAuth.ts +100 -0
- package/ui/src/hooks/useConfirm.tsx +105 -0
- package/ui/src/hooks/useFormFooter.tsx +42 -0
- package/ui/src/hooks/usePagination.ts +69 -0
- package/ui/src/index.css +59 -0
- package/ui/src/main.tsx +13 -0
- package/ui/src/pages/AdminsPage.tsx +178 -0
- package/ui/src/pages/ApiPage.tsx +89 -0
- package/ui/src/pages/DashboardPage.tsx +281 -0
- package/ui/src/pages/LoginPage.tsx +39 -0
- package/ui/src/pages/PermissionsPage.tsx +376 -0
- package/ui/src/pages/RolesPage.tsx +274 -0
- package/ui/src/pages/TenantsPage.tsx +221 -0
- package/ui/src/pages/UsersPage.tsx +387 -0
- package/ui/src/services/api.ts +115 -0
- package/ui/src/types/index.ts +136 -0
- package/ui/src/vite-env.d.ts +9 -0
- package/ui/tailwind.config.js +45 -0
- package/ui/tsconfig.json +24 -0
- package/ui/tsconfig.node.json +10 -0
- package/ui/vite.config.ts +37 -0
- package/ui/yarn.lock +3137 -0
- package/src/index.d.ts +0 -11
- package/src/index.js +0 -18
- package/src/index.js.map +0 -1
- package/src/lib/auth/auth.module.d.ts +0 -2
- package/src/lib/auth/auth.module.js +0 -54
- package/src/lib/auth/auth.module.js.map +0 -1
- package/src/lib/auth/controllers/auth.controller.d.ts +0 -29
- package/src/lib/auth/controllers/auth.controller.js +0 -206
- package/src/lib/auth/controllers/auth.controller.js.map +0 -1
- package/src/lib/auth/controllers/mfa.controller.d.ts +0 -23
- package/src/lib/auth/controllers/mfa.controller.js +0 -131
- package/src/lib/auth/controllers/mfa.controller.js.map +0 -1
- package/src/lib/auth/dto/index.d.ts +0 -0
- package/src/lib/auth/dto/index.js +0 -1
- package/src/lib/auth/dto/index.js.map +0 -1
- package/src/lib/auth/dto/requests/forgot-password.request.dto.d.ts +0 -5
- package/src/lib/auth/dto/requests/forgot-password.request.dto.js +0 -30
- package/src/lib/auth/dto/requests/forgot-password.request.dto.js.map +0 -1
- package/src/lib/auth/dto/requests/login.request.dto.d.ts +0 -6
- package/src/lib/auth/dto/requests/login.request.dto.js +0 -38
- package/src/lib/auth/dto/requests/login.request.dto.js.map +0 -1
- package/src/lib/auth/dto/requests/refresh-token.request.dto.d.ts +0 -3
- package/src/lib/auth/dto/requests/refresh-token.request.dto.js +0 -15
- package/src/lib/auth/dto/requests/refresh-token.request.dto.js.map +0 -1
- package/src/lib/auth/dto/requests/reset-password.request.dto.d.ts +0 -7
- package/src/lib/auth/dto/requests/reset-password.request.dto.js +0 -42
- package/src/lib/auth/dto/requests/reset-password.request.dto.js.map +0 -1
- package/src/lib/auth/dto/requests/send-mfa-code.request.dto.d.ts +0 -4
- package/src/lib/auth/dto/requests/send-mfa-code.request.dto.js +0 -16
- package/src/lib/auth/dto/requests/send-mfa-code.request.dto.js.map +0 -1
- package/src/lib/auth/dto/requests/signup.request.dto.d.ts +0 -7
- package/src/lib/auth/dto/requests/signup.request.dto.js +0 -37
- package/src/lib/auth/dto/requests/signup.request.dto.js.map +0 -1
- package/src/lib/auth/dto/requests/social-login.request.dto.d.ts +0 -3
- package/src/lib/auth/dto/requests/social-login.request.dto.js +0 -16
- package/src/lib/auth/dto/requests/social-login.request.dto.js.map +0 -1
- package/src/lib/auth/dto/requests/verify-2fa.request.dto.d.ts +0 -5
- package/src/lib/auth/dto/requests/verify-2fa.request.dto.js +0 -21
- package/src/lib/auth/dto/requests/verify-2fa.request.dto.js.map +0 -1
- package/src/lib/auth/dto/requests/verify-forgot-password-otp-request-dto.d.ts +0 -6
- package/src/lib/auth/dto/requests/verify-forgot-password-otp-request-dto.js +0 -35
- package/src/lib/auth/dto/requests/verify-forgot-password-otp-request-dto.js.map +0 -1
- package/src/lib/auth/dto/requests/verify-totp-setup.request.dto.d.ts +0 -4
- package/src/lib/auth/dto/requests/verify-totp-setup.request.dto.js +0 -20
- package/src/lib/auth/dto/requests/verify-totp-setup.request.dto.js.map +0 -1
- package/src/lib/auth/dto/responses/auth.response.dto.d.ts +0 -16
- package/src/lib/auth/dto/responses/auth.response.dto.js +0 -50
- package/src/lib/auth/dto/responses/auth.response.dto.js.map +0 -1
- package/src/lib/auth/entities/mfa-secret.entity.d.ts +0 -12
- package/src/lib/auth/entities/mfa-secret.entity.js +0 -50
- package/src/lib/auth/entities/mfa-secret.entity.js.map +0 -1
- package/src/lib/auth/entities/otp.entity.d.ts +0 -13
- package/src/lib/auth/entities/otp.entity.js +0 -50
- package/src/lib/auth/entities/otp.entity.js.map +0 -1
- package/src/lib/auth/events/logged-out-all.event.js +0 -10
- package/src/lib/auth/events/logged-out-all.event.js.map +0 -1
- package/src/lib/auth/events/logged-out.event.js +0 -10
- package/src/lib/auth/events/logged-out.event.js.map +0 -1
- package/src/lib/auth/events/password-reset-requested.event.js +0 -10
- package/src/lib/auth/events/password-reset-requested.event.js.map +0 -1
- package/src/lib/auth/events/password-reset.event.js +0 -10
- package/src/lib/auth/events/password-reset.event.js.map +0 -1
- package/src/lib/auth/events/user-2fa-verified.event.js +0 -10
- package/src/lib/auth/events/user-2fa-verified.event.js.map +0 -1
- package/src/lib/auth/events/user-logged-in.event.js +0 -10
- package/src/lib/auth/events/user-logged-in.event.js.map +0 -1
- package/src/lib/auth/events/user-refresh-token.event.js +0 -10
- package/src/lib/auth/events/user-refresh-token.event.js.map +0 -1
- package/src/lib/auth/events/user-registered.event.js +0 -10
- package/src/lib/auth/events/user-registered.event.js.map +0 -1
- package/src/lib/auth/guards/auth.guard.d.ts +0 -28
- package/src/lib/auth/guards/auth.guard.js +0 -304
- package/src/lib/auth/guards/auth.guard.js.map +0 -1
- package/src/lib/auth/index.js +0 -31
- package/src/lib/auth/index.js.map +0 -1
- package/src/lib/auth/services/auth.service.d.ts +0 -53
- package/src/lib/auth/services/auth.service.js +0 -522
- package/src/lib/auth/services/auth.service.js.map +0 -1
- package/src/lib/auth/services/cookie.service.d.ts +0 -9
- package/src/lib/auth/services/cookie.service.js +0 -43
- package/src/lib/auth/services/cookie.service.js.map +0 -1
- package/src/lib/auth/services/mfa.service.d.ts +0 -38
- package/src/lib/auth/services/mfa.service.js +0 -254
- package/src/lib/auth/services/mfa.service.js.map +0 -1
- package/src/lib/auth.constants.d.ts +0 -39
- package/src/lib/auth.constants.js +0 -43
- package/src/lib/auth.constants.js.map +0 -1
- package/src/lib/core/core.module.d.ts +0 -2
- package/src/lib/core/core.module.js +0 -53
- package/src/lib/core/core.module.js.map +0 -1
- package/src/lib/core/decorators/auth.decorator.d.ts +0 -1
- package/src/lib/core/decorators/auth.decorator.js +0 -8
- package/src/lib/core/decorators/auth.decorator.js.map +0 -1
- package/src/lib/core/decorators/permissions.decorator.d.ts +0 -2
- package/src/lib/core/decorators/permissions.decorator.js +0 -14
- package/src/lib/core/decorators/permissions.decorator.js.map +0 -1
- package/src/lib/core/decorators/role.decorator.d.ts +0 -3
- package/src/lib/core/decorators/role.decorator.js +0 -14
- package/src/lib/core/decorators/role.decorator.js.map +0 -1
- package/src/lib/core/decorators/skip-mfa.decorator.d.ts +0 -2
- package/src/lib/core/decorators/skip-mfa.decorator.js +0 -8
- package/src/lib/core/decorators/skip-mfa.decorator.js.map +0 -1
- package/src/lib/core/dto/message.response.dto.d.ts +0 -3
- package/src/lib/core/dto/message.response.dto.js +0 -13
- package/src/lib/core/dto/message.response.dto.js.map +0 -1
- package/src/lib/core/entities.js +0 -31
- package/src/lib/core/entities.js.map +0 -1
- package/src/lib/core/index.js +0 -27
- package/src/lib/core/index.js.map +0 -1
- package/src/lib/core/interfaces/auth-module-options.interface.d.ts +0 -62
- package/src/lib/core/interfaces/auth-module-options.interface.js +0 -3
- package/src/lib/core/interfaces/auth-module-options.interface.js.map +0 -1
- package/src/lib/core/interfaces/mfa-options.interface.d.ts +0 -25
- package/src/lib/core/interfaces/mfa-options.interface.js +0 -10
- package/src/lib/core/interfaces/mfa-options.interface.js.map +0 -1
- package/src/lib/core/interfaces/otp.interface.d.ts +0 -5
- package/src/lib/core/interfaces/otp.interface.js +0 -10
- package/src/lib/core/interfaces/otp.interface.js.map +0 -1
- package/src/lib/core/interfaces/session-options.interface.d.ts +0 -12
- package/src/lib/core/interfaces/session-options.interface.js +0 -9
- package/src/lib/core/interfaces/session-options.interface.js.map +0 -1
- package/src/lib/core/interfaces/token-payload.interface.js +0 -3
- package/src/lib/core/interfaces/token-payload.interface.js.map +0 -1
- package/src/lib/core/providers/apple-auth.provider.d.ts +0 -18
- package/src/lib/core/providers/apple-auth.provider.js +0 -57
- package/src/lib/core/providers/apple-auth.provider.js.map +0 -1
- package/src/lib/core/providers/base-auth.provider.d.ts +0 -26
- package/src/lib/core/providers/base-auth.provider.js +0 -43
- package/src/lib/core/providers/base-auth.provider.js.map +0 -1
- package/src/lib/core/providers/email-auth.provider.d.ts +0 -17
- package/src/lib/core/providers/email-auth.provider.js +0 -40
- package/src/lib/core/providers/email-auth.provider.js.map +0 -1
- package/src/lib/core/providers/facebook-auth.provider.d.ts +0 -18
- package/src/lib/core/providers/facebook-auth.provider.js +0 -56
- package/src/lib/core/providers/facebook-auth.provider.js.map +0 -1
- package/src/lib/core/providers/google-auth.provider.d.ts +0 -21
- package/src/lib/core/providers/google-auth.provider.js +0 -58
- package/src/lib/core/providers/google-auth.provider.js.map +0 -1
- package/src/lib/core/providers/jwt-auth.provider.d.ts +0 -33
- package/src/lib/core/providers/jwt-auth.provider.js +0 -50
- package/src/lib/core/providers/jwt-auth.provider.js.map +0 -1
- package/src/lib/core/providers/phone-auth.provider.d.ts +0 -18
- package/src/lib/core/providers/phone-auth.provider.js +0 -43
- package/src/lib/core/providers/phone-auth.provider.js.map +0 -1
- package/src/lib/core/services/auth-config.service.d.ts +0 -12
- package/src/lib/core/services/auth-config.service.js +0 -79
- package/src/lib/core/services/auth-config.service.js.map +0 -1
- package/src/lib/core/services/auth-provider-registry.service.d.ts +0 -24
- package/src/lib/core/services/auth-provider-registry.service.js +0 -71
- package/src/lib/core/services/auth-provider-registry.service.js.map +0 -1
- package/src/lib/core/services/debug-logger.service.d.ts +0 -38
- package/src/lib/core/services/debug-logger.service.js.map +0 -1
- package/src/lib/core/services/initialization.service.d.ts +0 -10
- package/src/lib/core/services/initialization.service.js +0 -34
- package/src/lib/core/services/initialization.service.js.map +0 -1
- package/src/lib/core/services/jwt.service.d.ts +0 -14
- package/src/lib/core/services/jwt.service.js +0 -92
- package/src/lib/core/services/jwt.service.js.map +0 -1
- package/src/lib/nest-auth.module.d.ts +0 -11
- package/src/lib/nest-auth.module.js +0 -177
- package/src/lib/nest-auth.module.js.map +0 -1
- package/src/lib/request-context/request-context.d.ts +0 -22
- package/src/lib/request-context/request-context.js.map +0 -1
- package/src/lib/request-context/request-context.middleware.d.ts +0 -4
- package/src/lib/request-context/request-context.middleware.js +0 -16
- package/src/lib/request-context/request-context.middleware.js.map +0 -1
- package/src/lib/role/entities/role.entity.d.ts +0 -20
- package/src/lib/role/entities/role.entity.js +0 -110
- package/src/lib/role/entities/role.entity.js.map +0 -1
- package/src/lib/role/index.js +0 -5
- package/src/lib/role/index.js.map +0 -1
- package/src/lib/role/role.module.d.ts +0 -2
- package/src/lib/role/role.module.js +0 -23
- package/src/lib/role/role.module.js.map +0 -1
- package/src/lib/role/services/role.service.d.ts +0 -20
- package/src/lib/role/services/role.service.js.map +0 -1
- package/src/lib/session/entities/session.entity.d.ts +0 -16
- package/src/lib/session/entities/session.entity.js +0 -63
- package/src/lib/session/entities/session.entity.js.map +0 -1
- package/src/lib/session/index.d.ts +0 -3
- package/src/lib/session/index.js +0 -7
- package/src/lib/session/index.js.map +0 -1
- package/src/lib/session/services/base-session.service.d.ts +0 -23
- package/src/lib/session/services/base-session.service.js +0 -64
- package/src/lib/session/services/base-session.service.js.map +0 -1
- package/src/lib/session/services/database-session.service.d.ts +0 -17
- package/src/lib/session/services/database-session.service.js +0 -51
- package/src/lib/session/services/database-session.service.js.map +0 -1
- package/src/lib/session/services/redis-session.service.d.ts +0 -20
- package/src/lib/session/services/redis-session.service.js +0 -117
- package/src/lib/session/services/redis-session.service.js.map +0 -1
- package/src/lib/session/session.module.d.ts +0 -2
- package/src/lib/session/session.module.js +0 -33
- package/src/lib/session/session.module.js.map +0 -1
- package/src/lib/tenant/entities/tenant.entity.d.ts +0 -10
- package/src/lib/tenant/entities/tenant.entity.js +0 -44
- package/src/lib/tenant/entities/tenant.entity.js.map +0 -1
- package/src/lib/tenant/events/tenant-created.event.d.ts +0 -8
- package/src/lib/tenant/events/tenant-created.event.js +0 -10
- package/src/lib/tenant/events/tenant-created.event.js.map +0 -1
- package/src/lib/tenant/events/tenant-deleted.event.d.ts +0 -8
- package/src/lib/tenant/events/tenant-deleted.event.js +0 -10
- package/src/lib/tenant/events/tenant-deleted.event.js.map +0 -1
- package/src/lib/tenant/events/tenant-updated.event.js +0 -10
- package/src/lib/tenant/events/tenant-updated.event.js.map +0 -1
- package/src/lib/tenant/index.d.ts +0 -1
- package/src/lib/tenant/index.js +0 -5
- package/src/lib/tenant/index.js.map +0 -1
- package/src/lib/tenant/services/tenant.service.d.ts +0 -26
- package/src/lib/tenant/services/tenant.service.js +0 -200
- package/src/lib/tenant/services/tenant.service.js.map +0 -1
- package/src/lib/tenant/tenant.module.d.ts +0 -2
- package/src/lib/tenant/tenant.module.js +0 -27
- package/src/lib/tenant/tenant.module.js.map +0 -1
- package/src/lib/user/dto/requests/update-user.dto.d.ts +0 -5
- package/src/lib/user/dto/requests/update-user.dto.js +0 -24
- package/src/lib/user/dto/requests/update-user.dto.js.map +0 -1
- package/src/lib/user/entities/access-key.entity.d.ts +0 -16
- package/src/lib/user/entities/access-key.entity.js +0 -63
- package/src/lib/user/entities/access-key.entity.js.map +0 -1
- package/src/lib/user/entities/identity.entity.d.ts +0 -12
- package/src/lib/user/entities/identity.entity.js +0 -47
- package/src/lib/user/entities/identity.entity.js.map +0 -1
- package/src/lib/user/entities/user.entity.d.ts +0 -39
- package/src/lib/user/entities/user.entity.js +0 -201
- package/src/lib/user/entities/user.entity.js.map +0 -1
- package/src/lib/user/events/user-created.event.js +0 -10
- package/src/lib/user/events/user-created.event.js.map +0 -1
- package/src/lib/user/events/user-deleted.event.js +0 -10
- package/src/lib/user/events/user-deleted.event.js.map +0 -1
- package/src/lib/user/events/user-updated.event.js +0 -10
- package/src/lib/user/events/user-updated.event.js.map +0 -1
- package/src/lib/user/index.d.ts +0 -3
- package/src/lib/user/index.js +0 -7
- package/src/lib/user/index.js.map +0 -1
- package/src/lib/user/services/access-key.service.d.ts +0 -19
- package/src/lib/user/services/access-key.service.js +0 -119
- package/src/lib/user/services/access-key.service.js.map +0 -1
- package/src/lib/user/services/user.service.d.ts +0 -24
- package/src/lib/user/services/user.service.js.map +0 -1
- package/src/lib/user/user.module.d.ts +0 -2
- package/src/lib/user/user.module.js +0 -34
- package/src/lib/user/user.module.js.map +0 -1
- package/src/lib/utils/database.utils.d.ts +0 -2
- package/src/lib/utils/database.utils.js +0 -8
- package/src/lib/utils/database.utils.js.map +0 -1
- package/src/lib/utils/otp.d.ts +0 -1
- package/src/lib/utils/otp.js +0 -7
- 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>
|
package/ui/package.json
ADDED
|
@@ -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
|
+
}
|
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
|
+
};
|