- Backend: Add server-side validation with go-playground/validator/v10 - Frontend: Add toast notifications for API errors with @zerodevx/svelte-toast - UI: Complete Tokyo Night theme redesign with modern animations - Docs: Update COMPLETE_DOCUMENTATION.md and README.md with all enhancements - Validation: Email format, password strength, and input sanitization - UX: Real-time error feedback, loading states, and responsive design
25 KiB
Ebook Reader and Library Manager - Complete Documentation
Overview
A self-hosted ebook reader and library management system built with:
- Backend: Go API with Echo framework, PostgreSQL database with sqlc code generation, serving static frontend
- Frontend: Svelte with Vite, TypeScript, and TailwindCSS (built to static files)
- Database: PostgreSQL with migrations
- Deployment: Fully containerized with Docker and Docker Compose (single Go service)
Features
- Ebook library management (CRUD operations)
- Reading progress tracking
- Responsive web interface
- RESTful API (accessible by web, mobile, etc.)
- Type-safe database queries with sqlc
- Modern UI with TailwindCSS
- Single-container deployment (Go serves everything)
Quick Start
Prerequisites
- Docker and Docker Compose
- Git (for cloning)
Running the Application
- Clone the repository:
git clone <repository-url>
cd bookmann
- Start all services:
docker-compose up --build
- Access the application:
- Application: http://localhost:8765 (serves both frontend and API)
- Database: localhost:5432 (postgres/password)
Project Structure
bookmann/
├── backend/
│ ├── cmd/server/
│ │ └── main.go # Application entry point
│ ├── internal/
│ │ ├── config/
│ │ │ └── config.go # Configuration management
│ │ ├── database/
│ │ │ ├── connection.go # Database connection (pgx pool)
│ │ │ └── queries/
│ │ │ └── queries.sql # SQL queries for sqlc
│ │ └── handlers/
│ │ └── ebook.go # HTTP handlers
│ ├── migrations/
│ │ └── 001_create_tables.up.sql # Database schema
│ ├── Dockerfile # Backend Docker image (builds frontend)
│ ├── go.mod # Go dependencies
│ ├── go.sum
│ └── sqlc.yaml # sqlc configuration
├── frontend/
│ ├── src/
│ │ ├── lib/
│ │ │ ├── api.ts # API client with auth & error handling
│ │ │ ├── auth.ts # Auth state management
│ │ │ └── toast.ts # Toast notification utilities
│ │ ├── routes/
│ │ │ ├── login/
│ │ │ │ └── +page.svelte # Login page (Tokyo Night theme)
│ │ │ ├── register/
│ │ │ │ └── +page.svelte # Registration page (Tokyo Night theme)
│ │ │ ├── +layout.svelte # Root layout with auth & toasts
│ │ │ └── +page.svelte # Library page (Tokyo Night theme)
│ │ ├── app.css # Global styles with Tokyo Night theme
│ │ ├── app.d.ts # TypeScript declarations
│ │ └── app.html # HTML template with Inter font
│ ├── package.json # Node dependencies with toast library
│ ├── svelte.config.js # SvelteKit config (adapter-static)
│ ├── tailwind.config.js # Tailwind config with Tokyo Night colors
│ ├── postcss.config.js # PostCSS configuration (Tailwind v4)
├── docker-compose.yml # Multi-service orchestration (db + backend only)
├── README.md # Basic README
└── .gitignore
Backend Documentation
Go Modules
Dependencies in go.mod:
- github.com/labstack/echo/v4 v4.11.3 - Web framework
- github.com/jackc/pgx/v5 v5.4.3 - PostgreSQL driver (pgx pool)
- github.com/golang-jwt/jwt/v5 v5.3.0 - JWT handling
- github.com/google/uuid v1.4.0 - UUID generation
- github.com/go-playground/validator/v10 v10.30.1 - Input validation
- golang.org/x/crypto v0.46.0 - Cryptographic functions (bcrypt)
Configuration
Environment variables (with defaults):
- SERVER_PORT=8765
- DATABASE_HOST=localhost
- DATABASE_PORT=5432
- DATABASE_USER=postgres
- DATABASE_PASSWORD=password
- DATABASE_NAME=ebookdb
- JWT_SECRET=your-secret-key
- UPLOAD_PATH=./uploads
Database Schema
Tables:
users
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(255) UNIQUE NOT NULL,
username VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
ebooks
CREATE TABLE ebooks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
title VARCHAR(255) NOT NULL,
author VARCHAR(255),
isbn VARCHAR(13),
description TEXT,
file_path VARCHAR(500) NOT NULL,
file_size BIGINT,
mime_type VARCHAR(100),
cover_image_path VARCHAR(500),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
reading_progress
CREATE TABLE reading_progress (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
ebook_id UUID NOT NULL REFERENCES ebooks(id) ON DELETE CASCADE,
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
current_page INTEGER DEFAULT 0,
total_pages INTEGER,
last_read_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE(ebook_id, user_id)
);
reading_progress
CREATE TABLE reading_progress (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
ebook_id UUID NOT NULL REFERENCES ebooks(id) ON DELETE CASCADE,
user_id VARCHAR(100) NOT NULL,
current_page INTEGER DEFAULT 0,
total_pages INTEGER,
last_read_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE(ebook_id, user_id)
);
Indexes:
- idx_users_email ON users(email)
- idx_users_username ON users(username)
- idx_ebooks_title ON ebooks(title)
- idx_ebooks_author ON ebooks(author)
- idx_reading_progress_ebook_id ON reading_progress(ebook_id)
- idx_reading_progress_user_id ON reading_progress(user_id)
Authentication
The application uses JWT (JSON Web Tokens) for authentication. The flow is:
- Register or Login via
/api/auth/registeror/api/auth/login - Receive JWT token in response
- Include token in
Authorization: Bearer <token>header for protected requests - Token expires after 24 hours
Security Features:
- Passwords hashed with bcrypt (cost factor 10)
- JWT signed with configurable secret key
- User data properly isolated per authenticated user
- Unique constraints on email and username
API Endpoints
All endpoints now include comprehensive server-side validation. Invalid requests return detailed error messages in the response body.
Auth (Public)
POST /api/auth/register
- Body: { email: string, username: string, password: string }
- Returns: { token: string, user: UserProfile }
POST /api/auth/login
- Body: { login: string, password: string } (login can be email or username)
- Returns: { token: string, user: UserProfile }
GET /api/auth/profile (requires JWT)
- Returns: UserProfile
Ebooks (requires JWT)
GET /api/ebooks
- Query params: limit (default: 20), offset (default: 0)
- Returns: Array of ebook objects
GET /api/ebooks/:id
- Path param: id (UUID)
- Returns: Single ebook object
POST /api/ebooks
- Body: Ebook data (JSON)
- Required fields: title, file_path
- Returns: Created ebook object
PUT /api/ebooks/:id
- Path param: id (UUID)
- Body: Updated ebook data (JSON)
- Returns: Updated ebook object
DELETE /api/ebooks/:id
- Path param: id (UUID)
- Returns: 204 No Content
Reading Progress (requires JWT)
GET /api/ebooks/:id/progress
- Path param: ebookId
- Returns: Reading progress object for authenticated user
PUT /api/ebooks/:id/progress
- Path param: ebookId
- Body: { current_page: number, total_pages?: number }
- Returns: Updated progress object for authenticated user
Type Definitions
Ebook
interface Ebook {
id: string;
title: string;
author: string | null;
isbn: string | null;
description: string | null;
file_path: string;
file_size: number | null;
mime_type: string | null;
cover_image_path: string | null;
created_at: string;
updated_at: string;
}
UserProfile
interface UserProfile {
id: string;
email: string;
username: string;
created_at?: string;
}
ReadingProgress
interface ReadingProgress {
ebook_id: string;
user_id: string;
current_page: number;
total_pages: number | null;
last_read_at: string;
}
Frontend Documentation
SvelteKit Setup
- Framework: SvelteKit with TypeScript
- Build tool: Vite
- Styling: TailwindCSS
- Authentication: JWT-based with localStorage token storage
- State Management: Svelte stores for reactive auth state
- Routing: Protected routes with auth-based conditional rendering
- UI Components: Custom components with Tailwind classes
Key Files
src/lib/api.ts
API client functions for all backend endpoints with JWT authentication and error handling:
- Auth functions: registerUser(), loginUser(), getUserProfile()
- Ebook functions: fetchEbooks(), fetchEbook(), createEbook(), updateEbook(), deleteEbook()
- Progress functions: fetchReadingProgress(), updateReadingProgress() (user-specific via token)
- Error handling: Automatic toast notifications for API errors with parsed error messages
- All functions automatically include Bearer token headers when authenticated
src/lib/auth.ts
Authentication state management store:
- Reactive auth state with Svelte stores
- JWT token persistence in localStorage
- Login/logout functionality
- Auth state initialization
src/lib/toast.ts
Toast notification utilities:
- showError() - Display error toasts with Tokyo Night red styling
- showSuccess() - Display success toasts with Tokyo Night green styling
- Integrated with API error handling for automatic user feedback
src/routes/login/+page.svelte
Login page with form validation and error handling
src/routes/register/+page.svelte
Registration page with password confirmation and validation
src/routes/+layout.svelte
Root layout with authentication:
- Auth state initialization and management
- Conditional rendering based on login status
- Navigation header with user info and logout
- Auth forms for unauthenticated users
Styling
Tokyo Night Theme with TailwindCSS:
- Color Palette: Custom Tokyo Night colors (#1a1b26 backgrounds, #7aa2f7 accents)
- Typography: Inter font family loaded from Google Fonts
- Animations: Custom fade-in and slide-in animations
- Components: Pre-built button, card, input, and navigation styles
- Dark Theme: Complete dark mode implementation with proper contrast
- Responsive Design: Mobile-first approach with breakpoint optimizations
- Interactive Elements: Hover effects, focus states, and smooth transitions
Authentication Flow
Frontend Implementation:
- State Management: Reactive auth store with login/logout actions
- Token Persistence: JWT tokens stored in localStorage with session persistence
- Route Protection: Layout component handles auth-based conditional rendering
- API Integration: All API calls include auth headers automatically
- Form Validation: Client-side validation with error display
- User Experience: Seamless transitions between auth states
Docker Configuration
Backend Dockerfile
- Multi-stage build with Go and Node.js stages
- Alpine Linux for small final image
- Frontend built to static files during Docker build
- sqlc code generation during build
- Binary compilation with CGO disabled
- Static files copied to final image
Docker Compose Services
db (PostgreSQL)
- Image: postgres:15-alpine
- Health check with pg_isready
- Volume for data persistence
- Init scripts from migrations folder
backend (Go API + Static Frontend)
- Build from backend/Dockerfile
- Environment variables for configuration
- Health check for application availability
- Depends on database health
- Volume for uploads directory
- Serves both API and static frontend files
Networking
Services communicate via Docker networks:
- backend serves static files for frontend and API endpoints
- backend connects to db:5432
- All services restart automatically on failure
Development Setup
Backend Development
cd backend
go mod tidy
go run github.com/sqlc-dev/sqlc/cmd/sqlc@latest generate
go run cmd/server/main.go
Frontend Development
For development, run the frontend separately:
cd frontend
npm install
npm run dev -- --open
Note: For production, frontend is built statically and served by the Go backend. API calls should proxy to the backend (e.g., via Vite proxy in dev).
Database Development
# Connect to database
psql -h localhost -p 5432 -U postgres -d ebookdb
# Run migrations manually (if needed)
# Migrations run automatically in Docker
Deployment
Production Considerations
- Environment Variables: Change default passwords, JWT secret, and database credentials
- Database: Use managed PostgreSQL in production with connection pooling
- File Storage: Implement cloud storage for ebook files (S3, etc.)
- Authentication: JWT secrets should be strong and rotated regularly
- HTTPS: Configure SSL certificates for secure transmission
- Rate Limiting: Add rate limiting for auth endpoints to prevent brute force
- User Management: Consider email verification, password reset, account locking
- Monitoring: Add logging and monitoring for auth failures
- Backup: Regular database backups including user data
Scaling
- Database can be moved to separate instance
- Backend can be scaled horizontally with load balancer
- Frontend static files can be served from CDN
- File storage can use cloud storage (S3, etc.)
User Journey
Complete User Flow
- Registration: User visits
/register, fills form, receives JWT token - Login: User can login with email or username, receives JWT token
- Token Storage: Frontend stores JWT in localStorage
- API Access: All subsequent API calls include Bearer token
- Library Access: User sees their ebook library with personal reading progress
- Progress Tracking: Reading progress is automatically associated with user
- Session Management: User stays logged in across browser sessions
- Logout: User can logout, clearing token and redirecting to login
Security Features
- Password Hashing: Bcrypt with cost factor 10
- JWT Tokens: 24-hour expiration, signed with configurable secret
- User Isolation: All data is user-specific and properly segregated
- Session Persistence: Secure token storage with automatic validation
- API Protection: All sensitive operations require valid authentication
API Usage Examples
Registering a User
curl -X POST http://localhost:8765/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"username": "testuser",
"password": "securepassword"
}'
Logging in a User
curl -X POST http://localhost:8765/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"login": "user@example.com",
"password": "securepassword"
}'
Creating an Ebook (requires JWT token)
curl -X POST -H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
http://localhost:8765/api/ebooks \
-d '{
"title": "Sample Book",
"author": "Sample Author",
"file_path": "/uploads/sample.epub",
"file_size": 1024000,
"mime_type": "application/epub+zip"
}'
Getting Reading Progress (requires JWT token)
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
http://localhost:8765/api/ebooks/123e4567-e89b-12d3-a456-426614174000/progress
Updating Progress (requires JWT token)
curl -X PUT -H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
http://localhost:8765/api/ebooks/123e4567-e89b-12d3-a456-426614174000/progress \
-d '{"current_page": 45, "total_pages": 200}'
Register User
curl -X POST http://localhost:8765/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"username": "testuser",
"password": "securepassword"
}'
Login User
curl -X POST http://localhost:8765/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"login": "user@example.com",
"password": "securepassword"
}'
Getting Reading Progress (requires JWT token)
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
http://localhost:8765/api/ebooks/123e4567-e89b-12d3-a456-426614174000/progress
Updating Progress (requires JWT token)
curl -X PUT -H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
http://localhost:8765/api/ebooks/123e4567-e89b-12d3-a456-426614174000/progress \
-d '{"current_page": 45, "total_pages": 200}'
Recent Changes (Complete Multi-User Auth System)
As of the latest updates, the application has been completely transformed into a full multi-user ebook management system:
- Multi-User Authentication: Complete user system with registration/login, supporting both email and username login, JWT-based sessions, and bcrypt password hashing
- Security: Passwords stored with industry-standard bcrypt hashing, JWT tokens for API access, user data isolation, secure token management
- API Evolution: Auth endpoints added, reading progress now user-specific (removed :userId params), all ebook operations require authentication
- Frontend Auth Integration: Svelte frontend fully updated with login/register forms, JWT token management in localStorage, reactive auth state store, protected routes with automatic redirects
- User Experience: Seamless auth flow with form validation, session persistence, user dashboard, logout functionality
- Architecture: Single Go service serving both static frontend and API, no Node.js dependency
- Database: New users table, updated reading_progress with user foreign keys, comprehensive indexing
- Testing: Bruno collection updated with auth flows and Bearer token authentication
- Cleanup: Removed obsolete Docker files for frontend containerization
Latest Updates (Enhanced Validation, UI/UX & Tokyo Night Theme)
Backend API Validation Enhancement
- Server-Side Validation: Added comprehensive input validation using
github.com/go-playground/validator/v10 - Request Validation: All API endpoints now validate request data before processing
- Error Responses: Detailed validation error messages returned for invalid requests
- Security: Prevents malformed data from reaching the database layer
Validation Rules Added:
- User Registration: Email format validation, username length (3-50 chars), password minimum length (6+ chars)
- User Login: Required email/username and password fields
- Ebook Creation: Required title and file_path, minimum title length (1-500 chars), optional file size validation
- Ebook Updates: Title validation when provided, cover image path validation
- Reading Progress: Required current_page (≥0), optional total_pages (≥1)
Frontend Toast Notifications
- Error Notifications: Real-time toast popups for all API errors using
@zerodevx/svelte-toast - User Feedback: Immediate visual feedback for failed operations (login, registration, CRUD operations)
- Error Parsing: Automatically extracts and displays backend validation messages
- Non-Intrusive Design: Toasts appear without disrupting user workflow
Tokyo Night Theme Redesign
- Complete UI Overhaul: Transformed the entire frontend with the popular Tokyo Night dark theme
- Color Palette: Deep blue backgrounds (#1a1b26), cyan accents (#7dcfff), and carefully chosen contrast colors
- Modern Design: Gradient backgrounds, smooth animations, and professional card-based layouts
- Enhanced Typography: Inter font family for improved readability
- Interactive Elements: Hover effects, focus states, and smooth transitions throughout
Tokyo Night Color Scheme:
Background: #1a1b26 (dark blue-gray)
Secondary Background: #16161e (darker blue)
Highlights: #292e42 (medium blue-gray)
Foreground: #a9b1d6 (light blue-gray)
Accent Blue: #7aa2f7
Accent Cyan: #7dcfff
Accent Red: #f7768e
Accent Green: #9ece6a
Accent Purple: #bb9af7
Enhanced User Experience Features
- Loading States: Beautiful animated spinners during data fetching
- Form Validation: Real-time client-side validation with visual feedback
- Responsive Design: Optimized for all screen sizes with mobile-first approach
- Animation System: Fade-in and slide-in animations for page transitions
- Error Handling: Comprehensive error states with user-friendly messages
- Empty States: Attractive placeholders when no data is available
- Visual Hierarchy: Clear information architecture with proper spacing and typography
Technical Improvements
- Performance: Optimized CSS compilation with direct color values for better build performance
- Accessibility: Proper contrast ratios and focus management
- Code Organization: Clean separation of concerns with utility functions
- Type Safety: Full TypeScript integration with proper error typing
- Build Optimization: Efficient static file generation and caching
Updated Dependencies
- Backend: Added
github.com/go-playground/validator/v10for validation - Frontend: Added
@zerodevx/svelte-toastfor notifications - Fonts: Added Google Fonts Inter for enhanced typography
- Tailwind: Extended configuration with custom animations and Tokyo Night colors
User Interface Components
- Authentication Pages: Redesigned login/register forms with card layouts and icons
- Library View: Grid-based ebook display with hover effects and metadata
- Navigation: Clean header with user information and logout functionality
- Loading Screens: Beautiful animated loading states
- Error Displays: User-friendly error messages with appropriate styling
- Toast Notifications: Non-intrusive error feedback system
This comprehensive update transforms the application into a modern, professional ebook management system with excellent user experience, robust validation, and beautiful dark theme design.
Troubleshooting
Common Issues
-
Database Connection Failed
- Check if PostgreSQL container is running
- Verify DATABASE_* environment variables
- Check database logs:
docker-compose logs db
-
Application Not Accessible
- Verify backend container is running
- Check backend logs:
docker-compose logs backend - Test health endpoint:
curl http://localhost:8765/
-
Authentication Issues
- Verify JWT_SECRET environment variable is set
- Check token expiration (24 hours)
- Ensure Bearer token format:
Authorization: Bearer <token> - Test auth endpoints first:
/api/auth/register,/api/auth/login - Check validation errors in API responses (frontend shows toast notifications)
-
Validation Errors
- Frontend displays validation errors via toast notifications
- Check API response body for detailed error messages
- Ensure request data matches validation rules (email format, password length, etc.)
-
Frontend Not Loading
- Check backend logs for static file serving
- Verify frontend built correctly in Docker
- Check browser console for errors
- Ensure Tokyo Night theme CSS compiled properly
-
API Authorization Errors
- Confirm JWT token is valid and not expired
- Check middleware logs for auth failures
- Verify protected endpoints use correct HTTP methods
-
Build Failures
- Clear Docker cache:
docker system prune -a - Rebuild:
docker-compose up --build --force-recreate
- Clear Docker cache:
Logs
# All services
docker-compose logs
# Specific service
docker-compose logs backend
docker-compose logs frontend
docker-compose logs db
# Follow logs
docker-compose logs -f backend
Contributing
- Fork the repository
- Create a feature branch
- Make changes with proper testing
- Submit a pull request
License
MIT License - see LICENSE file for details
Future Enhancements
- Email verification for user registration
- Password reset functionality
- User profile management (update email/username, change password)
- Email notifications (welcome, password reset, etc.)
- User roles and permissions (admin, regular user)
- Ebook file upload and processing with validation
- EPUB/PDF reader component with bookmarking
- Advanced search and filtering (by author, genre, etc.)
- Categories and tags for ebooks
- Reading statistics and analytics dashboard
- Social features (sharing reading lists, reviews)
- Mobile app development (React Native/Flutter)
- Cloud storage integration (S3, Google Drive)
- Backup and restore functionality
- Admin panel for user management
- OAuth integration (Google, GitHub, Apple login)
- Two-factor authentication (2FA)
- Session management and device tracking
This documentation covers the complete setup, configuration, and usage of the ebook reader system. For specific implementation details, refer to the source code comments and type definitions.