hazo_auth 1.4.2 → 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/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/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/hooks/use-mobile.d.ts.map +1 -1
- package/dist/hooks/use-mobile.js +17 -3
- 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/package.json +12 -17
- 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 -36
- package/tsconfig.json +0 -28
|
@@ -0,0 +1,708 @@
|
|
|
1
|
+
# hazo_auth Setup Checklist
|
|
2
|
+
|
|
3
|
+
This checklist provides step-by-step instructions for setting up the `hazo_auth` package in your Next.js project. AI assistants can follow this guide to ensure complete and correct setup.
|
|
4
|
+
|
|
5
|
+
## Pre-flight Checks
|
|
6
|
+
|
|
7
|
+
Before starting, verify your project meets these requirements:
|
|
8
|
+
|
|
9
|
+
- [ ] Node.js 18+ installed
|
|
10
|
+
- [ ] Project uses Next.js 14+ with App Router
|
|
11
|
+
- [ ] npm or pnpm package manager
|
|
12
|
+
- [ ] Project has `app/` directory (Next.js App Router structure)
|
|
13
|
+
|
|
14
|
+
**Verify Node.js version:**
|
|
15
|
+
```bash
|
|
16
|
+
node --version
|
|
17
|
+
# Expected: v18.x.x or higher
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Phase 1: Installation & Config Files
|
|
23
|
+
|
|
24
|
+
### Step 1.1: Install the package
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm install hazo_auth
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Verify installation:**
|
|
31
|
+
```bash
|
|
32
|
+
ls node_modules/hazo_auth/package.json
|
|
33
|
+
# Expected: file exists
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Step 1.2: Copy configuration files
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
cp node_modules/hazo_auth/hazo_auth_config.example.ini ./hazo_auth_config.ini
|
|
40
|
+
cp node_modules/hazo_auth/hazo_notify_config.example.ini ./hazo_notify_config.ini
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Verify config files exist:**
|
|
44
|
+
```bash
|
|
45
|
+
ls -la hazo_auth_config.ini hazo_notify_config.ini
|
|
46
|
+
# Expected: both files exist in project root
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Step 1.3: Configure database connection
|
|
50
|
+
|
|
51
|
+
Edit `hazo_auth_config.ini`:
|
|
52
|
+
|
|
53
|
+
**For SQLite (development):**
|
|
54
|
+
```ini
|
|
55
|
+
[hazo_connect]
|
|
56
|
+
type = sqlite
|
|
57
|
+
sqlite_path = ./data/hazo_auth.sqlite
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**For PostgreSQL (production):**
|
|
61
|
+
```ini
|
|
62
|
+
[hazo_connect]
|
|
63
|
+
type = postgrest
|
|
64
|
+
postgrest_url = https://your-postgrest-url.com
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Step 1.4: Configure UI shell mode
|
|
68
|
+
|
|
69
|
+
Edit `hazo_auth_config.ini`:
|
|
70
|
+
```ini
|
|
71
|
+
[hazo_auth__ui_shell]
|
|
72
|
+
# Use 'standalone' for consuming projects (inherits your app's layout)
|
|
73
|
+
# Use 'test_sidebar' only for hazo_auth package development
|
|
74
|
+
layout_mode = standalone
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Checklist:**
|
|
78
|
+
- [ ] `hazo_auth_config.ini` exists in project root
|
|
79
|
+
- [ ] `hazo_notify_config.ini` exists in project root
|
|
80
|
+
- [ ] Database type configured (sqlite or postgrest)
|
|
81
|
+
- [ ] UI shell mode set to `standalone`
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Phase 2: Environment Variables
|
|
86
|
+
|
|
87
|
+
### Step 2.1: Create .env.local file
|
|
88
|
+
|
|
89
|
+
Create `.env.local` in your project root:
|
|
90
|
+
|
|
91
|
+
```env
|
|
92
|
+
# Required for email functionality (Zeptomail)
|
|
93
|
+
ZEPTOMAIL_API_KEY=your_zeptomail_api_key_here
|
|
94
|
+
|
|
95
|
+
# Required for PostgreSQL/PostgREST (if using)
|
|
96
|
+
HAZO_CONNECT_POSTGREST_API_KEY=your_postgrest_api_key_here
|
|
97
|
+
|
|
98
|
+
# Required for JWT authentication
|
|
99
|
+
JWT_SECRET=your_secure_random_string_at_least_32_characters
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Generate a secure JWT secret:**
|
|
103
|
+
```bash
|
|
104
|
+
openssl rand -base64 32
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Step 2.2: Configure email settings
|
|
108
|
+
|
|
109
|
+
Edit `hazo_notify_config.ini`:
|
|
110
|
+
```ini
|
|
111
|
+
[emailer]
|
|
112
|
+
emailer_module = zeptoemail_api
|
|
113
|
+
from_email = noreply@yourdomain.com
|
|
114
|
+
from_name = Your App Name
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**Checklist:**
|
|
118
|
+
- [ ] `.env.local` file created
|
|
119
|
+
- [ ] `ZEPTOMAIL_API_KEY` set (or email will not work)
|
|
120
|
+
- [ ] `JWT_SECRET` set
|
|
121
|
+
- [ ] `from_email` configured in `hazo_notify_config.ini`
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Phase 3: Database Setup
|
|
126
|
+
|
|
127
|
+
### Option A: SQLite (Development)
|
|
128
|
+
|
|
129
|
+
Create the data directory:
|
|
130
|
+
```bash
|
|
131
|
+
mkdir -p data
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
The SQLite database will be created automatically on first use if using hazo_connect's SQLite adapter.
|
|
135
|
+
|
|
136
|
+
**Manual creation (if needed):**
|
|
137
|
+
```bash
|
|
138
|
+
# Create database with initial schema
|
|
139
|
+
cat << 'EOF' | sqlite3 data/hazo_auth.sqlite
|
|
140
|
+
CREATE TABLE IF NOT EXISTS hazo_users (
|
|
141
|
+
id TEXT PRIMARY KEY,
|
|
142
|
+
email_address TEXT NOT NULL UNIQUE,
|
|
143
|
+
password_hash TEXT NOT NULL,
|
|
144
|
+
name TEXT,
|
|
145
|
+
email_verified INTEGER NOT NULL DEFAULT 0,
|
|
146
|
+
is_active INTEGER NOT NULL DEFAULT 1,
|
|
147
|
+
login_attempts INTEGER NOT NULL DEFAULT 0,
|
|
148
|
+
last_logon TEXT,
|
|
149
|
+
profile_picture_url TEXT,
|
|
150
|
+
profile_source TEXT,
|
|
151
|
+
mfa_secret TEXT,
|
|
152
|
+
url_on_logon TEXT,
|
|
153
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
154
|
+
changed_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
CREATE TABLE IF NOT EXISTS hazo_refresh_tokens (
|
|
158
|
+
id TEXT PRIMARY KEY,
|
|
159
|
+
user_id TEXT NOT NULL REFERENCES hazo_users(id) ON DELETE CASCADE,
|
|
160
|
+
token_hash TEXT NOT NULL,
|
|
161
|
+
token_type TEXT NOT NULL,
|
|
162
|
+
expires_at TEXT NOT NULL,
|
|
163
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
CREATE TABLE IF NOT EXISTS hazo_permissions (
|
|
167
|
+
id TEXT PRIMARY KEY,
|
|
168
|
+
permission_name TEXT NOT NULL UNIQUE,
|
|
169
|
+
description TEXT,
|
|
170
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
171
|
+
changed_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
CREATE TABLE IF NOT EXISTS hazo_roles (
|
|
175
|
+
id TEXT PRIMARY KEY,
|
|
176
|
+
role_name TEXT NOT NULL UNIQUE,
|
|
177
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
178
|
+
changed_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
CREATE TABLE IF NOT EXISTS hazo_role_permissions (
|
|
182
|
+
role_id TEXT NOT NULL REFERENCES hazo_roles(id) ON DELETE CASCADE,
|
|
183
|
+
permission_id TEXT NOT NULL REFERENCES hazo_permissions(id) ON DELETE CASCADE,
|
|
184
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
185
|
+
changed_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
186
|
+
PRIMARY KEY (role_id, permission_id)
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
CREATE TABLE IF NOT EXISTS hazo_user_roles (
|
|
190
|
+
user_id TEXT NOT NULL REFERENCES hazo_users(id) ON DELETE CASCADE,
|
|
191
|
+
role_id TEXT NOT NULL REFERENCES hazo_roles(id) ON DELETE CASCADE,
|
|
192
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
193
|
+
changed_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
194
|
+
PRIMARY KEY (user_id, role_id)
|
|
195
|
+
);
|
|
196
|
+
EOF
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**Verify SQLite database:**
|
|
200
|
+
```bash
|
|
201
|
+
sqlite3 data/hazo_auth.sqlite ".tables"
|
|
202
|
+
# Expected: hazo_users hazo_refresh_tokens hazo_permissions hazo_roles hazo_role_permissions hazo_user_roles
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Option B: PostgreSQL (Production)
|
|
206
|
+
|
|
207
|
+
Run this SQL script in your PostgreSQL database:
|
|
208
|
+
|
|
209
|
+
```sql
|
|
210
|
+
-- Create enum type
|
|
211
|
+
CREATE TYPE hazo_enum_profile_source_enum AS ENUM ('gravatar', 'custom', 'predefined');
|
|
212
|
+
|
|
213
|
+
-- Create users table
|
|
214
|
+
CREATE TABLE hazo_users (
|
|
215
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
216
|
+
email_address TEXT NOT NULL UNIQUE,
|
|
217
|
+
password_hash TEXT NOT NULL,
|
|
218
|
+
name TEXT,
|
|
219
|
+
email_verified BOOLEAN NOT NULL DEFAULT FALSE,
|
|
220
|
+
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
|
221
|
+
login_attempts INTEGER NOT NULL DEFAULT 0,
|
|
222
|
+
last_logon TIMESTAMP WITH TIME ZONE,
|
|
223
|
+
profile_picture_url TEXT,
|
|
224
|
+
profile_source hazo_enum_profile_source_enum,
|
|
225
|
+
mfa_secret TEXT,
|
|
226
|
+
url_on_logon TEXT,
|
|
227
|
+
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
228
|
+
changed_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
|
|
229
|
+
);
|
|
230
|
+
CREATE INDEX idx_hazo_users_email ON hazo_users(email_address);
|
|
231
|
+
|
|
232
|
+
-- Create refresh tokens table
|
|
233
|
+
CREATE TABLE hazo_refresh_tokens (
|
|
234
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
235
|
+
user_id UUID NOT NULL REFERENCES hazo_users(id) ON DELETE CASCADE,
|
|
236
|
+
token_hash TEXT NOT NULL,
|
|
237
|
+
token_type TEXT NOT NULL,
|
|
238
|
+
expires_at TIMESTAMP WITH TIME ZONE NOT NULL,
|
|
239
|
+
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
|
|
240
|
+
);
|
|
241
|
+
CREATE INDEX idx_hazo_refresh_tokens_user_id ON hazo_refresh_tokens(user_id);
|
|
242
|
+
CREATE INDEX idx_hazo_refresh_tokens_token_type ON hazo_refresh_tokens(token_type);
|
|
243
|
+
|
|
244
|
+
-- Create permissions table
|
|
245
|
+
CREATE TABLE hazo_permissions (
|
|
246
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
247
|
+
permission_name TEXT NOT NULL UNIQUE,
|
|
248
|
+
description TEXT,
|
|
249
|
+
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
250
|
+
changed_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
|
|
251
|
+
);
|
|
252
|
+
|
|
253
|
+
-- Create roles table
|
|
254
|
+
CREATE TABLE hazo_roles (
|
|
255
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
256
|
+
role_name TEXT NOT NULL UNIQUE,
|
|
257
|
+
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
258
|
+
changed_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
|
|
259
|
+
);
|
|
260
|
+
|
|
261
|
+
-- Create role-permissions junction table
|
|
262
|
+
CREATE TABLE hazo_role_permissions (
|
|
263
|
+
role_id UUID NOT NULL REFERENCES hazo_roles(id) ON DELETE CASCADE,
|
|
264
|
+
permission_id UUID NOT NULL REFERENCES hazo_permissions(id) ON DELETE CASCADE,
|
|
265
|
+
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
266
|
+
changed_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
267
|
+
PRIMARY KEY (role_id, permission_id)
|
|
268
|
+
);
|
|
269
|
+
CREATE INDEX idx_hazo_role_permissions_role_id ON hazo_role_permissions(role_id);
|
|
270
|
+
CREATE INDEX idx_hazo_role_permissions_permission_id ON hazo_role_permissions(permission_id);
|
|
271
|
+
|
|
272
|
+
-- Create user-roles junction table
|
|
273
|
+
CREATE TABLE hazo_user_roles (
|
|
274
|
+
user_id UUID NOT NULL REFERENCES hazo_users(id) ON DELETE CASCADE,
|
|
275
|
+
role_id UUID NOT NULL REFERENCES hazo_roles(id) ON DELETE CASCADE,
|
|
276
|
+
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
277
|
+
changed_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
278
|
+
PRIMARY KEY (user_id, role_id)
|
|
279
|
+
);
|
|
280
|
+
CREATE INDEX idx_hazo_user_roles_user_id ON hazo_user_roles(user_id);
|
|
281
|
+
CREATE INDEX idx_hazo_user_roles_role_id ON hazo_user_roles(role_id);
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
**Verify PostgreSQL tables:**
|
|
285
|
+
```sql
|
|
286
|
+
SELECT table_name FROM information_schema.tables WHERE table_name LIKE 'hazo_%';
|
|
287
|
+
-- Expected: 6 tables listed
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**Checklist:**
|
|
291
|
+
- [ ] Database created (SQLite file or PostgreSQL)
|
|
292
|
+
- [ ] All 6 tables exist: `hazo_users`, `hazo_refresh_tokens`, `hazo_permissions`, `hazo_roles`, `hazo_role_permissions`, `hazo_user_roles`
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
## Phase 4: API Routes
|
|
297
|
+
|
|
298
|
+
Create API route files in your project. Each file re-exports handlers from hazo_auth.
|
|
299
|
+
|
|
300
|
+
### Step 4.1: Generate routes automatically (Recommended)
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
npx hazo_auth generate-routes
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
This creates all required API routes automatically.
|
|
307
|
+
|
|
308
|
+
### Step 4.2: Manual route creation (Alternative)
|
|
309
|
+
|
|
310
|
+
If automatic generation doesn't work, create these files manually:
|
|
311
|
+
|
|
312
|
+
**Required routes (create all of these):**
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
app/api/hazo_auth/
|
|
316
|
+
├── login/route.ts
|
|
317
|
+
├── register/route.ts
|
|
318
|
+
├── logout/route.ts
|
|
319
|
+
├── me/route.ts
|
|
320
|
+
├── forgot_password/route.ts
|
|
321
|
+
├── reset_password/route.ts
|
|
322
|
+
├── verify_email/route.ts
|
|
323
|
+
├── resend_verification/route.ts
|
|
324
|
+
├── update_user/route.ts
|
|
325
|
+
├── change_password/route.ts
|
|
326
|
+
├── upload_profile_picture/route.ts
|
|
327
|
+
├── remove_profile_picture/route.ts
|
|
328
|
+
├── library_photos/route.ts
|
|
329
|
+
├── get_auth/route.ts
|
|
330
|
+
├── validate_reset_token/route.ts
|
|
331
|
+
└── profile_picture/
|
|
332
|
+
└── [filename]/route.ts
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**Example route file content:**
|
|
336
|
+
|
|
337
|
+
`app/api/hazo_auth/login/route.ts`:
|
|
338
|
+
```typescript
|
|
339
|
+
export { POST } from "hazo_auth/server/routes/login";
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
`app/api/hazo_auth/register/route.ts`:
|
|
343
|
+
```typescript
|
|
344
|
+
export { POST } from "hazo_auth/server/routes/register";
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
`app/api/hazo_auth/logout/route.ts`:
|
|
348
|
+
```typescript
|
|
349
|
+
export { POST } from "hazo_auth/server/routes/logout";
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
`app/api/hazo_auth/me/route.ts`:
|
|
353
|
+
```typescript
|
|
354
|
+
export { GET } from "hazo_auth/server/routes/me";
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
`app/api/hazo_auth/forgot_password/route.ts`:
|
|
358
|
+
```typescript
|
|
359
|
+
export { POST } from "hazo_auth/server/routes/forgot_password";
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
`app/api/hazo_auth/reset_password/route.ts`:
|
|
363
|
+
```typescript
|
|
364
|
+
export { POST } from "hazo_auth/server/routes/reset_password";
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
`app/api/hazo_auth/verify_email/route.ts`:
|
|
368
|
+
```typescript
|
|
369
|
+
export { GET } from "hazo_auth/server/routes/verify_email";
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
`app/api/hazo_auth/resend_verification/route.ts`:
|
|
373
|
+
```typescript
|
|
374
|
+
export { POST } from "hazo_auth/server/routes/resend_verification";
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
`app/api/hazo_auth/update_user/route.ts`:
|
|
378
|
+
```typescript
|
|
379
|
+
export { PATCH } from "hazo_auth/server/routes/update_user";
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
`app/api/hazo_auth/change_password/route.ts`:
|
|
383
|
+
```typescript
|
|
384
|
+
export { POST } from "hazo_auth/server/routes/change_password";
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
`app/api/hazo_auth/upload_profile_picture/route.ts`:
|
|
388
|
+
```typescript
|
|
389
|
+
export { POST } from "hazo_auth/server/routes/upload_profile_picture";
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
`app/api/hazo_auth/remove_profile_picture/route.ts`:
|
|
393
|
+
```typescript
|
|
394
|
+
export { DELETE } from "hazo_auth/server/routes/remove_profile_picture";
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
`app/api/hazo_auth/library_photos/route.ts`:
|
|
398
|
+
```typescript
|
|
399
|
+
export { GET } from "hazo_auth/server/routes/library_photos";
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
`app/api/hazo_auth/get_auth/route.ts`:
|
|
403
|
+
```typescript
|
|
404
|
+
export { POST } from "hazo_auth/server/routes/get_auth";
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
`app/api/hazo_auth/validate_reset_token/route.ts`:
|
|
408
|
+
```typescript
|
|
409
|
+
export { POST } from "hazo_auth/server/routes/validate_reset_token";
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
`app/api/hazo_auth/profile_picture/[filename]/route.ts`:
|
|
413
|
+
```typescript
|
|
414
|
+
export { GET } from "hazo_auth/server/routes/profile_picture_filename";
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
**Checklist:**
|
|
418
|
+
- [ ] All 16 API route files created
|
|
419
|
+
- [ ] Each file exports the correct HTTP method (POST, GET, PATCH, DELETE)
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
## Phase 5: Page Routes
|
|
424
|
+
|
|
425
|
+
Create page files for each auth flow.
|
|
426
|
+
|
|
427
|
+
### Step 5.1: Create auth pages
|
|
428
|
+
|
|
429
|
+
**Login page** - `app/(auth)/login/page.tsx`:
|
|
430
|
+
```typescript
|
|
431
|
+
import { LoginLayout } from "hazo_auth/components/layouts/login";
|
|
432
|
+
|
|
433
|
+
export default function LoginPage() {
|
|
434
|
+
return <LoginLayout />;
|
|
435
|
+
}
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
**Register page** - `app/(auth)/register/page.tsx`:
|
|
439
|
+
```typescript
|
|
440
|
+
import { RegisterLayout } from "hazo_auth/components/layouts/register";
|
|
441
|
+
|
|
442
|
+
export default function RegisterPage() {
|
|
443
|
+
return <RegisterLayout />;
|
|
444
|
+
}
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
**Forgot password page** - `app/(auth)/forgot-password/page.tsx`:
|
|
448
|
+
```typescript
|
|
449
|
+
import { ForgotPasswordLayout } from "hazo_auth/components/layouts/forgot_password";
|
|
450
|
+
|
|
451
|
+
export default function ForgotPasswordPage() {
|
|
452
|
+
return <ForgotPasswordLayout />;
|
|
453
|
+
}
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
**Reset password page** - `app/(auth)/reset-password/page.tsx`:
|
|
457
|
+
```typescript
|
|
458
|
+
import { ResetPasswordLayout } from "hazo_auth/components/layouts/reset_password";
|
|
459
|
+
|
|
460
|
+
export default function ResetPasswordPage() {
|
|
461
|
+
return <ResetPasswordLayout />;
|
|
462
|
+
}
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
**Email verification page** - `app/(auth)/verify-email/page.tsx`:
|
|
466
|
+
```typescript
|
|
467
|
+
import { EmailVerificationLayout } from "hazo_auth/components/layouts/email_verification";
|
|
468
|
+
|
|
469
|
+
export default function VerifyEmailPage() {
|
|
470
|
+
return <EmailVerificationLayout />;
|
|
471
|
+
}
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
**My settings page** - `app/(auth)/my-settings/page.tsx`:
|
|
475
|
+
```typescript
|
|
476
|
+
import { MySettingsLayout } from "hazo_auth/components/layouts/my_settings";
|
|
477
|
+
|
|
478
|
+
export default function MySettingsPage() {
|
|
479
|
+
return <MySettingsLayout />;
|
|
480
|
+
}
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
### Step 5.2: Create layout for auth pages (optional)
|
|
484
|
+
|
|
485
|
+
`app/(auth)/layout.tsx`:
|
|
486
|
+
```typescript
|
|
487
|
+
export default function AuthLayout({
|
|
488
|
+
children,
|
|
489
|
+
}: {
|
|
490
|
+
children: React.ReactNode;
|
|
491
|
+
}) {
|
|
492
|
+
return (
|
|
493
|
+
<div className="min-h-screen flex items-center justify-center bg-background">
|
|
494
|
+
{children}
|
|
495
|
+
</div>
|
|
496
|
+
);
|
|
497
|
+
}
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
**Checklist:**
|
|
501
|
+
- [ ] Login page created (`/login`)
|
|
502
|
+
- [ ] Register page created (`/register`)
|
|
503
|
+
- [ ] Forgot password page created (`/forgot-password`)
|
|
504
|
+
- [ ] Reset password page created (`/reset-password`)
|
|
505
|
+
- [ ] Email verification page created (`/verify-email`)
|
|
506
|
+
- [ ] My settings page created (`/my-settings`)
|
|
507
|
+
|
|
508
|
+
---
|
|
509
|
+
|
|
510
|
+
## Phase 6: Verification Tests
|
|
511
|
+
|
|
512
|
+
Run these tests to verify your setup is working correctly.
|
|
513
|
+
|
|
514
|
+
### Test 1: API Health Check
|
|
515
|
+
|
|
516
|
+
```bash
|
|
517
|
+
curl -s http://localhost:3000/api/hazo_auth/me | jq
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
**Expected response:**
|
|
521
|
+
```json
|
|
522
|
+
{
|
|
523
|
+
"authenticated": false
|
|
524
|
+
}
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
### Test 2: Registration API
|
|
528
|
+
|
|
529
|
+
```bash
|
|
530
|
+
curl -X POST http://localhost:3000/api/hazo_auth/register \
|
|
531
|
+
-H "Content-Type: application/json" \
|
|
532
|
+
-d '{"email":"test@example.com","password":"TestPass123!","name":"Test User"}'
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
**Expected response:**
|
|
536
|
+
```json
|
|
537
|
+
{
|
|
538
|
+
"success": true,
|
|
539
|
+
"message": "Registration successful. Please check your email to verify your account."
|
|
540
|
+
}
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
### Test 3: Email Sending
|
|
544
|
+
|
|
545
|
+
After registration, check the inbox for `test@example.com` for a verification email.
|
|
546
|
+
|
|
547
|
+
**If email not received, check:**
|
|
548
|
+
- `ZEPTOMAIL_API_KEY` is set in `.env.local`
|
|
549
|
+
- `from_email` is configured and verified in Zeptomail
|
|
550
|
+
- Check server logs for email errors
|
|
551
|
+
|
|
552
|
+
### Test 4: Login API
|
|
553
|
+
|
|
554
|
+
```bash
|
|
555
|
+
curl -X POST http://localhost:3000/api/hazo_auth/login \
|
|
556
|
+
-H "Content-Type: application/json" \
|
|
557
|
+
-d '{"email":"test@example.com","password":"TestPass123!"}'
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
**Expected response (success):**
|
|
561
|
+
```json
|
|
562
|
+
{
|
|
563
|
+
"success": true,
|
|
564
|
+
"user": {
|
|
565
|
+
"id": "...",
|
|
566
|
+
"email": "test@example.com",
|
|
567
|
+
"name": "Test User"
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
### Test 5: Profile Picture Library
|
|
573
|
+
|
|
574
|
+
```bash
|
|
575
|
+
curl -s http://localhost:3000/api/hazo_auth/library_photos | jq
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
**Expected response:**
|
|
579
|
+
```json
|
|
580
|
+
{
|
|
581
|
+
"photos": [
|
|
582
|
+
{"url": "/profile_pictures/library/...", "name": "..."},
|
|
583
|
+
...
|
|
584
|
+
]
|
|
585
|
+
}
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
**If library photos not showing:**
|
|
589
|
+
- Copy profile pictures from `node_modules/hazo_auth/public/profile_pictures/library/` to `public/profile_pictures/library/`
|
|
590
|
+
|
|
591
|
+
### Test 6: Visit Pages in Browser
|
|
592
|
+
|
|
593
|
+
Start your dev server:
|
|
594
|
+
```bash
|
|
595
|
+
npm run dev
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
Visit each page and verify it loads:
|
|
599
|
+
- [ ] `http://localhost:3000/login` - Login form displays
|
|
600
|
+
- [ ] `http://localhost:3000/register` - Registration form displays
|
|
601
|
+
- [ ] `http://localhost:3000/forgot-password` - Forgot password form displays
|
|
602
|
+
- [ ] `http://localhost:3000/my-settings` - Settings page displays (after login)
|
|
603
|
+
|
|
604
|
+
---
|
|
605
|
+
|
|
606
|
+
## Troubleshooting
|
|
607
|
+
|
|
608
|
+
### Issue: Email not sending
|
|
609
|
+
|
|
610
|
+
**Symptoms:** Registration succeeds but no email received.
|
|
611
|
+
|
|
612
|
+
**Solutions:**
|
|
613
|
+
1. Check `ZEPTOMAIL_API_KEY` is set in `.env.local`
|
|
614
|
+
2. Verify `from_email` in `hazo_notify_config.ini` is authorized in Zeptomail
|
|
615
|
+
3. Check server console for error messages
|
|
616
|
+
4. Verify `emailer_module` is set to `zeptoemail_api`
|
|
617
|
+
|
|
618
|
+
### Issue: Profile pictures not showing
|
|
619
|
+
|
|
620
|
+
**Symptoms:** Avatar shows fallback initials, library photos empty.
|
|
621
|
+
|
|
622
|
+
**Solutions:**
|
|
623
|
+
1. Copy library photos:
|
|
624
|
+
```bash
|
|
625
|
+
mkdir -p public/profile_pictures/library
|
|
626
|
+
cp -r node_modules/hazo_auth/public/profile_pictures/library/* public/profile_pictures/library/
|
|
627
|
+
```
|
|
628
|
+
2. Verify `library_photos` API route exists
|
|
629
|
+
3. Check file permissions on `public/profile_pictures/`
|
|
630
|
+
|
|
631
|
+
### Issue: Database connection failed
|
|
632
|
+
|
|
633
|
+
**Symptoms:** API returns 500 errors, "database connection failed" in logs.
|
|
634
|
+
|
|
635
|
+
**Solutions:**
|
|
636
|
+
1. Verify `hazo_auth_config.ini` has correct database settings
|
|
637
|
+
2. For SQLite: ensure `data/` directory exists and is writable
|
|
638
|
+
3. For PostgreSQL: verify connection string and credentials
|
|
639
|
+
4. Check `HAZO_CONNECT_POSTGREST_API_KEY` is set
|
|
640
|
+
|
|
641
|
+
### Issue: "Module not found" errors
|
|
642
|
+
|
|
643
|
+
**Symptoms:** Import errors when running the app.
|
|
644
|
+
|
|
645
|
+
**Solutions:**
|
|
646
|
+
1. Ensure `hazo_auth` is installed: `npm install hazo_auth`
|
|
647
|
+
2. Clear node_modules and reinstall: `rm -rf node_modules && npm install`
|
|
648
|
+
3. Verify you're importing from correct paths (see Phase 5)
|
|
649
|
+
|
|
650
|
+
### Issue: API routes return 404
|
|
651
|
+
|
|
652
|
+
**Symptoms:** Calls to `/api/hazo_auth/*` return 404.
|
|
653
|
+
|
|
654
|
+
**Solutions:**
|
|
655
|
+
1. Run `npx hazo_auth generate-routes` to create routes
|
|
656
|
+
2. Verify route files exist in `app/api/hazo_auth/`
|
|
657
|
+
3. Check Next.js is detecting routes: `npm run dev` and watch console
|
|
658
|
+
4. Ensure route files export correct HTTP methods
|
|
659
|
+
|
|
660
|
+
### Issue: Authentication not persisting
|
|
661
|
+
|
|
662
|
+
**Symptoms:** User logs in but immediately shows as logged out.
|
|
663
|
+
|
|
664
|
+
**Solutions:**
|
|
665
|
+
1. Verify `JWT_SECRET` is set in `.env.local`
|
|
666
|
+
2. Check cookies are being set (inspect browser devtools > Application > Cookies)
|
|
667
|
+
3. Ensure API routes are on same domain (no CORS issues)
|
|
668
|
+
|
|
669
|
+
---
|
|
670
|
+
|
|
671
|
+
## Final Checklist
|
|
672
|
+
|
|
673
|
+
**Configuration:**
|
|
674
|
+
- [ ] `hazo_auth_config.ini` configured
|
|
675
|
+
- [ ] `hazo_notify_config.ini` configured
|
|
676
|
+
- [ ] `.env.local` with all required variables
|
|
677
|
+
|
|
678
|
+
**Database:**
|
|
679
|
+
- [ ] Database created and accessible
|
|
680
|
+
- [ ] All 6 tables exist
|
|
681
|
+
|
|
682
|
+
**API Routes:**
|
|
683
|
+
- [ ] All 16 API routes created
|
|
684
|
+
- [ ] `/api/hazo_auth/me` returns `{"authenticated": false}`
|
|
685
|
+
|
|
686
|
+
**Pages:**
|
|
687
|
+
- [ ] All 6 auth pages created
|
|
688
|
+
- [ ] Pages render without errors
|
|
689
|
+
|
|
690
|
+
**Features:**
|
|
691
|
+
- [ ] Registration works
|
|
692
|
+
- [ ] Email verification sends
|
|
693
|
+
- [ ] Login works
|
|
694
|
+
- [ ] Profile pictures display
|
|
695
|
+
- [ ] Settings page accessible
|
|
696
|
+
|
|
697
|
+
---
|
|
698
|
+
|
|
699
|
+
## Quick Setup Command
|
|
700
|
+
|
|
701
|
+
For AI assistants, here's a single command to verify setup status:
|
|
702
|
+
|
|
703
|
+
```bash
|
|
704
|
+
npx hazo_auth validate
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
This will check all configuration and report any issues.
|
|
708
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/app/api/hazo_auth/change_password/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAUxD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;;IAsH9C"}
|