Commit Graph
10 Commits
Author SHA1 Message Date
john-okeefe 1069c82e81 docs(dashboard): refactor to unified collections architecture
BREAKING CHANGES:
- Remove smart_section_types table entirely
- Use collections table for both system defaults and user sections
- Add user_id (nullable), query_type, priority, is_system_collection to collections
- Pre-seed 4 system collections (user_id = NULL): continue-reading, recently-added, recently-read, not-started

FEATURES:
- System collections are now editable by users
- Per-collection restore functionality (restore-system-collection endpoint)
- Single query type for all dashboard items (unified approach)

UPDATES:
- Database schema changes for collections table
- Service layer methods updated (RestoreSystemCollection instead of RestoreSystemCollections)
- API handler with per-collection restore endpoint
- Templates updated with collection terminology
- TypeScript types updated (8 fields instead of 11, type values: 'system'/'user')
- Field names updated: hidden_collections, collection_order
- All tests updated for new architecture

BENEFITS:
- Simpler data model (single table, single concept)
- System defaults use same code path as user collections
- Users can customize system collections
- Easy reset with per-collection restore buttons
2026-02-19 11:42:13 -05:00
john-okeefe 6d9b1e065e docs: add custom section builder and backend testing to Carousel dashboard
- Add custom section builder functionality (Phase 9.3)
  - Template for creating filter-based sections with auto-assign rules
  - Dynamic rule builder UI (field, operator, value, priority)
  - Preview functionality to see matching books before creating
  - Integration with existing collections API

- Add TypeScript implementation (Phase 10.3)
  - web/src/custom-section-builder.ts
  - Procedural style with event delegation
  - Rule collection, preview, and form submission
  - No duplicate event listeners (delegation only)

- Add backend testing suite (Phase 12)
  - Unit tests for dashboard service (filter, reorder)
  - Unit tests for dashboard handler (buildSections, helpers)
  - Integration tests with test_helpers for API endpoints
  - Integration tests for custom collections with auto-assign
  - Coverage requirements (>80%)

- Add collections preview endpoint
  - POST /api/collections/preview
  - Evaluates auto-assign rules against library items
  - Returns matching books for preview

- Add /custom-section route
  - GET route for custom section builder page
  - SSR rendering with libraries selector
  - Linked from dashboard settings modal

- Update database schema
  - Keep smart_section_types table for 4 default smart sections
  - Add collection_items.excluded column for user overrides
  - Index on excluded items for performance

- Update verification checklist
  - Section 2.2: Add collection_items.excluded verification
  - Section 3.4: Add auto-assign rule evaluation verification
  - Section 6.3: Add collections preview endpoint verification
  - Section 8.5: Add custom section builder template verification
  - Section 9.4: Add custom section builder TypeScript verification
  - Section 14.4: Add backend tests verification

- Fix duplicate event listener issue
  - Removed duplicate change listener for library selector
  - Rely on event delegation only for consistency

- Fix buildJSONSections type safety
  - Now reuses buildSections() instead of map[string]interface{}
  - Better type safety and code reuse

Timeline: 3-4 days dashboard implementation + comprehensive testing
2026-02-18 21:39:37 -05:00
john-okeefe 8d37df249d docs(dashboard): update Carousel plan for post-TypeScript conversion
Major updates:
- Reduce smart sections from 5 to 4 (removed 'In Progress')
  - Continue Reading: 0% < progress < 100%
  - Recently Added: newest items
  - Recently Read: progress >= 100%
  - Not Started: progress = 0% or no record

- Update paths from web/ts/ to web/src/ structure
- Add handler types instead of duplicate template types
- Types defined in internal/handlers/dashboard.go
- Templates import handlers.SectionData, handlers.BookInfo directly

New features:
- Drag-and-drop section reordering
- Section visibility toggles
- Items per section slider
- Manual progress marking (mark as read/unread)

TypeScript updates:
- Use (window as any).api from web/src/api.ts
- Use (window as any).showToast from web/src/toast.ts
- Import types from web/src/types/dashboard.d.ts
- Event delegation via data-action attributes

