Commit Graph
1621 Commits
Author SHA1 Message Date
john-okeefe 5658dc70f4 fix: correct folder path validation error handling in AddLibraryFolder
- Fix scoping issue with err variable in os.Stat check
- Properly check for non-existent vs inaccessible folders
- Use reassignment (=) instead of declaration (:=) since err already declared
2026-01-29 20:20:39 -05:00
john-okeefe 59b32f4827 feat: implement search endpoint with partial match and fuzzy fallback
- Add GET /api/media-items/search endpoint
- Try partial matching first (ILIKE with wildcards)
- Fallback to fuzzy search if no results found
- Return 404 with 'no results found' when no matches
- Limit results to 50 items by default
- Supports search across title, author, series, tags, contributors
- Respects library visibility settings per user
2026-01-29 20:20:35 -05:00
john-okeefe 3145f64a66 feat: add search queries with partial matching and fuzzy fallback
- Add SearchMediaItems query with ILIKE partial matching
- Add SearchMediaItemsFuzzy query with word_similarity()
- Use sqlc.narg() for named parameters (search_pattern, search_query)
- Rank results by relevance: title > author > series > tags
- Fuzzy threshold set to 0.3 for word_similarity
- Generated Go models with proper parameter types
2026-01-29 20:20:30 -05:00
john-okeefe 46fa8f7c55 feat: add pg_trgm extension and GIN indexes for fuzzy search
- Enable pg_trgm extension for trigram-based string matching
- Add GIN indexes on media_items text fields (title, author, series, tags, contributors)
- Supports efficient partial matching and fuzzy search fallback
2026-01-29 20:20:20 -05:00
john-okeefe 0ef661d158 Fix header component rendering in bookshelf and dashboard templates
- Changed Header component calls from text to proper templ syntax (@Header)
- Header now properly renders navigation, search, theme switcher, and user menu
- Fixed both bookshelf.templ and dashboard.templ templates
2026-01-29 17:06:49 -05:00
john-okeefe 183a0b795c Fix /bookshelf route - add direct route with JWT authentication
- Added direct /bookshelf route that works with both Authorization header and cookie token
- Imported missing strings package
- Users can now access /bookshelf directly instead of /api/bookshelf
2026-01-29 16:46:57 -05:00
john-okeefe 535c1a2fa1 docs: replace DEPLOYMENT.md with TROUBLESHOOTING.md and update README
- Remove redundant DEPLOYMENT.md file
- Update README.md to reference TROUBLESHOOTING.md for deployment issues
- Consolidate deployment documentation into comprehensive troubleshooting guide
- Keep essential auto-starting services info in README for quick reference
2026-01-29 16:41:32 -05:00
john-okeefe 85e8a132e2 chore: update template files and clean up session files
- Regenerate all template files after adding header component
- Clean up generated session files
- Templates now use new header component consistently

All templates have been regenerated to include the new
header functionality and updated routing.
2026-01-29 15:57:40 -05:00
john-okeefe 8a9e739439 chore: add generated header.js file
- Add compiled header.js to git ignore
- Required for header functionality to work
- Generated from TypeScript source
2026-01-29 15:56:25 -05:00
john-okeefe c3dcbad177 feat: integrate header component into dashboard page
- Replace navigation bar with Header() component
- Remove duplicate logout function (now in header.js)
- Maintain consistent header across pages
- Update generated template files

This provides consistent navigation and theme switching
functionality across all pages using the reusable header component.
2026-01-29 15:56:18 -05:00
john-okeefe 703daeb32f feat: add homepage auto-redirect for logged-in users
- Add JavaScript to check for valid JWT token on homepage load
- Auto-redirect to /bookshelf if user is already logged in
- Shows login/register form if not authenticated
- Improves UX by taking logged-in users directly to bookshelf

Implementation:
- Fetch /api/auth/profile with stored token
- On success, redirect to /bookshelf
- On failure, silently stay on homepage
- Runs on DOMContentLoaded for fast execution
2026-01-29 15:52:34 -05:00
john-okeefe d9ca3d5a65 feat: add /bookshelf route and update redirects
- Add /bookshelf route as default page for logged-in users
- Update login and register handlers to redirect to /bookshelf
- Update homepage to auto-redirect to /bookshelf when logged in
- Preserve /dashboard route for backward compatibility
- Update test redirects to use /bookshelf

