mirror of
https://github.com/kikootwo/ReadMeABook.git
synced 2026-06-03 04:40:09 +00:00
178 lines
7.9 KiB
Markdown
178 lines
7.9 KiB
Markdown
# Settings Pages
|
|
|
|
**Status:** ✅ Implemented
|
|
|
|
Single tabbed interface for admins to view/modify system configuration post-setup with mandatory validation before saving.
|
|
|
|
## Sections
|
|
|
|
1. **Plex** - URL, token (masked), library ID
|
|
2. **Prowlarr** - URL, API key (masked), indexer selection with priority, seeding time, RSS monitoring toggle
|
|
3. **Download Client** - Type, URL, credentials (masked)
|
|
4. **Paths** - Download + media directories
|
|
5. **BookDate** - AI provider, API key (encrypted), model selection, library scope, custom prompt, swipe history
|
|
6. **Account** - Local admin password change (only visible to setup admin)
|
|
|
|
## Validation Flow
|
|
|
|
**Plex, Download Client, Paths:**
|
|
1. User modifies settings (URL, credentials, paths)
|
|
2. User clicks "Test Connection" or "Test Paths"
|
|
3. System validates settings
|
|
4. On success: "Save Changes" button enabled
|
|
5. On failure: Error shown, "Save Changes" remains disabled
|
|
|
|
**Prowlarr (special handling):**
|
|
1. **On tab load:** Current indexer configuration loaded from database automatically
|
|
2. **Changing indexer settings** (enable/disable, priority, seeding time, RSS):
|
|
- No test required
|
|
- Can save immediately if URL/API key unchanged
|
|
3. **Changing URL or API key:**
|
|
- Validation required before saving
|
|
- User clicks "Test Connection"
|
|
- On success: Indexers refresh automatically, "Save Changes" enabled
|
|
4. **Button text adapts:**
|
|
- "Test Connection" when URL/API key changed
|
|
- "Refresh Indexers" when connection info unchanged
|
|
|
|
**BookDate (Admin Settings):**
|
|
1. **On tab load:** Current BookDate global configuration loaded from database automatically
|
|
2. **Changing AI provider:** Resets model selection
|
|
3. **Test connection:** Required to fetch available models before saving
|
|
4. **Changing API key:** Must test connection to verify and fetch models
|
|
5. **Saving configuration:** Validates all fields (provider, API key, model)
|
|
6. **Note:** Library scope and custom prompt are now per-user settings (configured in BookDate page)
|
|
7. **Clear swipe history:** Confirmation dialog, removes ALL users' swipes and cached recommendations
|
|
8. No "Save Changes" button - uses dedicated "Save BookDate Configuration" button
|
|
9. Accessible to admins only
|
|
|
|
**BookDate (User Preferences - in `/bookdate` page):**
|
|
1. **Settings icon:** Opens modal with per-user preferences
|
|
2. **Library scope:** Full library or rated books only (default: full)
|
|
3. **Custom prompt:** Optional text (max 1000 chars, default: blank)
|
|
4. **Save:** Updates user preferences immediately
|
|
5. Accessible to all authenticated users
|
|
|
|
**Account (local admin only):**
|
|
1. Local admin can change password
|
|
2. Requires: current password, new password (min 8 chars), confirmation
|
|
3. No "Save Changes" button - uses dedicated "Change Password" button
|
|
4. Form clears after successful change
|
|
5. Only visible to users with `isSetupAdmin=true` AND `plexId` starts with `local-`
|
|
|
|
**Validation state resets when:**
|
|
- Plex: URL or token modified
|
|
- Prowlarr: URL or API key modified (NOT indexer config)
|
|
- Download Client: URL, username, or password modified
|
|
- Paths: Directory paths modified
|
|
- Account: No validation required (password change is immediate)
|
|
|
|
## API Endpoints
|
|
|
|
**GET /api/admin/settings**
|
|
- Returns all config (passwords masked as ••••)
|
|
- Admin auth required
|
|
|
|
**GET /api/admin/settings/prowlarr/indexers**
|
|
- Returns current indexer configuration merged with available Prowlarr indexers
|
|
- Loads saved settings (enabled, priority, seeding time, RSS) from database
|
|
- Merges with live indexer list from Prowlarr
|
|
- Admin auth required
|
|
|
|
**PUT /api/admin/settings/plex**
|
|
- Updates Plex config
|
|
- Requires prior successful test if URL/token changed
|
|
|
|
**PUT /api/admin/settings/prowlarr**
|
|
- Updates Prowlarr URL and API key
|
|
- Requires prior successful test if values changed
|
|
|
|
**PUT /api/admin/settings/prowlarr/indexers**
|
|
- Updates indexer configuration (enabled, priority, seeding time, RSS)
|
|
- No test required if URL/API key unchanged
|
|
- Saves only enabled indexers to database
|
|
|
|
**PUT /api/admin/settings/download-client**
|
|
- Updates download client config
|
|
- Requires prior successful test if credentials changed
|
|
|
|
**PUT /api/admin/settings/paths**
|
|
- Updates paths
|
|
- Requires prior successful test if paths changed
|
|
|
|
**Test Endpoints (authenticated, handle masked values):**
|
|
- POST /api/admin/settings/test-plex - Tests Plex connection, uses stored token if masked, returns libraries
|
|
- POST /api/admin/settings/test-prowlarr - Tests connection, uses stored API key if masked, returns indexers
|
|
- POST /api/admin/settings/test-download-client - Tests qBittorrent/Transmission, uses stored password if masked
|
|
- POST /api/setup/test-paths - Validates paths writable (no sensitive data, reuses wizard endpoint)
|
|
|
|
**BookDate Endpoints:**
|
|
- GET /api/bookdate/config - Get global BookDate configuration (API key excluded, admin only)
|
|
- POST /api/bookdate/config - Save/update global BookDate configuration (admin only)
|
|
- POST /api/bookdate/test-connection - Test AI provider connection and fetch available models
|
|
- DELETE /api/bookdate/swipes - Clear ALL users' swipe history and cached recommendations (admin only)
|
|
- GET /api/bookdate/preferences - Get user's preferences (libraryScope, customPrompt)
|
|
- PUT /api/bookdate/preferences - Update user's preferences (all authenticated users)
|
|
|
|
**Account Endpoints:**
|
|
- POST /api/admin/settings/change-password - Change local admin password (local admin only)
|
|
- GET /api/auth/is-local-admin - Check if current user is local admin (returns `{isLocalAdmin: boolean}`)
|
|
|
|
## Features
|
|
|
|
- Password visibility toggle
|
|
- Mandatory "Test Connection" buttons per tab
|
|
- "Save Changes" disabled until current tab validated
|
|
- Test result display (success/error messages)
|
|
- Toast notifications for save confirmations
|
|
- Form validation with Zod schemas
|
|
- Reuses setup wizard connection test endpoints
|
|
- Visual warning when validation required
|
|
|
|
## Security
|
|
|
|
- Admin role required
|
|
- Passwords never returned in GET (masked)
|
|
- Connection tests validate before saving
|
|
- HTTPS required in production
|
|
|
|
## Validation
|
|
|
|
**Plex:** Valid HTTP/HTTPS URL, non-empty token, library ID selected
|
|
**Prowlarr:** Valid URL, non-empty API key, ≥1 indexer configured, priority 1-25, seedingTimeMinutes ≥0, rssEnabled boolean
|
|
**Download Client:** Valid URL, credentials required, type must be 'qbittorrent' or 'transmission'
|
|
**Paths:** Absolute paths, exist or creatable, writable, cannot be same directory
|
|
|
|
## Tech Stack
|
|
|
|
- React Hook Form
|
|
- Zod validation
|
|
- Tab/sidebar navigation
|
|
- Toast notifications
|
|
|
|
## Fixed Issues ✅
|
|
|
|
**1. Settings Save Without Validation**
|
|
- Issue: Users could save invalid/broken settings (wrong URLs, bad credentials, invalid paths)
|
|
- Cause: No validation enforcement before save
|
|
- Fix: Added mandatory "Test Connection"/"Test Paths" buttons per tab, disabled "Save Changes" until validated
|
|
- Behavior: Now matches wizard flow - test first, then save
|
|
|
|
**2. Testing with Masked Credentials**
|
|
- Issue: Test connection failed because it was testing with masked `••••` values instead of actual credentials
|
|
- Cause: Test endpoints didn't handle masked values, tried to authenticate with literal `••••••••`
|
|
- Fix: Created authenticated test endpoints that read actual values from database when masked values detected
|
|
- Endpoints: `/api/admin/settings/test-plex`, `/test-prowlarr`, `/test-download-client`
|
|
- Behavior: Users can test without re-entering unchanged passwords
|
|
|
|
**3. Indexer Configuration Workflow**
|
|
- Issue: Indexer settings required re-testing before saving, current settings weren't loading, workflow confusing
|
|
- Cause: Indexers only loaded after test, changing any indexer setting invalidated connection
|
|
- Fix:
|
|
- Load current indexer config from database on tab load (GET `/api/admin/settings/prowlarr/indexers`)
|
|
- Track which values changed (URL/API key vs indexer config)
|
|
- Only require test if URL/API key changed
|
|
- Allow saving indexer config changes without re-testing connection
|
|
- Button text adapts: "Test Connection" vs "Refresh Indexers"
|
|
- Behavior: Natural workflow - see current settings, modify indexers, save immediately
|