Add verification checklist for comprehensive plan review:
- Type definition verification against actual API responses
- API contract and endpoint verification
- Cross-reference verification for template-handler types
- Progressive enhancement testing
- Build and deployment verification
2026-02-18 16:42:54 -05:00
john-okeefe 0e386ca87f docs(dashboard): use existing test helpers and document automatic cleanup
Fixed integration tests to use existing helpers from test_helpers.go:

Changes:
- Replace getUserUUIDFromToken() with getTestUserID(t, db) helper 
- Replace parseUUID() with uuid.MustParse() 
- Add explicit comments about automatic cleanup via t.Cleanup() 

Test Helpers Used (all from test_helpers.go):
- setupTestServer(t) - creates test server with automatic cleanup
- loginTestUser(t, ts, db) - logs in admin user
- loginRegularUser(t, ts, db) - logs in regular user
- setupDeviceTest(t) - creates server + user + device + library
- getTestUserID(t, db) - gets/creates admin test user UUID
- uuid.MustParse() - parses UUID strings

Cleanup Pattern:
- Automatic via t.Cleanup() inside setupTestServer()
- Registered automatically when setupTestServer() is called
- No manual defer setup.Close() needed
- Runs even if test fails or panics
- Cleanup order: queue → connections → server → database

Dashboard-Specific Helper:
- updateDashboardPreferences() - only for dashboard testing
- Saves dashboard preferences for test scenarios

Benefits:
- Uses proven, existing helpers (no reinventing the wheel)
- Automatic cleanup prevents resource leaks
- Follows project testing patterns exactly
- Less custom code = fewer bugs
2026-02-17 22:31:38 -05:00
john-okeefe ac88031855 docs(dashboard): document test helpers and cleanup patterns
Added comprehensive documentation of available test helpers:

Available Helpers (from test_helpers.go):
- setupTestServer(t) - Creates test server with auto cleanup via t.Cleanup()
- loginTestUser(t, ts, db) - Logs in admin user, returns JWT token
- loginRegularUser(t, ts, db) - Logs in regular user, returns JWT token
- setupDeviceTest(t) - Creates server + user + device + library
- getTestUserID(t, db) - Gets/creates admin test user UUID
- getRegularUserID(t, db) - Gets/creates regular test user UUID

TestServerSetup Structure:
- Server *httptest.Server
- DB *database.Queries
- DBPool *pgxpool.Pool
- Config *config.Config
- ConnManager, QueueProcessor
- Auto cleanup via t.Cleanup()

Cleanup Pattern:
- Automatic cleanup registered in setupTestServer()
- Runs even if test fails or panics
- Order: queue processor → connection manager → HTTP server → database pool
- No manual defer setup.Close() needed

Updated Integration Tests:
- Added proper imports (database, uuid, pgtype)
- Documented available helpers
- Removed custom helpers that don't exist
- Uses existing project patterns

This ensures developers know what helpers are available and how to use them correctly.
2026-02-17 22:27:51 -05:00
john-okeefe c775ed0a8e docs(dashboard): add comprehensive unit and integration test phases
Phase 14: Unit Tests (2-3 hours)
- Service layer tests (dashboard_service_test.go)
  - filterHiddenSections() - tests no filters, one hidden, multiple hidden
  - reorderSections() - tests default order, custom order, partial order
- Handler helper tests (dashboard_test.go)
  - getSectionType() - smart vs collection sections
  - getSectionTitle() - all smart sections and collections
  - getSectionIcon() - icons for all sections
  - getSectionViewAllURL() - URLs for all sections
- Table-driven tests for multiple scenarios
- Uses testify/assert
- Skips database-dependent tests (use integration tests instead)

Phase 15: Integration Tests (2-3 hours)
- File: cmd/server/tests/dashboard_test.go
- Uses setupTestServer(t) helper from test_helpers.go
- Tests /api/dashboard/sections JSON endpoint:
  - Three-context testing (no auth, user, admin)
  - Missing library_id → 400
  - Invalid library_id → 400
  - With limit parameter
- Tests user preferences:
  - Hidden sections filtered correctly
  - Custom order applied correctly