Changes:
- main.go: Add /bookshelf protected route
- auth.go: Change login/register redirects from /api/dashboard to /bookshelf (2 locations)
- edge_cases_test.go: Update test redirect to /bookshelf
- Maintains backward compatibility with existing /dashboard route

This makes the beautiful bookshelf the default landing page
for all authenticated users while keeping the old dashboard accessible.
2026-01-29 15:52:11 -05:00
john-okeefe a0f0156d31 feat: add bookshelf dashboard with visual shelf layout
- Create bookshelf.templ with beautiful visual bookshelf interface
- Implement wooden shelf appearance with CSS gradients
- Add responsive grid layout (2/3/6 columns based on screen size)
- Books display with 3D spine effect and hover animations
- Auto-select first library and load books on page load
- Empty state and loading state handling

Visual Features:
- Wooden shelves with gradient shadows (12px bottom border)
- Books hover with lift (translateY) and rotation effects
- Book covers with aspect ratio 2/3 and inset spine highlight
- Error handling falls back to placeholder-book.svg
- 6 books per shelf for optimal display

JavaScript Features:
- Fetch visible libraries from API
- Populate library selector dropdown
- Load and display media items on shelves
- Handle empty states gracefully
- Book detail placeholder (to be implemented)
2026-01-29 15:51:51 -05:00
john-okeefe 2a91ff9477 feat: add reusable header component with theme switcher
- Add header.templ component with app title, search, theme switcher, user menu
- Implement dropdown menus for theme selection and user actions
- Add wood theme options (Wood Light, Wood Dark, Wood Mahogany)
- Support all existing themes with visual color swatches
- Auto-close dropdowns when clicking outside
- TypeScript header functionality with proper type safety

Features:
- Left: App title "📚 Bookmann" linking to /bookshelf
- Center: Search box (ready for future search functionality)
- Right: Theme switcher button with color dropdown → User icon menu
- User menu includes Settings, Admin Panel (if admin), and Logout
- Theme persistence to localStorage and server via API
2026-01-29 15:51:38 -05:00
john-okeefe 399485d53d fix: handle existing user in integration test setup
- Add fallback to login when user registration returns 409 Conflict
- Prevents empty user token error when test user already exists
- Allows integration tests to run reliably across multiple executions
- Test now attempts to log in with existing credentials if registration fails

This fixes the issue where the test would fail if the user
'integrationuser@test.com' already existed from a previous test run.
2026-01-29 15:51:18 -05:00
john-okeefe 8f739af285 fix: correct UUID format string issues in logging and tests
- Fix scheduler.go log.Printf calls to convert pgtype.UUID to string before formatting
- Fix ebook.go fmt.Printf calls to convert pgtype.UUID to string before formatting
- Add missing Enabled field to rate limiter config in security test
- Prevents format string errors when logging library IDs

This resolves compilation errors where pgtype.UUID was being formatted
with %s which expects a string, not a UUID struct.
2026-01-29 15:51:05 -05:00
john-okeefe 4426cacb46 fix: improve HTMX error detection and remove module exports
- Change from htmx:beforeSwap to htmx:afterSwap event for better error timing
- Simplify event listener setup (removed duplicate handlers)
- Remove 'export {}' statement that was causing syntax errors
- Add proper TypeScript interface for HTMX event details
- Errors now detected after content swap, ensuring accurate error messages
- Toast notifications work correctly for all backend HTTP errors

Resolves JavaScript syntax error on page load and improves error handling.
2026-01-29 14:53:01 -05:00
john-okeefe 95d78158aa fix: configure TypeScript for non-module browser scripts
- Change module setting from 'ES2020' to 'none'
- Remove resolveJsonModule and moduleResolution options (incompatible with module: none)
- Prevents TypeScript from adding 'export {}' statements to compiled JS
- Scripts are loaded as regular JavaScript, not ES modules
- Fixes 'Unexpected token export' error in browser

This allows TypeScript type checking while generating plain JavaScript
that works with traditional script tags in HTML.
2026-01-29 14:52:43 -05:00
john-okeefe b887c38abf refactor: update templates for new frontend structure
- Extract inline JavaScript from index.templ
- Replace with external script include for theme.js
- All templates reference /static/ for assets
- Cleaner separation of concerns between markup and logic
2026-01-29 14:09:29 -05:00
john-okeefe 16cb9bd89a refactor: remove old frontend directory structure
- Remove cmd/server/static/ (moved to web/)
- Remove tailwind.config.js (converted to .ts)
- Clean up obsolete files after reorganization
2026-01-29 14:09:23 -05:00
john-okeefe 4dab173b16 fix: serve static files from web directory
- Update static file serving from 'static' to 'web/static'
- Maintains /static/ URL path for backwards compatibility
- Frontend assets now properly separated from backend code
2026-01-29 14:08:59 -05:00
john-okeefe 201a7d89d8 build: update Dockerfile for TypeScript compilation
- Add npm run build:ts step to compile TypeScript
- Copy web/ directory instead of cmd/server/static/
- Build pipeline now: Go deps → CSS → HTMX → TypeScript → Go binary
- TypeScript compiles to JavaScript before final image build

