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