books/docs/architecture/data-models.md
Greg fa8acef423 Epic 1, Story 1.1: Project Initialization & Repository Setup
- Initialize Git repository with main branch
- Create comprehensive .gitignore for Node.js, React, and environment files
- Set up directory structure (frontend/, backend/, docs/)
- Create detailed README.md with project overview and setup instructions
- Add .env.example with all required environment variables
- Configure Prettier for consistent code formatting

All acceptance criteria met:
 Git repository initialized with appropriate .gitignore
 Directory structure matches Technical Assumptions
 README.md created with project overview and setup docs
 .env.example file with all required environment variables
 Prettier config files added for code formatting consistency

🤖 Generated with Claude Code (https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 15:12:30 +01:00

3.2 KiB

Data Models

Book Model

Purpose: Represents a book that the user is tracking for reading progress and deadline management.

Key Attributes:

  • id: Integer - Unique identifier (auto-increment)
  • title: String (max 500 chars) - Book title
  • author: String (max 500 chars, optional) - Book author
  • totalPages: Integer - Total pages in the book
  • coverUrl: String (max 1000 chars, optional) - URL to book cover image (from Open Library)
  • deadlineDate: Date - Date by which user needs to finish the book
  • isPrimary: Boolean (default: false) - Whether this is the user's primary focus book (for v1.1 multi-book support)
  • status: String (default: "reading") - Book status: "reading", "finished", "paused"
  • createdAt: DateTime - When book was added
  • updatedAt: DateTime - Last update timestamp

TypeScript Interface

interface Book {
  id: number;
  title: string;
  author: string | null;
  totalPages: number;
  coverUrl: string | null;
  deadlineDate: Date;
  isPrimary: boolean;
  status: 'reading' | 'finished' | 'paused';
  createdAt: Date;
  updatedAt: Date;
}

Relationships

  • Has many ReadingLog entries (one-to-many)
  • Cascade delete: When a book is deleted, all associated reading logs are deleted

ReadingLog Model

Purpose: Tracks daily reading progress by recording the current page number for a specific book on a specific date.

Key Attributes:

  • id: Integer - Unique identifier (auto-increment)
  • bookId: Integer - Foreign key to Book model
  • logDate: Date - Date of the reading log entry
  • currentPage: Integer - Page number user reached on this date
  • createdAt: DateTime - When log was created
  • updatedAt: DateTime - Last update timestamp

TypeScript Interface

interface ReadingLog {
  id: number;
  bookId: number;
  logDate: Date;
  currentPage: number;
  createdAt: Date;
  updatedAt: Date;
}

Relationships

  • Belongs to one Book (many-to-one)
  • Unique constraint: (bookId, logDate) - Only one log per book per day

ProgressCalculation Model (Derived)

Purpose: Not stored in database - computed on-demand from Book and ReadingLog data to show user's reading pace and status.

Key Attributes:

  • bookId: Integer - Book being tracked
  • currentPage: Integer - Latest logged page
  • totalPages: Integer - Total pages in book
  • pagesRemaining: Integer - Pages left to read
  • deadlineDate: Date - Finish by date
  • daysRemaining: Integer - Days until deadline
  • requiredPace: Float - Pages/day needed to finish on time
  • actualPace: Float - Pages/day based on 7-day rolling average
  • status: String - "on-track", "slightly-behind", "behind"
  • lastLoggedDate: Date - Most recent log date

TypeScript Interface

interface ProgressCalculation {
  bookId: number;
  currentPage: number;
  totalPages: number;
  pagesRemaining: number;
  deadlineDate: Date;
  daysRemaining: number;
  requiredPace: number;  // pages/day
  actualPace: number | null;  // pages/day (null if insufficient data)
  status: 'on-track' | 'slightly-behind' | 'behind';
  lastLoggedDate: Date | null;
}

Relationships

  • Derived from Book and ReadingLog models
  • Calculated server-side and returned in API responses