Integrates TypeScript compilation into container build process.
2026-01-29 14:08:53 -05:00
john-okeefe 84ba9ffbb1 feat: add web frontend directory structure
- Create web/src/ for TypeScript source files
- Create web/static/ for compiled assets and runtime files
- Move input.css and style.css to web/static/
- Add toast.ts - Functional toast notification system
- Add theme.ts - Functional theme management system
- All code uses functional programming (no classes, no OOP)
- TypeScript provides full type safety

Separates frontend code from backend for better organization.
2026-01-29 14:08:44 -05:00
john-okeefe 548343b081 feat: add TypeScript and build configuration
- Add tsconfig.json with ES2020 target and strict mode
- Convert tailwind.config.js to TypeScript
- Update package.json with build scripts:
  - build:ts - Compile TypeScript
  - build:ts:watch - Watch mode for development
  - Updated paths for web/ directory structure
- Set up proper TypeScript compilation pipeline
2026-01-29 14:08:38 -05:00
john-okeefe ee2a74ef2a chore: update .gitignore for Node.js and TypeScript
- Add node_modules/ and npm debug logs
- Add TypeScript build artifacts (*.tsbuildinfo)
- Ignore compiled JS files in web/static/
- Keep htmx.min.js (third-party library)
- Add IDE ignores (.idea, .vscode)
- Add OS ignores (DS_Store, Thumbs.db)
- Add database and uploads directories
- Ignore package-lock.json (use npm shrinkwrap for production if needed)

Standard ignore patterns for modern web development with Go backend.
2026-01-29 14:08:31 -05:00
john-okeefe f48013f80d test: add test tooling and documentation
- Add Makefile with convenient test targets (test, test-integration, test-env-up, test-env-down)
- Add .env.test with test-specific configuration
- Update .env.example with test configuration options and warnings
- Update README.md with comprehensive testing documentation
- Document all environment variables with safety warnings

This makes it easy to run tests without rate limiting issues while
keeping production security intact.
2026-01-29 13:33:38 -05:00
john-okeefe 8126002eb9 test: improve integration test isolation and error handling
- Fix SetLibraryVisibility request format (library_ids -> library_id)
- Fix UpdateReadingProgress HTTP method (POST -> PUT)
- Fix DeleteMediaNote expected status (200 -> 204)
- Add cleanupTestData() helper for better test cleanup
- Improve Setup_CreateDuplicateTestUsers to handle existing data
- Add graceful handling of 409 and 429 responses
- Update password test to create/delete temporary user
- Add test requirements comment at top of file

These changes improve test reliability and reduce flakiness.
2026-01-29 13:33:26 -05:00
john-okeefe 4b8cb58c84 feat: add configurable test mode and rate limiting
- Add TestMode, RateLimitEnabled, RequestsPerMinute to Config
- Add getEnvBool() and getEnvInt() helper functions
- Update rate limiter to support enabled/disabled state
- Pass test environment variables through docker-compose
- Configure rate limiter dynamically in main.go

This allows disabling rate limiting for integration testing while
maintaining security in production environments.
2026-01-29 13:33:18 -05:00
john-okeefe ce0e448e58 refactor: standardize API response formats for list endpoints
- ListLibraries now returns {"data": []} instead of []
- ListUsers now returns {"data": []} instead of []
- ListMediaItems now returns {"data": []} instead of []

This provides consistent response structure across all list endpoints
and aligns with integration test expectations.
2026-01-29 13:33:08 -05:00
john-okeefe 305deac4fd fix: correct type assertions and ISBN type mismatches
- Fix type assertion panics in library.go (lines 58, 109, 237)
  Changed from *database.Users to database.Users to match JWT middleware
- Fix ISBN type mismatch in ebook.go (lines 249, 308)
  Changed from pgtype.Text to string to match database schema
- Fix ISBN type mismatch in ebook_scanner.go (line 421)
  Changed from pgtype.Text to string to match database schema

