@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
|
@@ -1,43 +1,59 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
async createRole(
|
|
1
|
+
import { Injectable, NotFoundException, BadRequestException, ConflictException } from '@nestjs/common';
|
|
2
|
+
import { InjectRepository } from '@nestjs/typeorm';
|
|
3
|
+
import { FindManyOptions, FindOneOptions, IsNull, Repository } from 'typeorm';
|
|
4
|
+
import { NestAuthRole } from '../entities/role.entity';
|
|
5
|
+
import { TenantService } from '../../tenant';
|
|
6
|
+
|
|
7
|
+
@Injectable()
|
|
8
|
+
export class RoleService {
|
|
9
|
+
constructor(
|
|
10
|
+
@InjectRepository(NestAuthRole)
|
|
11
|
+
private roleRepository: Repository<NestAuthRole>,
|
|
12
|
+
private tenantService: TenantService,
|
|
13
|
+
) { }
|
|
14
|
+
|
|
15
|
+
async createRole(
|
|
16
|
+
name: string,
|
|
17
|
+
guard: string,
|
|
18
|
+
tenantId: string = null,
|
|
19
|
+
isSystem: boolean = false,
|
|
20
|
+
permissionIds?: string | string[],
|
|
21
|
+
): Promise<NestAuthRole> {
|
|
22
|
+
|
|
16
23
|
tenantId = await this.tenantService.resolveTenantId(tenantId);
|
|
24
|
+
|
|
25
|
+
// Check for existing role with same name in the same guard and tenant
|
|
17
26
|
const existingRole = await this.roleRepository.findOne({
|
|
18
27
|
where: {
|
|
19
28
|
name,
|
|
20
29
|
guard,
|
|
21
|
-
tenantId: tenantId ||
|
|
30
|
+
tenantId: tenantId || IsNull()
|
|
22
31
|
},
|
|
23
32
|
});
|
|
33
|
+
|
|
24
34
|
if (existingRole) {
|
|
25
|
-
throw new
|
|
35
|
+
throw new ConflictException({
|
|
26
36
|
message: `Role with name '${name}' already exists in guard '${guard}'${tenantId ? ` for tenant '${tenantId}'` : ''}`,
|
|
27
37
|
code: 'ROLE_ALREADY_EXISTS'
|
|
28
38
|
});
|
|
29
39
|
}
|
|
30
|
-
|
|
40
|
+
|
|
41
|
+
const role = await NestAuthRole.createRole(name, guard, isSystem, tenantId);
|
|
42
|
+
|
|
31
43
|
if (permissionIds) {
|
|
32
44
|
await role.syncPermissions(permissionIds);
|
|
33
45
|
}
|
|
46
|
+
|
|
34
47
|
await this.roleRepository.save(role);
|
|
35
48
|
return role;
|
|
49
|
+
|
|
36
50
|
}
|
|
37
|
-
|
|
51
|
+
|
|
52
|
+
async getRoleById(id: string, options?: FindOneOptions<NestAuthRole>): Promise<NestAuthRole> {
|
|
38
53
|
if (!id) {
|
|
39
54
|
return null;
|
|
40
55
|
}
|
|
56
|
+
|
|
41
57
|
const role = await this.roleRepository.findOne({
|
|
42
58
|
...(options ? options : {}),
|
|
43
59
|
where: { id }
|
|
@@ -47,7 +63,14 @@ let RoleService = class RoleService {
|
|
|
47
63
|
}
|
|
48
64
|
return role;
|
|
49
65
|
}
|
|
50
|
-
|
|
66
|
+
|
|
67
|
+
async getRoleByName(
|
|
68
|
+
name: string,
|
|
69
|
+
guard?: string,
|
|
70
|
+
tenantId?: string,
|
|
71
|
+
options?: FindOneOptions<NestAuthRole>
|
|
72
|
+
): Promise<NestAuthRole> {
|
|
73
|
+
// First check for system roles with this name
|
|
51
74
|
const systemRole = await this.roleRepository.findOne({
|
|
52
75
|
...(options ? options : {}),
|
|
53
76
|
where: {
|
|
@@ -56,25 +79,30 @@ let RoleService = class RoleService {
|
|
|
56
79
|
isSystem: true
|
|
57
80
|
}
|
|
58
81
|
});
|
|
82
|
+
|
|
59
83
|
if (systemRole) {
|
|
60
84
|
return systemRole;
|
|
61
85
|
}
|
|
86
|
+
|
|
87
|
+
// Then check for tenant-specific roles
|
|
62
88
|
const role = await this.roleRepository.findOne({
|
|
63
89
|
...(options ? options : {}),
|
|
64
90
|
where: {
|
|
65
91
|
name,
|
|
66
92
|
...(guard ? { guard } : {}),
|
|
67
|
-
...(tenantId ? { tenantId } : { tenantId:
|
|
93
|
+
...(tenantId ? { tenantId } : { tenantId: IsNull() })
|
|
68
94
|
}
|
|
69
95
|
});
|
|
96
|
+
|
|
70
97
|
return role;
|
|
71
98
|
}
|
|
72
|
-
|
|
99
|
+
|
|
100
|
+
async getSystemRoles(options?: FindManyOptions<NestAuthRole>): Promise<NestAuthRole[]> {
|
|
73
101
|
return this.roleRepository.find({
|
|
74
102
|
...(options ? options : {}),
|
|
75
103
|
where: {
|
|
76
104
|
isSystem: true,
|
|
77
|
-
tenantId:
|
|
105
|
+
tenantId: IsNull(),
|
|
78
106
|
...(options?.where ? options.where : {})
|
|
79
107
|
},
|
|
80
108
|
order: {
|
|
@@ -82,10 +110,12 @@ let RoleService = class RoleService {
|
|
|
82
110
|
}
|
|
83
111
|
});
|
|
84
112
|
}
|
|
85
|
-
|
|
113
|
+
|
|
114
|
+
async getRoles(options?: FindManyOptions<NestAuthRole>): Promise<NestAuthRole[]> {
|
|
86
115
|
return this.roleRepository.find(options);
|
|
87
116
|
}
|
|
88
|
-
|
|
117
|
+
|
|
118
|
+
async getSystemRolesByGuard(guard: string, options?: FindManyOptions<NestAuthRole>): Promise<NestAuthRole[]> {
|
|
89
119
|
return this.roleRepository.find({
|
|
90
120
|
...(options ? options : {}),
|
|
91
121
|
where: {
|
|
@@ -98,7 +128,12 @@ let RoleService = class RoleService {
|
|
|
98
128
|
}
|
|
99
129
|
});
|
|
100
130
|
}
|
|
101
|
-
|
|
131
|
+
|
|
132
|
+
async getRolesByGuard(
|
|
133
|
+
guard: string,
|
|
134
|
+
tenantId?: string,
|
|
135
|
+
options?: FindManyOptions<NestAuthRole>
|
|
136
|
+
): Promise<NestAuthRole[]> {
|
|
102
137
|
if (!guard) {
|
|
103
138
|
return [];
|
|
104
139
|
}
|
|
@@ -106,28 +141,36 @@ let RoleService = class RoleService {
|
|
|
106
141
|
...(options ? options : {}),
|
|
107
142
|
where: {
|
|
108
143
|
guard,
|
|
109
|
-
...(tenantId ? { tenantId } : { tenantId:
|
|
144
|
+
...(tenantId ? { tenantId } : { tenantId: IsNull() }),
|
|
110
145
|
...(options?.where ? options.where : {})
|
|
111
146
|
},
|
|
112
147
|
});
|
|
113
148
|
}
|
|
114
|
-
|
|
149
|
+
|
|
150
|
+
async getRolesByTenant(tenantId: string, includeSystemRoles: boolean = true, options?: FindManyOptions<NestAuthRole>): Promise<NestAuthRole[]> {
|
|
115
151
|
tenantId = await this.tenantService.resolveTenantId(tenantId);
|
|
116
152
|
if (!tenantId) {
|
|
117
153
|
return [];
|
|
118
154
|
}
|
|
155
|
+
|
|
119
156
|
const query = this.roleRepository.createQueryBuilder('role');
|
|
157
|
+
|
|
158
|
+
// Add tenant condition
|
|
120
159
|
query.where('role.tenantId = :tenantId', { tenantId });
|
|
160
|
+
|
|
161
|
+
// Add system roles condition if needed
|
|
121
162
|
if (includeSystemRoles) {
|
|
122
163
|
query.orWhere('role.tenantId IS NULL AND role.isSystem = :isSystem', { isSystem: true });
|
|
123
164
|
}
|
|
165
|
+
|
|
166
|
+
// Apply any additional options
|
|
124
167
|
if (options) {
|
|
125
168
|
if (options.where) {
|
|
126
169
|
query.andWhere(options.where);
|
|
127
170
|
}
|
|
128
171
|
if (options.order) {
|
|
129
172
|
Object.entries(options.order).forEach(([key, value]) => {
|
|
130
|
-
query.addOrderBy(`role.${key}`, value);
|
|
173
|
+
query.addOrderBy(`role.${key}`, value as 'ASC' | 'DESC');
|
|
131
174
|
});
|
|
132
175
|
}
|
|
133
176
|
if (options.skip) {
|
|
@@ -137,88 +180,110 @@ let RoleService = class RoleService {
|
|
|
137
180
|
query.take(options.take);
|
|
138
181
|
}
|
|
139
182
|
}
|
|
183
|
+
|
|
140
184
|
return query.getMany();
|
|
141
185
|
}
|
|
142
|
-
|
|
186
|
+
|
|
187
|
+
async updateRole(id: string, data: Partial<NestAuthRole>): Promise<NestAuthRole> {
|
|
143
188
|
const role = await this.getRoleById(id);
|
|
189
|
+
|
|
144
190
|
if (!role) {
|
|
145
|
-
throw new
|
|
191
|
+
throw new NotFoundException({
|
|
146
192
|
message: `Role with ID ${id} not found`,
|
|
147
193
|
code: 'ROLE_NOT_FOUND'
|
|
148
194
|
});
|
|
149
195
|
}
|
|
196
|
+
|
|
150
197
|
if (role.isSystem) {
|
|
151
|
-
throw new
|
|
198
|
+
throw new ConflictException({
|
|
152
199
|
message: 'Cannot update system role',
|
|
153
200
|
code: 'SYSTEM_ROLE_UPDATE_ERROR',
|
|
154
201
|
});
|
|
155
202
|
}
|
|
203
|
+
|
|
204
|
+
// Prevent changing system status and tenant
|
|
156
205
|
delete data.isSystem;
|
|
157
206
|
delete data.tenantId;
|
|
207
|
+
|
|
208
|
+
// If name or guard is being changed, check for conflicts
|
|
158
209
|
if ((data.name && data.name !== role.name) || (data.guard && data.guard !== role.guard)) {
|
|
159
|
-
|
|
210
|
+
// First check for system role conflicts
|
|
211
|
+
const systemRole = await this.getRoleByName(
|
|
212
|
+
data.name || role.name,
|
|
213
|
+
data.guard || role.guard
|
|
214
|
+
);
|
|
215
|
+
|
|
160
216
|
if (systemRole) {
|
|
161
|
-
throw new
|
|
217
|
+
throw new ConflictException({
|
|
162
218
|
message: `Cannot use name '${data.name || role.name}' as it conflicts with a system role`,
|
|
163
219
|
code: 'SYSTEM_ROLE_CONFLICT'
|
|
164
220
|
});
|
|
165
221
|
}
|
|
166
|
-
|
|
222
|
+
|
|
223
|
+
// Then check for tenant role conflicts
|
|
224
|
+
const existingRole = await this.getRoleByName(
|
|
225
|
+
data.name || role.name,
|
|
226
|
+
data.guard || role.guard,
|
|
227
|
+
role.tenantId
|
|
228
|
+
);
|
|
229
|
+
|
|
167
230
|
if (existingRole && existingRole.id !== role.id) {
|
|
168
|
-
throw new
|
|
231
|
+
throw new ConflictException({
|
|
169
232
|
message: `Role with name '${data.name || role.name}' already exists in guard '${data.guard || role.guard}'${role.tenantId ? ` for tenant '${role.tenantId}'` : ''}`,
|
|
170
233
|
code: 'ROLE_ALREADY_EXISTS'
|
|
171
234
|
});
|
|
172
235
|
}
|
|
173
236
|
}
|
|
237
|
+
|
|
174
238
|
Object.assign(role, data);
|
|
175
239
|
return this.roleRepository.save(role);
|
|
176
240
|
}
|
|
177
|
-
|
|
241
|
+
|
|
242
|
+
async updateRolePermissions(id: string, permissionIds: string | string[]): Promise<NestAuthRole> {
|
|
178
243
|
const role = await this.getRoleById(id);
|
|
244
|
+
|
|
179
245
|
if (!role) {
|
|
180
|
-
throw new
|
|
246
|
+
throw new NotFoundException({
|
|
181
247
|
message: `Role with ID ${id} not found`,
|
|
182
248
|
code: 'ROLE_NOT_FOUND'
|
|
183
249
|
});
|
|
184
250
|
}
|
|
251
|
+
|
|
185
252
|
if (role.isSystem) {
|
|
186
|
-
throw new
|
|
253
|
+
throw new BadRequestException({
|
|
187
254
|
message: 'Cannot update system role',
|
|
188
255
|
code: 'SYSTEM_ROLE_UPDATE_ERROR',
|
|
189
256
|
});
|
|
190
257
|
}
|
|
258
|
+
|
|
191
259
|
await role.syncPermissions(permissionIds);
|
|
192
260
|
return this.roleRepository.save(role);
|
|
193
261
|
}
|
|
194
|
-
|
|
262
|
+
|
|
263
|
+
async deleteRole(id: string): Promise<void> {
|
|
195
264
|
const role = await this.getRoleById(id);
|
|
265
|
+
|
|
196
266
|
if (!role) {
|
|
197
|
-
throw new
|
|
267
|
+
throw new NotFoundException({
|
|
198
268
|
message: `Role with ID ${id} not found`,
|
|
199
269
|
code: 'ROLE_NOT_FOUND'
|
|
200
270
|
});
|
|
201
271
|
}
|
|
272
|
+
|
|
202
273
|
if (role.isSystem) {
|
|
203
|
-
throw new
|
|
274
|
+
throw new BadRequestException({
|
|
204
275
|
message: 'Cannot delete system role',
|
|
205
276
|
code: 'SYSTEM_ROLE_DELETE_ERROR',
|
|
206
277
|
});
|
|
207
278
|
}
|
|
279
|
+
|
|
208
280
|
await this.roleRepository.remove(role);
|
|
209
281
|
}
|
|
210
|
-
|
|
282
|
+
|
|
283
|
+
async deleteSystemRole(id: string): Promise<void> {
|
|
211
284
|
const role = await this.getRoleById(id);
|
|
212
285
|
if (role?.isSystem) {
|
|
213
286
|
await this.roleRepository.remove(role);
|
|
214
287
|
}
|
|
215
288
|
}
|
|
216
|
-
}
|
|
217
|
-
exports.RoleService = RoleService;
|
|
218
|
-
exports.RoleService = RoleService = tslib_1.__decorate([
|
|
219
|
-
(0, common_1.Injectable)(),
|
|
220
|
-
tslib_1.__param(0, (0, typeorm_1.InjectRepository)(role_entity_1.NestAuthRole)),
|
|
221
|
-
tslib_1.__metadata("design:paramtypes", [typeorm_2.Repository,
|
|
222
|
-
tenant_1.TenantService])
|
|
223
|
-
], RoleService);
|
|
224
|
-
//# sourceMappingURL=role.service.js.map
|
|
289
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Entity,
|
|
3
|
+
Column,
|
|
4
|
+
PrimaryGeneratedColumn,
|
|
5
|
+
CreateDateColumn,
|
|
6
|
+
UpdateDateColumn,
|
|
7
|
+
ManyToOne,
|
|
8
|
+
JoinColumn,
|
|
9
|
+
BaseEntity,
|
|
10
|
+
RelationId
|
|
11
|
+
} from 'typeorm';
|
|
12
|
+
import { NestAuthUser } from '../../user/entities/user.entity';
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@Entity('nest_auth_sessions')
|
|
16
|
+
export class NestAuthSession extends BaseEntity {
|
|
17
|
+
@PrimaryGeneratedColumn('uuid')
|
|
18
|
+
id: string;
|
|
19
|
+
|
|
20
|
+
@Column({ nullable: true })
|
|
21
|
+
@RelationId((session: NestAuthSession) => session.user)
|
|
22
|
+
userId: string;
|
|
23
|
+
|
|
24
|
+
@ManyToOne(() => NestAuthUser, { onDelete: 'CASCADE' })
|
|
25
|
+
@JoinColumn({ name: 'userId' })
|
|
26
|
+
user: NestAuthUser;
|
|
27
|
+
|
|
28
|
+
@Column('simple-json', { nullable: true, default: '{}' })
|
|
29
|
+
data?: any;
|
|
30
|
+
|
|
31
|
+
@Column({ nullable: true })
|
|
32
|
+
refreshToken: string;
|
|
33
|
+
|
|
34
|
+
@Column({ nullable: true })
|
|
35
|
+
expiresAt: Date;
|
|
36
|
+
|
|
37
|
+
@Column({ nullable: true })
|
|
38
|
+
userAgent?: string;
|
|
39
|
+
|
|
40
|
+
@Column({ nullable: true })
|
|
41
|
+
deviceName?: string;
|
|
42
|
+
|
|
43
|
+
@Column({ nullable: true })
|
|
44
|
+
ipAddress?: string;
|
|
45
|
+
|
|
46
|
+
@Column({ nullable: true })
|
|
47
|
+
lastActive: Date;
|
|
48
|
+
|
|
49
|
+
@CreateDateColumn()
|
|
50
|
+
createdAt?: Date;
|
|
51
|
+
|
|
52
|
+
@UpdateDateColumn()
|
|
53
|
+
updatedAt?: Date;
|
|
54
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Entities
|
|
2
|
+
export * from './entities/session.entity';
|
|
3
|
+
|
|
4
|
+
// Interfaces
|
|
5
|
+
export * from './interfaces/session-repository.interface';
|
|
6
|
+
|
|
7
|
+
// Repositories
|
|
8
|
+
export * from './repositories/base-session.repository';
|
|
9
|
+
export * from './repositories/typeorm-session.repository';
|
|
10
|
+
export * from './repositories/redis-session.repository';
|
|
11
|
+
export * from './repositories/memory-session.repository';
|
|
12
|
+
|
|
13
|
+
// Services
|
|
14
|
+
export * from './services/session-manager.service';
|
|
15
|
+
|
|
16
|
+
// Utils
|
|
17
|
+
export * from './utils/session.util';
|
|
18
|
+
|
|
19
|
+
// Module
|
|
20
|
+
export * from './session.module';
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { NestAuthSession } from '../entities/session.entity';
|
|
2
|
+
import { SessionPayload } from '../../core/interfaces/token-payload.interface';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Interface for session repository implementations
|
|
6
|
+
* Allows different storage backends (Database, Redis, Memory)
|
|
7
|
+
*/
|
|
8
|
+
export interface ISessionRepository {
|
|
9
|
+
/**
|
|
10
|
+
* Create a new session
|
|
11
|
+
*/
|
|
12
|
+
create(session: SessionPayload): Promise<NestAuthSession>;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Find session by ID
|
|
16
|
+
*/
|
|
17
|
+
findById(sessionId: string): Promise<NestAuthSession | null>;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Find all sessions for a user
|
|
21
|
+
*/
|
|
22
|
+
findByUserId(userId: string): Promise<NestAuthSession[]>;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Find active sessions for a user (not expired)
|
|
26
|
+
*/
|
|
27
|
+
findActiveByUserId(userId: string): Promise<NestAuthSession[]>;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Update session
|
|
31
|
+
*/
|
|
32
|
+
update(sessionId: string, updates: Partial<NestAuthSession>): Promise<NestAuthSession>;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Delete session by ID
|
|
36
|
+
*/
|
|
37
|
+
delete(sessionId: string): Promise<void>;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Delete all sessions for a user
|
|
41
|
+
*/
|
|
42
|
+
deleteByUserId(userId: string): Promise<void>;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Delete expired sessions
|
|
46
|
+
*/
|
|
47
|
+
deleteExpired(): Promise<number>;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Count active sessions for a user
|
|
51
|
+
*/
|
|
52
|
+
countActiveByUserId(userId: string): Promise<number>;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Update last active timestamp
|
|
56
|
+
*/
|
|
57
|
+
updateLastActive(sessionId: string): Promise<void>;
|
|
58
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { NestAuthSession } from '../entities/session.entity';
|
|
2
|
+
import { SessionPayload } from '../../core/interfaces/token-payload.interface';
|
|
3
|
+
import { ISessionRepository } from '../interfaces/session-repository.interface';
|
|
4
|
+
import ms from 'ms';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Abstract base class for session repositories
|
|
8
|
+
* Provides common functionality and helper methods
|
|
9
|
+
*/
|
|
10
|
+
export abstract class BaseSessionRepository implements ISessionRepository {
|
|
11
|
+
|
|
12
|
+
// Abstract methods that must be implemented by subclasses
|
|
13
|
+
abstract create(session: SessionPayload): Promise<NestAuthSession>;
|
|
14
|
+
abstract findById(sessionId: string): Promise<NestAuthSession | null>;
|
|
15
|
+
abstract findByUserId(userId: string): Promise<NestAuthSession[]>;
|
|
16
|
+
abstract findActiveByUserId(userId: string): Promise<NestAuthSession[]>;
|
|
17
|
+
abstract update(sessionId: string, updates: Partial<NestAuthSession>): Promise<NestAuthSession>;
|
|
18
|
+
abstract delete(sessionId: string): Promise<void>;
|
|
19
|
+
abstract deleteByUserId(userId: string): Promise<void>;
|
|
20
|
+
abstract deleteExpired(): Promise<number>;
|
|
21
|
+
abstract countActiveByUserId(userId: string): Promise<number>;
|
|
22
|
+
abstract updateLastActive(sessionId: string): Promise<void>;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Helper: Check if session is expired
|
|
26
|
+
*/
|
|
27
|
+
protected isExpired(session: NestAuthSession): boolean {
|
|
28
|
+
if (!session.expiresAt) return false;
|
|
29
|
+
return new Date() > new Date(session.expiresAt);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Helper: Calculate expiration date from duration string
|
|
34
|
+
*/
|
|
35
|
+
protected calculateExpiresAt(duration: string | number): Date {
|
|
36
|
+
const milliseconds = typeof duration === 'string' ? ms(duration) : duration;
|
|
37
|
+
return new Date(Date.now() + milliseconds);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Helper: Serialize session data for storage
|
|
42
|
+
*/
|
|
43
|
+
protected serializeSession(session: SessionPayload | NestAuthSession): Record<string, any> {
|
|
44
|
+
return {
|
|
45
|
+
...session,
|
|
46
|
+
data: session.data ? JSON.stringify(session.data) : null,
|
|
47
|
+
expiresAt: session.expiresAt instanceof Date
|
|
48
|
+
? session.expiresAt.toISOString()
|
|
49
|
+
: session.expiresAt,
|
|
50
|
+
lastActive: session.lastActive instanceof Date
|
|
51
|
+
? session.lastActive.toISOString()
|
|
52
|
+
: session.lastActive,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Helper: Deserialize session data from storage
|
|
58
|
+
*/
|
|
59
|
+
protected deserializeSession(data: Record<string, any>): NestAuthSession {
|
|
60
|
+
return {
|
|
61
|
+
...data,
|
|
62
|
+
data: data['data'] ? JSON.parse(data['data']) : null,
|
|
63
|
+
expiresAt: data['expiresAt'] ? new Date(data['expiresAt']) : null,
|
|
64
|
+
lastActive: data['lastActive'] ? new Date(data['lastActive']) : null,
|
|
65
|
+
} as NestAuthSession;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Helper: Filter only active sessions (not expired)
|
|
70
|
+
*/
|
|
71
|
+
protected filterActive(sessions: NestAuthSession[]): NestAuthSession[] {
|
|
72
|
+
return sessions.filter(session => !this.isExpired(session));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { Injectable } from '@nestjs/common';
|
|
2
|
+
import { BaseSessionRepository } from './base-session.repository';
|
|
3
|
+
import { NestAuthSession } from '../entities/session.entity';
|
|
4
|
+
import { SessionPayload } from '../../core/interfaces/token-payload.interface';
|
|
5
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* In-memory implementation of session repository
|
|
9
|
+
* Useful for testing and development
|
|
10
|
+
* WARNING: Sessions are lost on server restart!
|
|
11
|
+
*/
|
|
12
|
+
@Injectable()
|
|
13
|
+
export class MemorySessionRepository extends BaseSessionRepository {
|
|
14
|
+
private sessions: Map<string, NestAuthSession> = new Map();
|
|
15
|
+
private userSessions: Map<string, Set<string>> = new Map();
|
|
16
|
+
|
|
17
|
+
async create(session: SessionPayload): Promise<NestAuthSession> {
|
|
18
|
+
const sessionId = session.id || uuidv4();
|
|
19
|
+
|
|
20
|
+
const sessionData: NestAuthSession = {
|
|
21
|
+
id: sessionId,
|
|
22
|
+
userId: session.userId,
|
|
23
|
+
refreshToken: session.refreshToken,
|
|
24
|
+
data: session.data,
|
|
25
|
+
expiresAt: session.expiresAt,
|
|
26
|
+
userAgent: session.userAgent,
|
|
27
|
+
deviceName: session.deviceName,
|
|
28
|
+
ipAddress: session.ipAddress,
|
|
29
|
+
lastActive: session.lastActive || new Date(),
|
|
30
|
+
createdAt: new Date(),
|
|
31
|
+
updatedAt: new Date(),
|
|
32
|
+
} as NestAuthSession;
|
|
33
|
+
|
|
34
|
+
this.sessions.set(sessionId, sessionData);
|
|
35
|
+
|
|
36
|
+
// Track user sessions
|
|
37
|
+
if (!this.userSessions.has(session.userId)) {
|
|
38
|
+
this.userSessions.set(session.userId, new Set());
|
|
39
|
+
}
|
|
40
|
+
this.userSessions.get(session.userId)!.add(sessionId);
|
|
41
|
+
|
|
42
|
+
return sessionData;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async findById(sessionId: string): Promise<NestAuthSession | null> {
|
|
46
|
+
const session = this.sessions.get(sessionId);
|
|
47
|
+
if (!session) return null;
|
|
48
|
+
|
|
49
|
+
// Check expiration
|
|
50
|
+
if (this.isExpired(session)) {
|
|
51
|
+
await this.delete(sessionId);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return session;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async findByUserId(userId: string): Promise<NestAuthSession[]> {
|
|
59
|
+
const sessionIds = this.userSessions.get(userId) || new Set();
|
|
60
|
+
const sessions: NestAuthSession[] = [];
|
|
61
|
+
|
|
62
|
+
for (const sessionId of sessionIds) {
|
|
63
|
+
const session = await this.findById(sessionId);
|
|
64
|
+
if (session) {
|
|
65
|
+
sessions.push(session);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return sessions.sort((a, b) =>
|
|
70
|
+
(b.createdAt?.getTime() || 0) - (a.createdAt?.getTime() || 0)
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async findActiveByUserId(userId: string): Promise<NestAuthSession[]> {
|
|
75
|
+
const allSessions = await this.findByUserId(userId);
|
|
76
|
+
return this.filterActive(allSessions);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async update(sessionId: string, updates: Partial<NestAuthSession>): Promise<NestAuthSession> {
|
|
80
|
+
const session = await this.findById(sessionId);
|
|
81
|
+
if (!session) {
|
|
82
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const updated = {
|
|
86
|
+
...session,
|
|
87
|
+
...updates,
|
|
88
|
+
updatedAt: new Date(),
|
|
89
|
+
} as NestAuthSession;
|
|
90
|
+
|
|
91
|
+
this.sessions.set(sessionId, updated);
|
|
92
|
+
return updated;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async delete(sessionId: string): Promise<void> {
|
|
96
|
+
const session = this.sessions.get(sessionId);
|
|
97
|
+
if (!session) return;
|
|
98
|
+
|
|
99
|
+
this.sessions.delete(sessionId);
|
|
100
|
+
|
|
101
|
+
// Remove from user sessions
|
|
102
|
+
const userSessionIds = this.userSessions.get(session.userId);
|
|
103
|
+
if (userSessionIds) {
|
|
104
|
+
userSessionIds.delete(sessionId);
|
|
105
|
+
if (userSessionIds.size === 0) {
|
|
106
|
+
this.userSessions.delete(session.userId);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async deleteByUserId(userId: string): Promise<void> {
|
|
112
|
+
const sessionIds = this.userSessions.get(userId) || new Set();
|
|
113
|
+
|
|
114
|
+
for (const sessionId of sessionIds) {
|
|
115
|
+
this.sessions.delete(sessionId);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
this.userSessions.delete(userId);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
async deleteExpired(): Promise<number> {
|
|
122
|
+
let count = 0;
|
|
123
|
+
const now = new Date();
|
|
124
|
+
|
|
125
|
+
for (const [sessionId, session] of this.sessions.entries()) {
|
|
126
|
+
if (this.isExpired(session)) {
|
|
127
|
+
await this.delete(sessionId);
|
|
128
|
+
count++;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return count;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async countActiveByUserId(userId: string): Promise<number> {
|
|
136
|
+
const activeSessions = await this.findActiveByUserId(userId);
|
|
137
|
+
return activeSessions.length;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async updateLastActive(sessionId: string): Promise<void> {
|
|
141
|
+
await this.update(sessionId, {
|
|
142
|
+
lastActive: new Date(),
|
|
143
|
+
} as any);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Clear all sessions (useful for testing)
|
|
148
|
+
*/
|
|
149
|
+
clear(): void {
|
|
150
|
+
this.sessions.clear();
|
|
151
|
+
this.userSessions.clear();
|
|
152
|
+
}
|
|
153
|
+
}
|