- Updated COMPLETE_DOCUMENTATION.md feature descriptions - Updated user journey reference from 'ebook library' to 'ebook collection' - Updated all frontend page titles and headers - Updated Bruno API collection and workspace names - All references now consistently use 'Bookmann' as the application name
736 lines
25 KiB
Markdown
736 lines
25 KiB
Markdown
# Bookmann - Complete Documentation
|
|
|
|
## Overview
|
|
|
|
Bookmann is a self-hosted ebook 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 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
|
|
|
|
1. Clone the repository:
|
|
```bash
|
|
git clone <repository-url>
|
|
cd bookmann
|
|
```
|
|
|
|
2. Start all services:
|
|
```bash
|
|
docker-compose up --build
|
|
```
|
|
|
|
3. 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
|
|
```sql
|
|
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
|
|
```sql
|
|
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
|
|
```sql
|
|
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
|
|
```sql
|
|
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:
|
|
|
|
1. **Register** or **Login** via `/api/auth/register` or `/api/auth/login`
|
|
2. Receive JWT token in response
|
|
3. Include token in `Authorization: Bearer <token>` header for protected requests
|
|
4. 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
|
|
```typescript
|
|
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
|
|
```typescript
|
|
interface UserProfile {
|
|
id: string;
|
|
email: string;
|
|
username: string;
|
|
created_at?: string;
|
|
}
|
|
```
|
|
|
|
#### ReadingProgress
|
|
```typescript
|
|
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
|
|
|
|
```bash
|
|
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:
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
1. **Environment Variables**: Change default passwords, JWT secret, and database credentials
|
|
2. **Database**: Use managed PostgreSQL in production with connection pooling
|
|
3. **File Storage**: Implement cloud storage for ebook files (S3, etc.)
|
|
4. **Authentication**: JWT secrets should be strong and rotated regularly
|
|
5. **HTTPS**: Configure SSL certificates for secure transmission
|
|
6. **Rate Limiting**: Add rate limiting for auth endpoints to prevent brute force
|
|
7. **User Management**: Consider email verification, password reset, account locking
|
|
8. **Monitoring**: Add logging and monitoring for auth failures
|
|
9. **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
|
|
|
|
1. **Registration**: User visits `/register`, fills form, receives JWT token
|
|
2. **Login**: User can login with email or username, receives JWT token
|
|
3. **Token Storage**: Frontend stores JWT in localStorage
|
|
4. **API Access**: All subsequent API calls include Bearer token
|
|
5. **Library Access**: User sees their ebook collection with personal reading progress
|
|
6. **Progress Tracking**: Reading progress is automatically associated with user
|
|
7. **Session Management**: User stays logged in across browser sessions
|
|
8. **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
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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)
|
|
|
|
```bash
|
|
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)
|
|
|
|
```bash
|
|
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
|
|
http://localhost:8765/api/ebooks/123e4567-e89b-12d3-a456-426614174000/progress
|
|
```
|
|
|
|
### Updating Progress (requires JWT token)
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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)
|
|
|
|
```bash
|
|
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
|
|
http://localhost:8765/api/ebooks/123e4567-e89b-12d3-a456-426614174000/progress
|
|
```
|
|
|
|
### Updating Progress (requires JWT token)
|
|
|
|
```bash
|
|
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:
|
|
```css
|
|
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/v10` for validation
|
|
- **Frontend**: Added `@zerodevx/svelte-toast` for 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
|
|
|
|
1. **Database Connection Failed**
|
|
- Check if PostgreSQL container is running
|
|
- Verify DATABASE_* environment variables
|
|
- Check database logs: `docker-compose logs db`
|
|
|
|
2. **Application Not Accessible**
|
|
- Verify backend container is running
|
|
- Check backend logs: `docker-compose logs backend`
|
|
- Test health endpoint: `curl http://localhost:8765/`
|
|
|
|
3. **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)
|
|
|
|
4. **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.)
|
|
|
|
5. **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
|
|
|
|
6. **API Authorization Errors**
|
|
- Confirm JWT token is valid and not expired
|
|
- Check middleware logs for auth failures
|
|
- Verify protected endpoints use correct HTTP methods
|
|
|
|
7. **Build Failures**
|
|
- Clear Docker cache: `docker system prune -a`
|
|
- Rebuild: `docker-compose up --build --force-recreate`
|
|
|
|
### Logs
|
|
|
|
```bash
|
|
# 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
|
|
|
|
1. Fork the repository
|
|
2. Create a feature branch
|
|
3. Make changes with proper testing
|
|
4. 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 Bookmann. For specific implementation details, refer to the source code comments and type definitions. |