hazo_auth 1.4.1 → 1.6.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 +25 -38
- package/SETUP_CHECKLIST.md +708 -0
- package/dist/app/api/hazo_auth/change_password/route.d.ts +8 -0
- package/dist/app/api/hazo_auth/change_password/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/change_password/route.js +98 -0
- package/dist/app/api/hazo_auth/forgot_password/route.d.ts +8 -0
- package/dist/app/api/hazo_auth/forgot_password/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/forgot_password/route.js +78 -0
- package/dist/app/api/hazo_auth/get_auth/route.d.ts +10 -0
- package/dist/app/api/hazo_auth/get_auth/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/get_auth/route.js +63 -0
- package/dist/app/api/hazo_auth/invalidate_cache/route.d.ts +14 -0
- package/dist/app/api/hazo_auth/invalidate_cache/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/invalidate_cache/route.js +96 -0
- package/dist/app/api/hazo_auth/library_photos/route.d.ts +13 -0
- package/dist/app/api/hazo_auth/library_photos/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/library_photos/route.js +55 -0
- package/dist/app/api/hazo_auth/login/route.d.ts +12 -0
- package/dist/app/api/hazo_auth/login/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/login/route.js +140 -0
- package/dist/app/api/hazo_auth/logout/route.d.ts +8 -0
- package/dist/app/api/hazo_auth/logout/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/logout/route.js +71 -0
- package/dist/app/api/hazo_auth/me/route.d.ts +3 -0
- package/dist/app/api/hazo_auth/me/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/me/route.js +34 -0
- package/dist/app/api/hazo_auth/profile_picture/[filename]/route.d.ts +7 -0
- package/dist/app/api/hazo_auth/profile_picture/[filename]/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/profile_picture/[filename]/route.js +43 -0
- package/dist/app/api/hazo_auth/register/route.d.ts +9 -0
- package/dist/app/api/hazo_auth/register/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/register/route.js +80 -0
- package/dist/app/api/hazo_auth/remove_profile_picture/route.d.ts +8 -0
- package/dist/app/api/hazo_auth/remove_profile_picture/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/remove_profile_picture/route.js +64 -0
- package/dist/app/api/hazo_auth/resend_verification/route.d.ts +8 -0
- package/dist/app/api/hazo_auth/resend_verification/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/resend_verification/route.js +79 -0
- package/dist/app/api/hazo_auth/reset_password/route.d.ts +8 -0
- package/dist/app/api/hazo_auth/reset_password/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/reset_password/route.js +76 -0
- package/dist/app/api/hazo_auth/update_user/route.d.ts +9 -0
- package/dist/app/api/hazo_auth/update_user/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/update_user/route.js +95 -0
- package/dist/app/api/hazo_auth/upload_profile_picture/route.d.ts +9 -0
- package/dist/app/api/hazo_auth/upload_profile_picture/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/upload_profile_picture/route.js +204 -0
- package/dist/app/api/hazo_auth/validate_reset_token/route.d.ts +6 -0
- package/dist/app/api/hazo_auth/validate_reset_token/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/validate_reset_token/route.js +58 -0
- package/dist/app/api/hazo_auth/verify_email/route.d.ts +11 -0
- package/dist/app/api/hazo_auth/verify_email/route.d.ts.map +1 -0
- package/dist/app/api/hazo_auth/verify_email/route.js +63 -0
- package/dist/cli/generate.d.ts +2 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +117 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +120 -0
- package/dist/cli/validate.d.ts +15 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +509 -0
- package/dist/components/layouts/email_verification/config/email_verification_field_config.d.ts +2 -2
- package/dist/components/layouts/email_verification/config/email_verification_field_config.d.ts.map +1 -1
- package/dist/components/layouts/email_verification/config/email_verification_field_config.js +1 -1
- package/dist/components/layouts/email_verification/hooks/use_email_verification.d.ts +2 -2
- package/dist/components/layouts/email_verification/hooks/use_email_verification.d.ts.map +1 -1
- package/dist/components/layouts/email_verification/hooks/use_email_verification.js +2 -2
- package/dist/components/layouts/email_verification/index.d.ts +3 -3
- package/dist/components/layouts/email_verification/index.d.ts.map +1 -1
- package/dist/components/layouts/email_verification/index.js +9 -9
- package/dist/components/layouts/forgot_password/config/forgot_password_field_config.d.ts +2 -2
- package/dist/components/layouts/forgot_password/config/forgot_password_field_config.d.ts.map +1 -1
- package/dist/components/layouts/forgot_password/config/forgot_password_field_config.js +1 -1
- package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.d.ts +2 -2
- package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.d.ts.map +1 -1
- package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.js +2 -2
- package/dist/components/layouts/forgot_password/index.d.ts +2 -2
- package/dist/components/layouts/forgot_password/index.d.ts.map +1 -1
- package/dist/components/layouts/forgot_password/index.js +8 -8
- package/dist/components/layouts/login/config/login_field_config.d.ts +2 -2
- package/dist/components/layouts/login/config/login_field_config.d.ts.map +1 -1
- package/dist/components/layouts/login/config/login_field_config.js +1 -1
- package/dist/components/layouts/login/hooks/use_login_form.d.ts +2 -2
- package/dist/components/layouts/login/hooks/use_login_form.d.ts.map +1 -1
- package/dist/components/layouts/login/hooks/use_login_form.js +4 -4
- package/dist/components/layouts/login/index.d.ts +2 -2
- package/dist/components/layouts/login/index.d.ts.map +1 -1
- package/dist/components/layouts/login/index.js +9 -9
- package/dist/components/layouts/my_settings/components/editable_field.js +3 -3
- package/dist/components/layouts/my_settings/components/password_change_dialog.d.ts +1 -1
- package/dist/components/layouts/my_settings/components/password_change_dialog.d.ts.map +1 -1
- package/dist/components/layouts/my_settings/components/password_change_dialog.js +4 -4
- package/dist/components/layouts/my_settings/components/profile_picture_dialog.js +7 -7
- package/dist/components/layouts/my_settings/components/profile_picture_display.js +1 -1
- package/dist/components/layouts/my_settings/components/profile_picture_gravatar_tab.js +3 -3
- package/dist/components/layouts/my_settings/components/profile_picture_library_tab.js +5 -5
- package/dist/components/layouts/my_settings/components/profile_picture_upload_tab.js +4 -4
- package/dist/components/layouts/my_settings/config/my_settings_field_config.d.ts +1 -1
- package/dist/components/layouts/my_settings/config/my_settings_field_config.d.ts.map +1 -1
- package/dist/components/layouts/my_settings/config/my_settings_field_config.js +1 -1
- package/dist/components/layouts/my_settings/hooks/use_my_settings.d.ts +1 -1
- package/dist/components/layouts/my_settings/hooks/use_my_settings.d.ts.map +1 -1
- package/dist/components/layouts/my_settings/hooks/use_my_settings.js +1 -1
- package/dist/components/layouts/my_settings/index.d.ts +2 -2
- package/dist/components/layouts/my_settings/index.d.ts.map +1 -1
- package/dist/components/layouts/my_settings/index.js +9 -9
- package/dist/components/layouts/register/config/register_field_config.d.ts +2 -2
- package/dist/components/layouts/register/config/register_field_config.d.ts.map +1 -1
- package/dist/components/layouts/register/config/register_field_config.js +1 -1
- package/dist/components/layouts/register/hooks/use_register_form.d.ts +3 -3
- package/dist/components/layouts/register/hooks/use_register_form.d.ts.map +1 -1
- package/dist/components/layouts/register/hooks/use_register_form.js +2 -2
- package/dist/components/layouts/register/index.d.ts +2 -2
- package/dist/components/layouts/register/index.d.ts.map +1 -1
- package/dist/components/layouts/register/index.js +9 -9
- package/dist/components/layouts/reset_password/config/reset_password_field_config.d.ts +2 -2
- package/dist/components/layouts/reset_password/config/reset_password_field_config.d.ts.map +1 -1
- package/dist/components/layouts/reset_password/config/reset_password_field_config.js +1 -1
- package/dist/components/layouts/reset_password/hooks/use_reset_password_form.d.ts +3 -3
- package/dist/components/layouts/reset_password/hooks/use_reset_password_form.d.ts.map +1 -1
- package/dist/components/layouts/reset_password/hooks/use_reset_password_form.js +2 -2
- package/dist/components/layouts/reset_password/index.d.ts +2 -2
- package/dist/components/layouts/reset_password/index.d.ts.map +1 -1
- package/dist/components/layouts/reset_password/index.js +8 -8
- package/dist/components/layouts/shared/components/already_logged_in_guard.js +4 -4
- package/dist/components/layouts/shared/components/auth_page_shell.js +3 -3
- package/dist/components/layouts/shared/components/form_action_buttons.d.ts +1 -1
- package/dist/components/layouts/shared/components/form_action_buttons.d.ts.map +1 -1
- package/dist/components/layouts/shared/components/form_action_buttons.js +1 -1
- package/dist/components/layouts/shared/components/form_field_wrapper.js +2 -2
- package/dist/components/layouts/shared/components/logout_button.js +2 -2
- package/dist/components/layouts/shared/components/password_field.js +3 -3
- package/dist/components/layouts/shared/components/profile_pic_menu.d.ts +1 -1
- package/dist/components/layouts/shared/components/profile_pic_menu.d.ts.map +1 -1
- package/dist/components/layouts/shared/components/profile_pic_menu.js +4 -4
- package/dist/components/layouts/shared/components/profile_pic_menu_wrapper.js +2 -2
- package/dist/components/layouts/shared/components/sidebar_layout_wrapper.js +3 -3
- package/dist/components/layouts/shared/components/standalone_layout_wrapper.js +1 -1
- package/dist/components/layouts/shared/components/two_column_auth_layout.js +1 -1
- package/dist/components/layouts/shared/components/unauthorized_guard.js +2 -2
- package/dist/components/layouts/shared/hooks/use_hazo_auth.d.ts +1 -1
- package/dist/components/layouts/shared/hooks/use_hazo_auth.d.ts.map +1 -1
- package/dist/components/layouts/shared/utils/validation.d.ts +1 -1
- package/dist/components/layouts/shared/utils/validation.d.ts.map +1 -1
- package/dist/components/layouts/user_management/components/roles_matrix.js +7 -7
- package/dist/components/layouts/user_management/index.js +11 -11
- package/dist/components/ui/alert-dialog.js +2 -2
- package/dist/components/ui/avatar.js +1 -1
- package/dist/components/ui/button.js +1 -1
- package/dist/components/ui/card.d.ts +9 -0
- package/dist/components/ui/card.d.ts.map +1 -0
- package/dist/components/ui/card.js +45 -0
- package/dist/components/ui/checkbox.js +1 -1
- package/dist/components/ui/dialog.js +1 -1
- package/dist/components/ui/dropdown-menu.js +1 -1
- package/dist/components/ui/hazo_ui_tooltip.js +1 -1
- package/dist/components/ui/input.js +1 -1
- package/dist/components/ui/label.js +1 -1
- package/dist/components/ui/separator.js +1 -1
- package/dist/components/ui/sheet.js +1 -1
- package/dist/components/ui/sidebar.d.ts +2 -2
- package/dist/components/ui/sidebar.d.ts.map +1 -1
- package/dist/components/ui/sidebar.js +8 -8
- package/dist/components/ui/skeleton.js +1 -1
- package/dist/components/ui/switch.js +1 -1
- package/dist/components/ui/table.js +1 -1
- package/dist/components/ui/tabs.js +1 -1
- package/dist/components/ui/tooltip.js +1 -1
- package/dist/components/ui/vertical-tabs.js +1 -1
- package/dist/hooks/use-mobile.d.ts.map +1 -1
- package/dist/hooks/use-mobile.js +17 -3
- package/dist/lib/already_logged_in_config.server.js +1 -1
- package/dist/lib/app_logger.js +1 -1
- package/dist/lib/auth/auth_cache.d.ts +1 -1
- package/dist/lib/auth/auth_cache.d.ts.map +1 -1
- package/dist/lib/auth/auth_utils.server.js +2 -2
- package/dist/lib/auth/hazo_get_auth.server.d.ts +1 -1
- package/dist/lib/auth/hazo_get_auth.server.d.ts.map +1 -1
- package/dist/lib/auth/hazo_get_auth.server.js +7 -7
- package/dist/lib/auth/server_auth.js +2 -2
- package/dist/lib/auth_utility_config.server.js +1 -1
- package/dist/lib/config/config_loader.server.js +1 -1
- package/dist/lib/email_verification_config.server.js +1 -1
- package/dist/lib/file_types_config.server.js +1 -1
- package/dist/lib/forgot_password_config.server.js +1 -1
- package/dist/lib/hazo_connect_instance.server.js +2 -2
- package/dist/lib/hazo_connect_setup.server.js +2 -2
- package/dist/lib/login_config.server.js +2 -2
- package/dist/lib/messages_config.server.js +1 -1
- package/dist/lib/my_settings_config.server.js +7 -7
- package/dist/lib/password_requirements_config.server.js +1 -1
- package/dist/lib/profile_pic_menu_config.server.js +1 -1
- package/dist/lib/profile_picture_config.server.js +2 -2
- package/dist/lib/register_config.server.js +4 -4
- package/dist/lib/reset_password_config.server.js +3 -3
- package/dist/lib/services/email_service.js +2 -2
- package/dist/lib/services/email_verification_service.js +3 -3
- package/dist/lib/services/login_service.js +3 -3
- package/dist/lib/services/password_change_service.js +3 -3
- package/dist/lib/services/password_reset_service.js +3 -3
- package/dist/lib/services/profile_picture_remove_service.js +3 -3
- package/dist/lib/services/profile_picture_service.d.ts +1 -1
- package/dist/lib/services/profile_picture_service.d.ts.map +1 -1
- package/dist/lib/services/profile_picture_service.js +5 -5
- package/dist/lib/services/registration_service.js +8 -8
- package/dist/lib/services/token_service.js +2 -2
- package/dist/lib/services/user_profiles_service.js +2 -2
- package/dist/lib/services/user_update_service.d.ts +1 -1
- package/dist/lib/services/user_update_service.d.ts.map +1 -1
- package/dist/lib/services/user_update_service.js +4 -4
- package/dist/lib/ui_shell_config.server.js +1 -1
- package/dist/lib/ui_sizes_config.server.js +1 -1
- package/dist/lib/user_fields_config.server.js +1 -1
- package/dist/lib/user_management_config.server.js +1 -1
- package/dist/lib/utils/error_sanitizer.d.ts +1 -1
- package/dist/lib/utils/error_sanitizer.d.ts.map +1 -1
- package/dist/server/config/config_loader.d.ts +1 -1
- package/dist/server/config/config_loader.d.ts.map +1 -1
- package/dist/server/config/config_loader.js +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/logging/logger_service.d.ts +1 -1
- package/dist/server/logging/logger_service.d.ts.map +1 -1
- package/dist/server/routes/change_password.d.ts +2 -0
- package/dist/server/routes/change_password.d.ts.map +1 -0
- package/dist/server/routes/change_password.js +2 -0
- package/dist/server/routes/forgot_password.d.ts +2 -0
- package/dist/server/routes/forgot_password.d.ts.map +1 -0
- package/dist/server/routes/forgot_password.js +2 -0
- package/dist/server/routes/get_auth.d.ts +2 -0
- package/dist/server/routes/get_auth.d.ts.map +1 -0
- package/dist/server/routes/get_auth.js +2 -0
- package/dist/server/routes/index.d.ts +18 -0
- package/dist/server/routes/index.d.ts.map +1 -0
- package/dist/server/routes/index.js +24 -0
- package/dist/server/routes/invalidate_cache.d.ts +2 -0
- package/dist/server/routes/invalidate_cache.d.ts.map +1 -0
- package/dist/server/routes/invalidate_cache.js +2 -0
- package/dist/server/routes/library_photos.d.ts +2 -0
- package/dist/server/routes/library_photos.d.ts.map +1 -0
- package/dist/server/routes/library_photos.js +2 -0
- package/dist/server/routes/login.d.ts +2 -0
- package/dist/server/routes/login.d.ts.map +1 -0
- package/dist/server/routes/login.js +2 -0
- package/dist/server/routes/logout.d.ts +2 -0
- package/dist/server/routes/logout.d.ts.map +1 -0
- package/dist/server/routes/logout.js +2 -0
- package/dist/server/routes/me.d.ts +2 -0
- package/dist/server/routes/me.d.ts.map +1 -0
- package/dist/server/routes/me.js +2 -0
- package/dist/server/routes/profile_picture_filename.d.ts +2 -0
- package/dist/server/routes/profile_picture_filename.d.ts.map +1 -0
- package/dist/server/routes/profile_picture_filename.js +3 -0
- package/dist/server/routes/register.d.ts +2 -0
- package/dist/server/routes/register.d.ts.map +1 -0
- package/dist/server/routes/register.js +2 -0
- package/dist/server/routes/remove_profile_picture.d.ts +2 -0
- package/dist/server/routes/remove_profile_picture.d.ts.map +1 -0
- package/dist/server/routes/remove_profile_picture.js +2 -0
- package/dist/server/routes/resend_verification.d.ts +2 -0
- package/dist/server/routes/resend_verification.d.ts.map +1 -0
- package/dist/server/routes/resend_verification.js +2 -0
- package/dist/server/routes/reset_password.d.ts +2 -0
- package/dist/server/routes/reset_password.d.ts.map +1 -0
- package/dist/server/routes/reset_password.js +2 -0
- package/dist/server/routes/update_user.d.ts +2 -0
- package/dist/server/routes/update_user.d.ts.map +1 -0
- package/dist/server/routes/update_user.js +2 -0
- package/dist/server/routes/upload_profile_picture.d.ts +2 -0
- package/dist/server/routes/upload_profile_picture.d.ts.map +1 -0
- package/dist/server/routes/upload_profile_picture.js +2 -0
- package/dist/server/routes/validate_reset_token.d.ts +2 -0
- package/dist/server/routes/validate_reset_token.d.ts.map +1 -0
- package/dist/server/routes/validate_reset_token.js +2 -0
- package/dist/server/routes/verify_email.d.ts +2 -0
- package/dist/server/routes/verify_email.d.ts.map +1 -0
- package/dist/server/routes/verify_email.js +2 -0
- package/dist/server/server.js +2 -2
- package/package.json +14 -115
- package/components.json +0 -22
- package/instrumentation.ts +0 -32
- package/migrations/001_add_token_type_to_refresh_tokens.sql +0 -14
- package/migrations/002_add_name_to_hazo_users.sql +0 -7
- package/migrations/003_add_url_on_logon_to_hazo_users.sql +0 -8
- package/next.config.mjs +0 -67
- package/postcss.config.mjs +0 -8
- package/public/file.svg +0 -1
- package/public/globe.svg +0 -1
- package/public/next.svg +0 -1
- package/public/vercel.svg +0 -1
- package/public/window.svg +0 -1
- package/scripts/apply_migration.ts +0 -118
- package/scripts/init_users.ts +0 -378
- package/src/app/api/hazo_auth/auth/upload_profile_picture/route.ts +0 -268
- package/src/app/api/hazo_auth/change_password/route.ts +0 -132
- package/src/app/api/hazo_auth/forgot_password/route.ts +0 -107
- package/src/app/api/hazo_auth/get_auth/route.ts +0 -89
- package/src/app/api/hazo_auth/invalidate_cache/route.ts +0 -139
- package/src/app/api/hazo_auth/library_photos/route.ts +0 -73
- package/src/app/api/hazo_auth/login/route.ts +0 -181
- package/src/app/api/hazo_auth/logout/route.ts +0 -89
- package/src/app/api/hazo_auth/me/route.ts +0 -47
- package/src/app/api/hazo_auth/profile_picture/[filename]/route.ts +0 -67
- package/src/app/api/hazo_auth/register/route.ts +0 -109
- package/src/app/api/hazo_auth/remove_profile_picture/route.ts +0 -86
- package/src/app/api/hazo_auth/resend_verification/route.ts +0 -108
- package/src/app/api/hazo_auth/reset_password/route.ts +0 -107
- package/src/app/api/hazo_auth/update_user/route.ts +0 -126
- package/src/app/api/hazo_auth/upload_profile_picture/route.ts +0 -268
- package/src/app/api/hazo_auth/user_management/permissions/route.ts +0 -367
- package/src/app/api/hazo_auth/user_management/roles/route.ts +0 -442
- package/src/app/api/hazo_auth/user_management/users/roles/route.ts +0 -367
- package/src/app/api/hazo_auth/user_management/users/route.ts +0 -239
- package/src/app/api/hazo_auth/validate_reset_token/route.ts +0 -83
- package/src/app/api/hazo_auth/verify_email/route.ts +0 -88
- package/src/app/api/migrations/apply/route.ts +0 -91
- package/src/app/favicon.ico +0 -0
- package/src/app/fonts/GeistMonoVF.woff +0 -0
- package/src/app/fonts/GeistVF.woff +0 -0
- package/src/app/globals.css +0 -89
- package/src/app/hazo_auth/forgot_password/forgot_password_page_client.tsx +0 -60
- package/src/app/hazo_auth/forgot_password/page.tsx +0 -24
- package/src/app/hazo_auth/login/login_page_client.tsx +0 -86
- package/src/app/hazo_auth/login/page.tsx +0 -38
- package/src/app/hazo_auth/my_settings/my_settings_page_client.tsx +0 -120
- package/src/app/hazo_auth/my_settings/page.tsx +0 -40
- package/src/app/hazo_auth/register/page.tsx +0 -36
- package/src/app/hazo_auth/register/register_page_client.tsx +0 -81
- package/src/app/hazo_auth/reset_password/page.tsx +0 -29
- package/src/app/hazo_auth/reset_password/reset_password_page_client.tsx +0 -81
- package/src/app/hazo_auth/user_management/page.tsx +0 -14
- package/src/app/hazo_auth/user_management/user_management_page_client.tsx +0 -16
- package/src/app/hazo_auth/verify_email/page.tsx +0 -24
- package/src/app/hazo_auth/verify_email/verify_email_page_client.tsx +0 -60
- package/src/app/hazo_connect/api/sqlite/data/route.ts +0 -203
- package/src/app/hazo_connect/api/sqlite/schema/route.ts +0 -45
- package/src/app/hazo_connect/api/sqlite/tables/route.ts +0 -36
- package/src/app/hazo_connect/sqlite_admin/page.tsx +0 -51
- package/src/app/hazo_connect/sqlite_admin/sqlite-admin-client.tsx +0 -984
- package/src/app/layout.tsx +0 -43
- package/src/app/page.tsx +0 -170
- package/src/components/index.ts +0 -7
- package/src/components/layouts/email_verification/config/email_verification_field_config.ts +0 -86
- package/src/components/layouts/email_verification/hooks/use_email_verification.ts +0 -297
- package/src/components/layouts/email_verification/index.tsx +0 -297
- package/src/components/layouts/forgot_password/config/forgot_password_field_config.ts +0 -58
- package/src/components/layouts/forgot_password/hooks/use_forgot_password_form.ts +0 -179
- package/src/components/layouts/forgot_password/index.tsx +0 -168
- package/src/components/layouts/index.ts +0 -26
- package/src/components/layouts/login/config/login_field_config.ts +0 -67
- package/src/components/layouts/login/hooks/use_login_form.ts +0 -286
- package/src/components/layouts/login/index.tsx +0 -252
- package/src/components/layouts/my_settings/components/editable_field.tsx +0 -177
- package/src/components/layouts/my_settings/components/password_change_dialog.tsx +0 -301
- package/src/components/layouts/my_settings/components/profile_picture_dialog.tsx +0 -385
- package/src/components/layouts/my_settings/components/profile_picture_display.tsx +0 -66
- package/src/components/layouts/my_settings/components/profile_picture_gravatar_tab.tsx +0 -143
- package/src/components/layouts/my_settings/components/profile_picture_library_tab.tsx +0 -311
- package/src/components/layouts/my_settings/components/profile_picture_upload_tab.tsx +0 -341
- package/src/components/layouts/my_settings/config/my_settings_field_config.ts +0 -61
- package/src/components/layouts/my_settings/hooks/use_my_settings.ts +0 -458
- package/src/components/layouts/my_settings/index.tsx +0 -351
- package/src/components/layouts/register/config/register_field_config.ts +0 -101
- package/src/components/layouts/register/hooks/use_register_form.ts +0 -275
- package/src/components/layouts/register/index.tsx +0 -226
- package/src/components/layouts/reset_password/config/reset_password_field_config.ts +0 -86
- package/src/components/layouts/reset_password/hooks/use_reset_password_form.ts +0 -276
- package/src/components/layouts/reset_password/index.tsx +0 -294
- package/src/components/layouts/shared/components/already_logged_in_guard.tsx +0 -95
- package/src/components/layouts/shared/components/auth_page_shell.tsx +0 -36
- package/src/components/layouts/shared/components/field_error_message.tsx +0 -29
- package/src/components/layouts/shared/components/form_action_buttons.tsx +0 -64
- package/src/components/layouts/shared/components/form_field_wrapper.tsx +0 -44
- package/src/components/layouts/shared/components/form_header.tsx +0 -36
- package/src/components/layouts/shared/components/logout_button.tsx +0 -76
- package/src/components/layouts/shared/components/password_field.tsx +0 -72
- package/src/components/layouts/shared/components/profile_pic_menu.tsx +0 -321
- package/src/components/layouts/shared/components/profile_pic_menu_wrapper.tsx +0 -40
- package/src/components/layouts/shared/components/sidebar_layout_wrapper.tsx +0 -214
- package/src/components/layouts/shared/components/standalone_layout_wrapper.tsx +0 -53
- package/src/components/layouts/shared/components/two_column_auth_layout.tsx +0 -44
- package/src/components/layouts/shared/components/unauthorized_guard.tsx +0 -78
- package/src/components/layouts/shared/components/visual_panel.tsx +0 -41
- package/src/components/layouts/shared/config/layout_customization.ts +0 -95
- package/src/components/layouts/shared/data/layout_data_client.ts +0 -19
- package/src/components/layouts/shared/hooks/use_auth_status.ts +0 -103
- package/src/components/layouts/shared/hooks/use_hazo_auth.ts +0 -158
- package/src/components/layouts/shared/index.ts +0 -34
- package/src/components/layouts/shared/utils/ip_address.ts +0 -37
- package/src/components/layouts/shared/utils/validation.ts +0 -66
- package/src/components/layouts/user_management/components/roles_matrix.tsx +0 -607
- package/src/components/layouts/user_management/index.tsx +0 -1295
- package/src/components/ui/alert-dialog.tsx +0 -141
- package/src/components/ui/avatar.tsx +0 -50
- package/src/components/ui/button.tsx +0 -57
- package/src/components/ui/checkbox.tsx +0 -30
- package/src/components/ui/dialog.tsx +0 -122
- package/src/components/ui/dropdown-menu.tsx +0 -201
- package/src/components/ui/hazo_ui_tooltip.tsx +0 -67
- package/src/components/ui/index.ts +0 -22
- package/src/components/ui/input.tsx +0 -22
- package/src/components/ui/label.tsx +0 -26
- package/src/components/ui/separator.tsx +0 -31
- package/src/components/ui/sheet.tsx +0 -139
- package/src/components/ui/sidebar.tsx +0 -773
- package/src/components/ui/skeleton.tsx +0 -15
- package/src/components/ui/sonner.tsx +0 -31
- package/src/components/ui/switch.tsx +0 -29
- package/src/components/ui/table.tsx +0 -120
- package/src/components/ui/tabs.tsx +0 -55
- package/src/components/ui/tooltip.tsx +0 -32
- package/src/components/ui/vertical-tabs.tsx +0 -59
- package/src/hooks/use-mobile.tsx +0 -19
- package/src/index.ts +0 -7
- package/src/lib/already_logged_in_config.server.ts +0 -46
- package/src/lib/app_logger.ts +0 -24
- package/src/lib/auth/auth_cache.ts +0 -220
- package/src/lib/auth/auth_rate_limiter.ts +0 -121
- package/src/lib/auth/auth_types.ts +0 -65
- package/src/lib/auth/auth_utils.server.ts +0 -196
- package/src/lib/auth/hazo_get_auth.server.ts +0 -333
- package/src/lib/auth/index.ts +0 -23
- package/src/lib/auth/server_auth.ts +0 -88
- package/src/lib/auth_utility_config.server.ts +0 -136
- package/src/lib/config/config_loader.server.ts +0 -164
- package/src/lib/email_verification_config.server.ts +0 -32
- package/src/lib/file_types_config.server.ts +0 -25
- package/src/lib/forgot_password_config.server.ts +0 -32
- package/src/lib/hazo_connect_instance.server.ts +0 -101
- package/src/lib/hazo_connect_setup.server.ts +0 -194
- package/src/lib/hazo_connect_setup.ts +0 -54
- package/src/lib/index.ts +0 -44
- package/src/lib/login_config.server.ts +0 -71
- package/src/lib/messages_config.server.ts +0 -45
- package/src/lib/migrations/apply_migration.ts +0 -105
- package/src/lib/my_settings_config.server.ts +0 -135
- package/src/lib/password_requirements_config.server.ts +0 -39
- package/src/lib/profile_pic_menu_config.server.ts +0 -138
- package/src/lib/profile_picture_config.server.ts +0 -56
- package/src/lib/register_config.server.ts +0 -73
- package/src/lib/reset_password_config.server.ts +0 -75
- package/src/lib/services/email_service.ts +0 -581
- package/src/lib/services/email_verification_service.ts +0 -270
- package/src/lib/services/index.ts +0 -15
- package/src/lib/services/login_service.ts +0 -134
- package/src/lib/services/password_change_service.ts +0 -154
- package/src/lib/services/password_reset_service.ts +0 -405
- package/src/lib/services/profile_picture_remove_service.ts +0 -120
- package/src/lib/services/profile_picture_service.ts +0 -215
- package/src/lib/services/profile_picture_source_mapper.ts +0 -62
- package/src/lib/services/registration_service.ts +0 -184
- package/src/lib/services/token_service.ts +0 -240
- package/src/lib/services/user_profiles_service.ts +0 -143
- package/src/lib/services/user_update_service.ts +0 -141
- package/src/lib/ui_shell_config.server.ts +0 -73
- package/src/lib/ui_sizes_config.server.ts +0 -37
- package/src/lib/user_fields_config.server.ts +0 -31
- package/src/lib/user_management_config.server.ts +0 -39
- package/src/lib/utils/api_route_helpers.ts +0 -60
- package/src/lib/utils/error_sanitizer.ts +0 -75
- package/src/lib/utils.ts +0 -11
- package/src/middleware.ts +0 -94
- package/src/routes/index.ts +0 -34
- package/src/server/config/config_loader.ts +0 -496
- package/src/server/index.ts +0 -38
- package/src/server/logging/logger_service.ts +0 -56
- package/src/server/routes/root_router.ts +0 -16
- package/src/server/server.ts +0 -28
- package/src/server/types/app_types.ts +0 -74
- package/src/server/types/express.d.ts +0 -16
- package/src/stories/email_verification_layout.stories.tsx +0 -137
- package/src/stories/forgot_password_layout.stories.tsx +0 -85
- package/src/stories/login_layout.stories.tsx +0 -85
- package/src/stories/project_overview.stories.tsx +0 -33
- package/src/stories/register_layout.stories.tsx +0 -107
- package/tailwind.config.ts +0 -77
- package/tsconfig.build.json +0 -39
- package/tsconfig.json +0 -28
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// file_description: API route for user logout
|
|
2
|
+
// section: imports
|
|
3
|
+
import { NextResponse } from "next/server";
|
|
4
|
+
import { create_app_logger } from "../../../../lib/app_logger";
|
|
5
|
+
import { get_filename, get_line_number } from "../../../../lib/utils/api_route_helpers";
|
|
6
|
+
import { get_auth_cache } from "../../../../lib/auth/auth_cache";
|
|
7
|
+
import { get_auth_utility_config } from "../../../../lib/auth_utility_config.server";
|
|
8
|
+
// section: api_handler
|
|
9
|
+
export async function POST(request) {
|
|
10
|
+
var _a, _b;
|
|
11
|
+
const logger = create_app_logger();
|
|
12
|
+
try {
|
|
13
|
+
// Get user info from cookie before clearing
|
|
14
|
+
const user_email = (_a = request.cookies.get("hazo_auth_user_email")) === null || _a === void 0 ? void 0 : _a.value;
|
|
15
|
+
const user_id = (_b = request.cookies.get("hazo_auth_user_id")) === null || _b === void 0 ? void 0 : _b.value;
|
|
16
|
+
// Clear authentication cookies
|
|
17
|
+
const response = NextResponse.json({
|
|
18
|
+
success: true,
|
|
19
|
+
message: "Logout successful",
|
|
20
|
+
}, { status: 200 });
|
|
21
|
+
// Clear cookies by setting them to expire in the past
|
|
22
|
+
response.cookies.set("hazo_auth_user_email", "", {
|
|
23
|
+
expires: new Date(0),
|
|
24
|
+
path: "/",
|
|
25
|
+
});
|
|
26
|
+
response.cookies.set("hazo_auth_user_id", "", {
|
|
27
|
+
expires: new Date(0),
|
|
28
|
+
path: "/",
|
|
29
|
+
});
|
|
30
|
+
// Invalidate user cache
|
|
31
|
+
if (user_id) {
|
|
32
|
+
try {
|
|
33
|
+
const config = get_auth_utility_config();
|
|
34
|
+
const cache = get_auth_cache(config.cache_max_users, config.cache_ttl_minutes, config.cache_max_age_minutes);
|
|
35
|
+
cache.invalidate_user(user_id);
|
|
36
|
+
}
|
|
37
|
+
catch (cache_error) {
|
|
38
|
+
// Log but don't fail logout if cache invalidation fails
|
|
39
|
+
const cache_error_message = cache_error instanceof Error
|
|
40
|
+
? cache_error.message
|
|
41
|
+
: "Unknown error";
|
|
42
|
+
logger.warn("logout_cache_invalidation_failed", {
|
|
43
|
+
filename: get_filename(),
|
|
44
|
+
line_number: get_line_number(),
|
|
45
|
+
user_id,
|
|
46
|
+
error: cache_error_message,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (user_email || user_id) {
|
|
51
|
+
logger.info("logout_successful", {
|
|
52
|
+
filename: get_filename(),
|
|
53
|
+
line_number: get_line_number(),
|
|
54
|
+
user_id: user_id || "unknown",
|
|
55
|
+
email: user_email || "unknown",
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return response;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
const error_message = error instanceof Error ? error.message : "Unknown error";
|
|
62
|
+
const error_stack = error instanceof Error ? error.stack : undefined;
|
|
63
|
+
logger.error("logout_error", {
|
|
64
|
+
filename: get_filename(),
|
|
65
|
+
line_number: get_line_number(),
|
|
66
|
+
error_message,
|
|
67
|
+
error_stack,
|
|
68
|
+
});
|
|
69
|
+
return NextResponse.json({ error: "Logout failed. Please try again." }, { status: 500 });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/app/api/hazo_auth/me/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIxD,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW,kCAuC7C"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// file_description: API route to get current authenticated user information
|
|
2
|
+
// section: imports
|
|
3
|
+
import { NextResponse } from "next/server";
|
|
4
|
+
import { get_authenticated_user_with_response } from "../../../../lib/auth/auth_utils.server";
|
|
5
|
+
// section: api_handler
|
|
6
|
+
export async function GET(request) {
|
|
7
|
+
try {
|
|
8
|
+
// Use centralized auth utility
|
|
9
|
+
const { auth_result, response } = await get_authenticated_user_with_response(request);
|
|
10
|
+
// If response is provided, it means cookies were cleared (invalid auth)
|
|
11
|
+
if (response) {
|
|
12
|
+
return response;
|
|
13
|
+
}
|
|
14
|
+
// If not authenticated, return false
|
|
15
|
+
if (!auth_result.authenticated) {
|
|
16
|
+
return NextResponse.json({ authenticated: false }, { status: 200 });
|
|
17
|
+
}
|
|
18
|
+
// Return user info
|
|
19
|
+
return NextResponse.json({
|
|
20
|
+
authenticated: true,
|
|
21
|
+
user_id: auth_result.user_id,
|
|
22
|
+
email: auth_result.email,
|
|
23
|
+
name: auth_result.name,
|
|
24
|
+
email_verified: auth_result.email_verified,
|
|
25
|
+
last_logon: auth_result.last_logon,
|
|
26
|
+
profile_picture_url: auth_result.profile_picture_url,
|
|
27
|
+
profile_source: auth_result.profile_source,
|
|
28
|
+
}, { status: 200 });
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
// On error, assume not authenticated
|
|
32
|
+
return NextResponse.json({ authenticated: false }, { status: 200 });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/app/api/hazo_auth/profile_picture/[filename]/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMxD,wBAAsB,GAAG,CACvB,OAAO,EAAE,WAAW,EACpB,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,kCAuD7C"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// file_description: API route to serve uploaded profile pictures
|
|
2
|
+
// section: imports
|
|
3
|
+
import { NextResponse } from "next/server";
|
|
4
|
+
import { get_profile_picture_config } from "../../../../../lib/profile_picture_config.server";
|
|
5
|
+
import fs from "fs";
|
|
6
|
+
import path from "path";
|
|
7
|
+
// section: api_handler
|
|
8
|
+
export async function GET(request, { params }) {
|
|
9
|
+
try {
|
|
10
|
+
const config = get_profile_picture_config();
|
|
11
|
+
if (!config.allow_photo_upload || !config.upload_photo_path) {
|
|
12
|
+
return NextResponse.json({ error: "Profile picture upload is not enabled" }, { status: 404 });
|
|
13
|
+
}
|
|
14
|
+
const filename = params.filename;
|
|
15
|
+
// Validate filename (prevent path traversal)
|
|
16
|
+
if (filename.includes("..") || filename.includes("/") || filename.includes("\\")) {
|
|
17
|
+
return NextResponse.json({ error: "Invalid filename" }, { status: 400 });
|
|
18
|
+
}
|
|
19
|
+
// Resolve upload path
|
|
20
|
+
const uploadPath = path.isAbsolute(config.upload_photo_path)
|
|
21
|
+
? config.upload_photo_path
|
|
22
|
+
: path.resolve(process.cwd(), config.upload_photo_path);
|
|
23
|
+
const filePath = path.join(uploadPath, filename);
|
|
24
|
+
// Check if file exists
|
|
25
|
+
if (!fs.existsSync(filePath)) {
|
|
26
|
+
return NextResponse.json({ error: "File not found" }, { status: 404 });
|
|
27
|
+
}
|
|
28
|
+
// Read file
|
|
29
|
+
const fileBuffer = fs.readFileSync(filePath);
|
|
30
|
+
const fileExt = path.extname(filename).toLowerCase();
|
|
31
|
+
const contentType = fileExt === ".png" ? "image/png" : "image/jpeg";
|
|
32
|
+
// Return file with appropriate content type
|
|
33
|
+
return new NextResponse(fileBuffer, {
|
|
34
|
+
headers: {
|
|
35
|
+
"Content-Type": contentType,
|
|
36
|
+
"Cache-Control": "public, max-age=31536000, immutable",
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
return NextResponse.json({ error: "Failed to serve profile picture" }, { status: 500 });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
2
|
+
export declare function POST(request: NextRequest): Promise<NextResponse<{
|
|
3
|
+
error: string;
|
|
4
|
+
}> | NextResponse<{
|
|
5
|
+
success: boolean;
|
|
6
|
+
message: string;
|
|
7
|
+
user_id: string | undefined;
|
|
8
|
+
}>>;
|
|
9
|
+
//# sourceMappingURL=route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/app/api/hazo_auth/register/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQxD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;;;IAiG9C"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// file_description: API route for user registration using hazo_connect to insert into hazo_users table
|
|
2
|
+
// section: imports
|
|
3
|
+
import { NextResponse } from "next/server";
|
|
4
|
+
import { get_hazo_connect_instance } from "../../../../lib/hazo_connect_instance.server";
|
|
5
|
+
import { create_app_logger } from "../../../../lib/app_logger";
|
|
6
|
+
import { register_user } from "../../../../lib/services/registration_service";
|
|
7
|
+
import { get_filename, get_line_number } from "../../../../lib/utils/api_route_helpers";
|
|
8
|
+
import { sanitize_error_for_user } from "../../../../lib/utils/error_sanitizer";
|
|
9
|
+
// section: api_handler
|
|
10
|
+
export async function POST(request) {
|
|
11
|
+
const logger = create_app_logger();
|
|
12
|
+
try {
|
|
13
|
+
const body = await request.json();
|
|
14
|
+
const { name, email, password, url_on_logon } = body;
|
|
15
|
+
// Validate input
|
|
16
|
+
if (!email || !password) {
|
|
17
|
+
logger.warn("registration_validation_failed", {
|
|
18
|
+
filename: get_filename(),
|
|
19
|
+
line_number: get_line_number(),
|
|
20
|
+
email: email || "missing",
|
|
21
|
+
has_password: !!password,
|
|
22
|
+
});
|
|
23
|
+
return NextResponse.json({ error: "Email and password are required" }, { status: 400 });
|
|
24
|
+
}
|
|
25
|
+
// Validate email format
|
|
26
|
+
const email_pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
27
|
+
if (!email_pattern.test(email)) {
|
|
28
|
+
logger.warn("registration_invalid_email", {
|
|
29
|
+
filename: get_filename(),
|
|
30
|
+
line_number: get_line_number(),
|
|
31
|
+
email,
|
|
32
|
+
});
|
|
33
|
+
return NextResponse.json({ error: "Invalid email address format" }, { status: 400 });
|
|
34
|
+
}
|
|
35
|
+
// Get singleton hazo_connect instance (reuses same connection across all routes)
|
|
36
|
+
const hazoConnect = get_hazo_connect_instance();
|
|
37
|
+
// Register user using the registration service
|
|
38
|
+
const result = await register_user(hazoConnect, {
|
|
39
|
+
email,
|
|
40
|
+
password,
|
|
41
|
+
name,
|
|
42
|
+
url_on_logon,
|
|
43
|
+
});
|
|
44
|
+
if (!result.success) {
|
|
45
|
+
const status_code = result.error === "Email address already registered" ? 409 : 500;
|
|
46
|
+
logger.warn("registration_failed", {
|
|
47
|
+
filename: get_filename(),
|
|
48
|
+
line_number: get_line_number(),
|
|
49
|
+
email,
|
|
50
|
+
error: result.error,
|
|
51
|
+
});
|
|
52
|
+
return NextResponse.json({ error: result.error || "Registration failed" }, { status: status_code });
|
|
53
|
+
}
|
|
54
|
+
logger.info("registration_successful", {
|
|
55
|
+
filename: get_filename(),
|
|
56
|
+
line_number: get_line_number(),
|
|
57
|
+
user_id: result.user_id,
|
|
58
|
+
email,
|
|
59
|
+
has_name: !!name,
|
|
60
|
+
});
|
|
61
|
+
return NextResponse.json({
|
|
62
|
+
success: true,
|
|
63
|
+
message: "Registration successful",
|
|
64
|
+
user_id: result.user_id,
|
|
65
|
+
}, { status: 201 });
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
const user_friendly_error = sanitize_error_for_user(error, {
|
|
69
|
+
logToConsole: true,
|
|
70
|
+
logToLogger: true,
|
|
71
|
+
logger,
|
|
72
|
+
context: {
|
|
73
|
+
filename: get_filename(),
|
|
74
|
+
line_number: get_line_number(),
|
|
75
|
+
operation: "register_api_route",
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
return NextResponse.json({ error: user_friendly_error }, { status: 500 });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/app/api/hazo_auth/remove_profile_picture/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOxD,wBAAsB,MAAM,CAAC,OAAO,EAAE,WAAW;;;;;IA2EhD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// file_description: API route for removing profile pictures
|
|
2
|
+
// section: imports
|
|
3
|
+
import { NextResponse } from "next/server";
|
|
4
|
+
import { get_hazo_connect_instance } from "../../../../lib/hazo_connect_instance.server";
|
|
5
|
+
import { create_app_logger } from "../../../../lib/app_logger";
|
|
6
|
+
import { remove_user_profile_picture } from "../../../../lib/services/profile_picture_remove_service";
|
|
7
|
+
import { get_filename, get_line_number } from "../../../../lib/utils/api_route_helpers";
|
|
8
|
+
// section: api_handler
|
|
9
|
+
export async function DELETE(request) {
|
|
10
|
+
const logger = create_app_logger();
|
|
11
|
+
try {
|
|
12
|
+
// Use centralized auth check
|
|
13
|
+
let user_id;
|
|
14
|
+
try {
|
|
15
|
+
const { require_auth } = await import("../../../../lib/auth/auth_utils.server");
|
|
16
|
+
const user = await require_auth(request);
|
|
17
|
+
user_id = user.user_id;
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (error instanceof Error && error.message === "Authentication required") {
|
|
21
|
+
logger.warn("profile_picture_remove_authentication_failed", {
|
|
22
|
+
filename: get_filename(),
|
|
23
|
+
line_number: get_line_number(),
|
|
24
|
+
error: "User not authenticated",
|
|
25
|
+
});
|
|
26
|
+
return NextResponse.json({ error: "Authentication required" }, { status: 401 });
|
|
27
|
+
}
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
// Get singleton hazo_connect instance
|
|
31
|
+
const hazoConnect = get_hazo_connect_instance();
|
|
32
|
+
// Remove profile picture
|
|
33
|
+
const result = await remove_user_profile_picture(hazoConnect, user_id);
|
|
34
|
+
if (!result.success) {
|
|
35
|
+
logger.warn("profile_picture_remove_failed", {
|
|
36
|
+
filename: get_filename(),
|
|
37
|
+
line_number: get_line_number(),
|
|
38
|
+
user_id,
|
|
39
|
+
error: result.error,
|
|
40
|
+
});
|
|
41
|
+
return NextResponse.json({ error: result.error || "Failed to remove profile picture" }, { status: 400 });
|
|
42
|
+
}
|
|
43
|
+
logger.info("profile_picture_remove_successful", {
|
|
44
|
+
filename: get_filename(),
|
|
45
|
+
line_number: get_line_number(),
|
|
46
|
+
user_id,
|
|
47
|
+
});
|
|
48
|
+
return NextResponse.json({
|
|
49
|
+
success: true,
|
|
50
|
+
message: "Profile picture removed successfully",
|
|
51
|
+
}, { status: 200 });
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
const error_message = error instanceof Error ? error.message : "Unknown error";
|
|
55
|
+
const error_stack = error instanceof Error ? error.stack : undefined;
|
|
56
|
+
logger.error("profile_picture_remove_error", {
|
|
57
|
+
filename: get_filename(),
|
|
58
|
+
line_number: get_line_number(),
|
|
59
|
+
error_message,
|
|
60
|
+
error_stack,
|
|
61
|
+
});
|
|
62
|
+
return NextResponse.json({ error: "Failed to remove profile picture. Please try again." }, { status: 500 });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/app/api/hazo_auth/resend_verification/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOxD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;;IAiG9C"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// file_description: API route for resending email verification using hazo_connect
|
|
2
|
+
// section: imports
|
|
3
|
+
import { NextResponse } from "next/server";
|
|
4
|
+
import { get_hazo_connect_instance } from "../../../../lib/hazo_connect_instance.server";
|
|
5
|
+
import { create_app_logger } from "../../../../lib/app_logger";
|
|
6
|
+
import { resend_verification_email } from "../../../../lib/services/email_verification_service";
|
|
7
|
+
import { get_filename, get_line_number } from "../../../../lib/utils/api_route_helpers";
|
|
8
|
+
// section: api_handler
|
|
9
|
+
export async function POST(request) {
|
|
10
|
+
const logger = create_app_logger();
|
|
11
|
+
try {
|
|
12
|
+
const body = await request.json();
|
|
13
|
+
const { email } = body;
|
|
14
|
+
// Validate input
|
|
15
|
+
if (!email) {
|
|
16
|
+
logger.warn("resend_verification_validation_failed", {
|
|
17
|
+
filename: get_filename(),
|
|
18
|
+
line_number: get_line_number(),
|
|
19
|
+
email: email || "missing",
|
|
20
|
+
});
|
|
21
|
+
return NextResponse.json({ error: "Email is required" }, { status: 400 });
|
|
22
|
+
}
|
|
23
|
+
// Validate email format
|
|
24
|
+
const email_pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
25
|
+
if (!email_pattern.test(email)) {
|
|
26
|
+
logger.warn("resend_verification_invalid_email", {
|
|
27
|
+
filename: get_filename(),
|
|
28
|
+
line_number: get_line_number(),
|
|
29
|
+
email,
|
|
30
|
+
});
|
|
31
|
+
return NextResponse.json({ error: "Invalid email address format" }, { status: 400 });
|
|
32
|
+
}
|
|
33
|
+
// Get singleton hazo_connect instance (reuses same connection across all routes)
|
|
34
|
+
const hazoConnect = get_hazo_connect_instance();
|
|
35
|
+
// Resend verification email using the email verification service
|
|
36
|
+
const result = await resend_verification_email(hazoConnect, {
|
|
37
|
+
email,
|
|
38
|
+
});
|
|
39
|
+
if (!result.success) {
|
|
40
|
+
logger.error("resend_verification_failed", {
|
|
41
|
+
filename: get_filename(),
|
|
42
|
+
line_number: get_line_number(),
|
|
43
|
+
email,
|
|
44
|
+
error: result.error,
|
|
45
|
+
});
|
|
46
|
+
// Return error response (500) when email sending fails
|
|
47
|
+
// This is a technical error, not a security issue, so we can reveal it
|
|
48
|
+
return NextResponse.json({
|
|
49
|
+
success: false,
|
|
50
|
+
error: result.error || "Failed to resend verification email",
|
|
51
|
+
}, { status: 500 });
|
|
52
|
+
}
|
|
53
|
+
logger.info("resend_verification_requested", {
|
|
54
|
+
filename: get_filename(),
|
|
55
|
+
line_number: get_line_number(),
|
|
56
|
+
email,
|
|
57
|
+
});
|
|
58
|
+
// Always return success to prevent email enumeration attacks
|
|
59
|
+
return NextResponse.json({
|
|
60
|
+
success: true,
|
|
61
|
+
message: "If an account with that email exists and is not verified, a verification link has been sent.",
|
|
62
|
+
}, { status: 200 });
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const error_message = error instanceof Error ? error.message : "Unknown error";
|
|
66
|
+
const error_stack = error instanceof Error ? error.stack : undefined;
|
|
67
|
+
logger.error("resend_verification_error", {
|
|
68
|
+
filename: get_filename(),
|
|
69
|
+
line_number: get_line_number(),
|
|
70
|
+
error_message,
|
|
71
|
+
error_stack,
|
|
72
|
+
});
|
|
73
|
+
// Still return 200 OK to prevent email enumeration attacks
|
|
74
|
+
return NextResponse.json({
|
|
75
|
+
success: true,
|
|
76
|
+
message: "If an account with that email exists and is not verified, a verification link has been sent.",
|
|
77
|
+
}, { status: 200 });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/app/api/hazo_auth/reset_password/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQxD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;;IA+F9C"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// file_description: API route for resetting user password using a reset token
|
|
2
|
+
// section: imports
|
|
3
|
+
import { NextResponse } from "next/server";
|
|
4
|
+
import { get_hazo_connect_instance } from "../../../../lib/hazo_connect_instance.server";
|
|
5
|
+
import { reset_password } from "../../../../lib/services/password_reset_service";
|
|
6
|
+
import { create_app_logger } from "../../../../lib/app_logger";
|
|
7
|
+
import { get_password_requirements_config } from "../../../../lib/password_requirements_config.server";
|
|
8
|
+
import { get_filename, get_line_number } from "../../../../lib/utils/api_route_helpers";
|
|
9
|
+
// section: api_handler
|
|
10
|
+
export async function POST(request) {
|
|
11
|
+
const logger = create_app_logger();
|
|
12
|
+
try {
|
|
13
|
+
const body = await request.json();
|
|
14
|
+
const { token, new_password } = body;
|
|
15
|
+
// Validate input
|
|
16
|
+
if (!token) {
|
|
17
|
+
logger.warn("password_reset_validation_failed", {
|
|
18
|
+
filename: get_filename(),
|
|
19
|
+
line_number: get_line_number(),
|
|
20
|
+
error: "Token is required",
|
|
21
|
+
});
|
|
22
|
+
return NextResponse.json({ error: "Token is required" }, { status: 400 });
|
|
23
|
+
}
|
|
24
|
+
if (!new_password) {
|
|
25
|
+
logger.warn("password_reset_validation_failed", {
|
|
26
|
+
filename: get_filename(),
|
|
27
|
+
line_number: get_line_number(),
|
|
28
|
+
error: "New password is required",
|
|
29
|
+
});
|
|
30
|
+
return NextResponse.json({ error: "New password is required" }, { status: 400 });
|
|
31
|
+
}
|
|
32
|
+
// Get singleton hazo_connect instance (reuses same connection across all routes)
|
|
33
|
+
const hazoConnect = get_hazo_connect_instance();
|
|
34
|
+
// Get password requirements from config
|
|
35
|
+
const passwordRequirements = get_password_requirements_config();
|
|
36
|
+
// Reset password using the password reset service
|
|
37
|
+
const result = await reset_password(hazoConnect, {
|
|
38
|
+
token,
|
|
39
|
+
new_password,
|
|
40
|
+
minimum_length: passwordRequirements.minimum_length,
|
|
41
|
+
});
|
|
42
|
+
if (!result.success) {
|
|
43
|
+
logger.warn("password_reset_failed", {
|
|
44
|
+
filename: get_filename(),
|
|
45
|
+
line_number: get_line_number(),
|
|
46
|
+
error: result.error,
|
|
47
|
+
});
|
|
48
|
+
return NextResponse.json({
|
|
49
|
+
success: false,
|
|
50
|
+
error: result.error || "Failed to reset password",
|
|
51
|
+
}, { status: 400 });
|
|
52
|
+
}
|
|
53
|
+
logger.info("password_reset_successful", {
|
|
54
|
+
filename: get_filename(),
|
|
55
|
+
line_number: get_line_number(),
|
|
56
|
+
user_id: result.user_id,
|
|
57
|
+
email: result.email,
|
|
58
|
+
});
|
|
59
|
+
return NextResponse.json({
|
|
60
|
+
success: true,
|
|
61
|
+
message: "Password has been reset successfully",
|
|
62
|
+
}, { status: 200 });
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const error_message = error instanceof Error ? error.message : "Unknown error";
|
|
66
|
+
logger.error("password_reset_error", {
|
|
67
|
+
filename: get_filename(),
|
|
68
|
+
line_number: get_line_number(),
|
|
69
|
+
error: error_message,
|
|
70
|
+
});
|
|
71
|
+
return NextResponse.json({
|
|
72
|
+
success: false,
|
|
73
|
+
error: "An error occurred while resetting your password",
|
|
74
|
+
}, { status: 500 });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
2
|
+
export declare function PATCH(request: NextRequest): Promise<NextResponse<{
|
|
3
|
+
error: string;
|
|
4
|
+
}> | NextResponse<{
|
|
5
|
+
success: boolean;
|
|
6
|
+
message: string;
|
|
7
|
+
email_changed: boolean | undefined;
|
|
8
|
+
}>>;
|
|
9
|
+
//# sourceMappingURL=route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/app/api/hazo_auth/update_user/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQxD,wBAAsB,KAAK,CAAC,OAAO,EAAE,WAAW;;;;;;IAkH/C"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// file_description: API route for updating user profile information
|
|
2
|
+
// section: imports
|
|
3
|
+
import { NextResponse } from "next/server";
|
|
4
|
+
import { get_hazo_connect_instance } from "../../../../lib/hazo_connect_instance.server";
|
|
5
|
+
import { create_app_logger } from "../../../../lib/app_logger";
|
|
6
|
+
import { update_user_profile } from "../../../../lib/services/user_update_service";
|
|
7
|
+
import { get_filename, get_line_number } from "../../../../lib/utils/api_route_helpers";
|
|
8
|
+
import { require_auth } from "../../../../lib/auth/auth_utils.server";
|
|
9
|
+
// section: api_handler
|
|
10
|
+
export async function PATCH(request) {
|
|
11
|
+
const logger = create_app_logger();
|
|
12
|
+
try {
|
|
13
|
+
// Use centralized auth check
|
|
14
|
+
let user_id;
|
|
15
|
+
try {
|
|
16
|
+
const user = await require_auth(request);
|
|
17
|
+
user_id = user.user_id;
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (error instanceof Error && error.message === "Authentication required") {
|
|
21
|
+
logger.warn("user_update_authentication_failed", {
|
|
22
|
+
filename: get_filename(),
|
|
23
|
+
line_number: get_line_number(),
|
|
24
|
+
error: "User not authenticated",
|
|
25
|
+
});
|
|
26
|
+
return NextResponse.json({ error: "Authentication required" }, { status: 401 });
|
|
27
|
+
}
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
const body = await request.json();
|
|
31
|
+
const { name, email, profile_picture_url, profile_source } = body;
|
|
32
|
+
// Validate input (at least one field must be provided)
|
|
33
|
+
if (name === undefined && email === undefined && profile_picture_url === undefined) {
|
|
34
|
+
logger.warn("user_update_validation_failed", {
|
|
35
|
+
filename: get_filename(),
|
|
36
|
+
line_number: get_line_number(),
|
|
37
|
+
error: "No fields to update",
|
|
38
|
+
});
|
|
39
|
+
return NextResponse.json({ error: "At least one field (name, email, or profile_picture_url) must be provided" }, { status: 400 });
|
|
40
|
+
}
|
|
41
|
+
// Get singleton hazo_connect instance
|
|
42
|
+
const hazoConnect = get_hazo_connect_instance();
|
|
43
|
+
// Update user profile
|
|
44
|
+
const result = await update_user_profile(hazoConnect, user_id, {
|
|
45
|
+
name,
|
|
46
|
+
email,
|
|
47
|
+
profile_picture_url,
|
|
48
|
+
profile_source,
|
|
49
|
+
});
|
|
50
|
+
if (!result.success) {
|
|
51
|
+
logger.warn("user_update_failed", {
|
|
52
|
+
filename: get_filename(),
|
|
53
|
+
line_number: get_line_number(),
|
|
54
|
+
error: result.error,
|
|
55
|
+
user_id,
|
|
56
|
+
email_changed: result.email_changed,
|
|
57
|
+
});
|
|
58
|
+
return NextResponse.json({ error: result.error || "Failed to update user profile" }, { status: 400 });
|
|
59
|
+
}
|
|
60
|
+
logger.info("user_update_successful", {
|
|
61
|
+
filename: get_filename(),
|
|
62
|
+
line_number: get_line_number(),
|
|
63
|
+
user_id,
|
|
64
|
+
email_changed: result.email_changed,
|
|
65
|
+
});
|
|
66
|
+
// Create response
|
|
67
|
+
const response = NextResponse.json({
|
|
68
|
+
success: true,
|
|
69
|
+
message: "Profile updated successfully",
|
|
70
|
+
email_changed: result.email_changed,
|
|
71
|
+
}, { status: 200 });
|
|
72
|
+
// If email changed, update the cookie (match login route cookie settings)
|
|
73
|
+
if (result.email_changed && email) {
|
|
74
|
+
response.cookies.set("hazo_auth_user_email", email, {
|
|
75
|
+
httpOnly: true,
|
|
76
|
+
secure: process.env.NODE_ENV === "production",
|
|
77
|
+
sameSite: "lax",
|
|
78
|
+
path: "/",
|
|
79
|
+
maxAge: 60 * 60 * 24 * 30, // 30 days
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return response;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
const error_message = error instanceof Error ? error.message : "Unknown error";
|
|
86
|
+
const error_stack = error instanceof Error ? error.stack : undefined;
|
|
87
|
+
logger.error("user_update_error", {
|
|
88
|
+
filename: get_filename(),
|
|
89
|
+
line_number: get_line_number(),
|
|
90
|
+
error_message,
|
|
91
|
+
error_stack,
|
|
92
|
+
});
|
|
93
|
+
return NextResponse.json({ error: "Failed to update user profile. Please try again." }, { status: 500 });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
2
|
+
export declare function POST(request: NextRequest): Promise<NextResponse<{
|
|
3
|
+
error: string;
|
|
4
|
+
}> | NextResponse<{
|
|
5
|
+
success: boolean;
|
|
6
|
+
profile_picture_url: string;
|
|
7
|
+
message: string;
|
|
8
|
+
}>>;
|
|
9
|
+
//# sourceMappingURL=route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/app/api/hazo_auth/upload_profile_picture/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAaxD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;;;IA2P9C"}
|