These changes fix 500 errors in library creation and ebook operations.
2026-01-29 13:32:56 -05:00
john-okeefe 5f355266e4 docs(readme): update README with current project features
- Add ISBN normalization documentation
- Document background scanning and watch mode features
- Add scan settings API endpoints
- Include integration testing section
- Update architecture section with new services
- Document auto-starting services
- Add recently added features section
- Update testing documentation with integration tests
- Enhance security section with ISBN validation
2026-01-29 12:12:13 -05:00
john-okeefe c5c2700311 test(server): add integration tests 2026-01-29 12:08:28 -05:00
john-okeefe 0276e3312c chore(bruno): update Bruno test files with minor formatting improvements 2026-01-29 11:03:14 -05:00
john-okeefe 66f1eb11a0 feat(ebooks): add ISBN normalization and graceful library requirement handling
- Increase ISBN column from VARCHAR(13) to VARCHAR(17) to support ISBN-13 with hyphens
- Add normalize_isbn() database function to automatically remove hyphens and spaces
- Create trigger to auto-normalize ISBNs on INSERT/UPDATE operations
- Update all Ebook and MediaItem queries to use ISBN normalization
- Add GetEbookLibraryID query to check for existing ebook libraries
- Add graceful error handling when no ebook library exists
- Return helpful error message: 'no ebook library found. Please create an ebook library first'
- Create comprehensive tests for ISBN normalization and library selection
- Add Bruno test files for various ISBN formats and error scenarios
- Update documentation with ISBN normalization details
2026-01-29 10:52:14 -05:00
john-okeefe 6ed69005b5 refactor(bruno): standardize all variables to snake_case naming convention
Standardize all Bruno environment variables to use snake_case convention
(aligned with Go naming practices) and remove duplicate camelCase variants.

Changes:
- Environment file cleanup:
  - Remove: baseUrl, ebookid, fakebookid, libraryId, mediaItemId, isVisible, refreshToken
  - Standardize: fakebookid → fake_book_id, isVisible → is_visible, refreshToken → refresh_token
  - All variables now use consistent snake_case format

- Update all Bruno requests to use standardized variables:
  - ebooks: {{ebookid}} → {{ebook_id}}
  - library: {{libraryId}} → {{library_id}}
  - media-items: {{mediaItemId}} → {{media_item_id}}
  - visibility: {{isVisible}} → {{is_visible}}
  - auth: {{refreshToken}} → {{refresh_token}}

Benefits:
- Single source of truth for each variable
- Consistent with Go naming conventions
- No ambiguity about which variable name to use
- Cleaner, more maintainable codebase
2026-01-29 10:06:00 -05:00
john-okeefe 92dbfec27b fix(bruno): add missing variables to environment and remove invalid vars sections
- Add missing variables to Bookmann environment:
  - library_id (snake_case variant)
  - media_item_id (snake_case variant)
  - job_id for scan status tracking
  - baseUrl (camelCase variant for compatibility)
  - refreshToken to secret vars
- Remove invalid vars sections from request files
  - Variables should be referenced directly from environment
  - Vars sections are for request-specific overrides, not env references
- All variables now properly defined and accessible
2026-01-29 09:55:41 -05:00
john-okeefe fb09afea43 test(scanner): update tests for background scanning and watch mode
- Update scan endpoint test to expect HTTP 202 with job ID
- Add tests for new scan job status endpoint
- Add tests for watch mode start/stop/status endpoints
- Update all scanner tests to reflect async behavior
- All tests passing
2026-01-29 09:51:01 -05:00
john-okeefe fc61b6de6e docs(scanner): update Bruno requests for new scanner endpoints
- Update Scan Ebooks.bru to reflect async background scanning
- Add Get Scan Status.bru for checking job progress
- Add Start Watch Mode.bru for instant file monitoring
- Add Stop Watch Mode.bru for stopping library monitoring
- Add Get Watch Mode Status.bru for checking watched libraries
- Document all new endpoints with examples and status codes
2026-01-29 09:50:46 -05:00
john-okeefe 799b640ddd chore(server): integrate request tracing and auto-start services
- Add RequestTracingMiddleware to middleware chain
- Auto-start scheduler for auto-scanning on server boot
- Auto-start watch mode for all libraries with 2-second delay
- Update SetupRoutes to return handler for service management
2026-01-29 09:50:40 -05:00
john-okeefe 30aa3bed2e feat(scanner): integrate background scanning and watch mode
- Update scanner to run asynchronously in background worker pool
- POST /api/scanner/scan now returns immediately with job ID (HTTP 202)
- Add GET /api/scanner/status/:jobId for checking scan job progress
- Integrate watch mode with library system for instant ebook detection
- Auto-start watch mode for all libraries on server startup
- Add endpoints for managing watch mode per library:
  - POST /api/scanner/watch/start
  - POST /api/scanner/watch/stop
  - GET /api/scanner/watch/status