- Tests SSR /dashboard page:
  - Returns HTML with dashboard elements
  - Requires auth
- Helper functions:
  - updateDashboardPreferences()
  - getUserUUIDFromToken()
  - parseUUID()

Testing Strategy:
- Unit tests alongside source files (project convention)
- Integration tests in cmd/server/tests/ (project convention)
- setupTestServer() helper creates full test environment
- Uses loginTestUser(), loginRegularUser(), setupDeviceTest()
- Follows existing patterns from auth_test.go, collections_bulk_test.go

Updated Timeline: 23-31 days total (added 4-6 hours for testing)

Benefits:
- Comprehensive test coverage before production
- Catches regressions in user preferences logic
- Validates API endpoint behavior across contexts
- Ensures SSR and JSON return consistent data
- Follows project testing conventions
2026-02-17 22:25:48 -05:00
john-okeefe d981fdf517 docs(dashboard): update Carousel plan with API endpoint and user preferences
Major architectural improvements:

1. Add generic /api/dashboard/sections JSON endpoint
   - Created internal/handlers/dashboard.go (new file)
   - Created internal/router/dashboard.go (new file)
   - Single source of truth for web UI, mobile apps, plugins
   - Follows existing handler/router pattern

2. Update DashboardService to apply user preferences
   - GetSectionItems() now accepts sectionOrder and hiddenSections
   - filterHiddenSections() removes user's hidden sections
   - reorderSections() applies user's custom order
   - Ensures consistent behavior across all clients

3. Separate concerns properly
   - API handlers in internal/handlers/dashboard.go
   - SSR routes remain in internal/router/frontend.go
   - Both use same DashboardService (single source of truth)

4. Reorganize implementation phases
   - Phase 1-3: Database, service, queries
   - Phase 4-6: Handler, router, frontend routes
   - Phase 7-9: Templates and settings
   - Phase 10-11: TypeScript modules
   - Phase 12-13: Documentation and testing

5. Add documentation
   - docs/developer/api/dashboard.md (API reference)
   - docs/user/dashboard.md (user guide)

6. Bruno tests already exist
   - bruno/dashboard/ has 5 comprehensive test files
   - Three-context testing (no user, user, admin)
   - No additional tests needed

Benefits:
- Uniform dashboard across web, mobile, plugins
- Single source of truth (no duplicate logic)
- User preferences respected by all clients
- Follows established project patterns
- Comprehensive test coverage

Timeline: Updated to reflect 13 phases (19-25 days total with TypeScript)
2026-02-17 22:20:54 -05:00
john-okeefe 3758532d31 docs(dashboard): update plan to support post-TypeScript conversion patterns
- Add prerequisites section (TypeScript conversion must be completed first)
- Update execution order: TypeScript (16-21 days) then dashboard (3-4 days)
- Revise Phase 7 TypeScript implementation:
  - Change file locations from web/src/ to web/ts/features/dashboard/
  - Replace inline onclick with data-action attributes
  - Use shared apiClient instead of raw fetch()
  - Add event delegation with on() utility
  - Import showToast from core instead of global
  - Add type definitions matching Go handlers
- Update templates to load new TypeScript module paths
- Add summary of key changes from original plan
- Ensure consistency with TypeScript Conversion Plan patterns
2026-02-17 21:58:37 -05:00
john-okeefe 17ce558522 docs(dashboard): refactor Carousel dashboard plan to align with guidelines
Major restructuring of the dashboard implementation plan to better match project guidelines:

- Change from handler types to template types (SectionData, BookCardData)
- Update from TypeScript to inline JavaScript matching existing pattern
- Change from separate handlers to inline routes in frontend.go
- Refactor service to return raw data (handler formats for templates)
- Add Settings template implementation
- Update TypeScript files to use IIFE pattern with window exports
- Change from .bru files to OpenCollection YAML .yml files
- Add Bruno tests note indicating tests already exist in bruno/dashboard/

This aligns the plan with actual project patterns and reduces architectural divergence.
2026-02-17 20:24:29 -05:00
john-okeefe 96730d9475 docs: add Carousel dashboard implementation plan 2026-02-17 17:00:46 -05:00