books/backend/prisma/schema.prisma
Greg bed53dbbd3 Epic 1, Story 1.4: Database Schema Definition with Prisma
- Installed Prisma and @prisma/client in backend/ directory
- Initialized Prisma with PostgreSQL provider (Prisma 7.x)
- Created prisma/schema.prisma with Book and ReadingLog models
- Configured prisma.config.ts with DATABASE_URL from environment
- Added .gitignore for Prisma-generated files

Book model includes:
- All required fields (id, title, author, totalPages, coverUrl, deadlineDate, isPrimary, status)
- Timestamps (createdAt, updatedAt)
- Indexes on deadlineDate and status for query performance
- One-to-many relationship with ReadingLog

ReadingLog model includes:
- All required fields (id, bookId, logDate, currentPage)
- Timestamps (createdAt, updatedAt)
- Foreign key relationship to Book with cascade delete
- Unique constraint on (bookId, logDate) - one entry per book per day
- Indexes on bookId and logDate for query performance

All acceptance criteria met:
 Prisma installed in backend/
 Initialized with PostgreSQL provider
 schema.prisma defines Book and ReadingLog models
 Appropriate indexes for performance
 One-to-many relationship defined
 Unique constraint ensures one log entry per book per day

Schema validated with npx prisma format

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-05 16:12:04 +01:00

44 lines
1.0 KiB
Plaintext

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
}
model Book {
id Int @id @default(autoincrement())
title String @db.VarChar(500)
author String? @db.VarChar(500)
totalPages Int
coverUrl String? @db.VarChar(1000)
deadlineDate DateTime @db.Date
isPrimary Boolean @default(false)
status String @default("reading") @db.VarChar(50)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
readingLogs ReadingLog[]
@@index([deadlineDate])
@@index([status])
}
model ReadingLog {
id Int @id @default(autoincrement())
bookId Int
logDate DateTime @db.Date
currentPage Int
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
book Book @relation(fields: [bookId], references: [id], onDelete: Cascade)
@@unique([bookId, logDate])
@@index([bookId])
@@index([logDate])
}