- Track which libraries are currently being watched
- Auto-start scheduler on server boot
2026-01-29 09:50:33 -05:00
john-okeefe 3cff30ea89 feat(middleware): add request tracing and logging middleware
- Add RequestTracingMiddleware for comprehensive HTTP request logging
- Log request ID, timestamp, method, path, user info, duration, status code
- Generate and propagate unique request IDs for tracing
- Structured JSON logging for easy parsing and analysis
- Capture request body, headers, query params, and user context
2026-01-29 09:49:56 -05:00
john-okeefe 07717f4f77 feat(scanner): add background worker and scheduler for async scanning
- Add Worker service with configurable worker pool for async job processing
- Implement job queue with status tracking (pending, running, completed, failed, cancelled)
- Add Scheduler service for auto-scanning based on user scan settings
- Check scan settings every 5 minutes and schedule background scan jobs
- Support multiple libraries with individual scan frequencies (15-1440 minutes)
2026-01-29 09:49:48 -05:00
john-okeefe 233cb22a4f chore: ignore compiled server binary 2026-01-29 09:23:34 -05:00
john-okeefe b5d57f5c8a docs(readme): update security features documentation
- Document password complexity requirements
- Document account lockout mechanism (5 attempts, 15 min)
- Update JWT expiration to 1 hour
- Add refresh token documentation (7-day expiration)
- Add token management endpoints
- Enhance security features section
- Document standardized error responses
2026-01-29 09:23:34 -05:00
john-okeefe 2c560c411e feat(middleware): add transaction and error handling support
- Add transaction manager for multi-step database operations
- Add standardized error response middleware
- Add HTTPError type for typed errors
- Add RespondWithError and RespondWithHTTPError helpers
- Support automatic rollback on errors
2026-01-29 09:23:34 -05:00
john-okeefe 3b0b18770e chore(db): regenerate database code after schema changes
- Regenerate queries.sql.go with refresh token queries
- Update models.go with RefreshTokens type
- Update querier.go with new query methods
- Update db.go with generated code
2026-01-29 09:23:34 -05:00
john-okeefe 1e04ef4861 test(security): add comprehensive security tests
- Test password complexity requirements
- Test account lockout mechanism
- Test rate limiting functionality
- Test JWT expiration (1 hour)
- Test refresh token expiration (7 days)
- Test password requirements list
- Verify transaction manager and error handler types
- All tests passing
2026-01-29 09:23:34 -05:00
john-okeefe 311361a2ed feat(security): add password complexity validator
- Implement strict password requirements:
  - Minimum 8 characters
  - At least one uppercase letter
  - At least one lowercase letter
  - At least one number
  - At least one special character
- Add custom validator for Echo integration
- Add GetPasswordRequirements helper function
- Add ValidatePassword function for manual validation
2026-01-29 09:23:34 -05:00
john-okeefe db18aa5e5e docs: update README with new security features
Document new security and validation features:
- Rate limiting on auth endpoints
- Improved input validation
- Pagination limits
- Path validation
- Role normalization

Updates reflect the security improvements made to the application
2026-01-29 09:23:34 -05:00
john-okeefe 11ea4588d1 test: add comprehensive test suite covering all failure points
Added 157+ tests across 8 test files:
- registration_test.go: 19 registration and 10 login scenarios
- ebook_test.go: 40 ebook and media management tests
- user_test.go: 35 user profile and account management tests
- library_test_comprehensive.go: 25 library management tests
- edge_cases_test.go: 30+ security and edge case tests
- new_fixes_test.go: tests for new security fixes
- test_helpers.go: shared test utilities

Test Coverage:
- Authentication & authorization
- Input validation (email, username, password)
- Role-based access control
- Pagination and filtering
- Error handling and edge cases
- Security scenarios (SQL injection, XSS)

Documentation:
- TEST_COVERAGE.md: detailed test documentation
- ANALYSIS.md: comprehensive analysis of issues found

All tests pass successfully
2026-01-29 09:23:34 -05:00