from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.models.user import User from app.models.project import Project from app.models.chapter import Chapter from app.schemas.chapter import ChapterCreate, ChapterResponse from app.services.auth import get_current_user router = APIRouter(prefix="/api/projects/{project_id}/chapters", tags=["chapters"]) async def _get_user_project(project_id: int, user: User, db: AsyncSession) -> Project: result = await db.execute( select(Project).where(Project.id == project_id, Project.user_id == user.id) ) project = result.scalar_one_or_none() if not project: raise HTTPException(status_code=404, detail="Project not found") return project @router.get("", response_model=list[ChapterResponse]) async def list_chapters( project_id: int, user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): await _get_user_project(project_id, user, db) result = await db.execute( select(Chapter) .where(Chapter.project_id == project_id) .order_by(Chapter.chapter_number) ) return list(result.scalars().all()) @router.post("", response_model=ChapterResponse, status_code=201) async def create_chapter( project_id: int, data: ChapterCreate, user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): await _get_user_project(project_id, user, db) chapter = Chapter( project_id=project_id, chapter_number=data.chapter_number, title=data.title, source_text=data.source_text, word_count=len(data.source_text.split()), ) db.add(chapter) await db.commit() await db.refresh(chapter) return chapter @router.post("/bulk", response_model=list[ChapterResponse], status_code=201) async def create_chapters_bulk( project_id: int, chapters: list[ChapterCreate], user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): await _get_user_project(project_id, user, db) db_chapters = [] for data in chapters: chapter = Chapter( project_id=project_id, chapter_number=data.chapter_number, title=data.title, source_text=data.source_text, word_count=len(data.source_text.split()), ) db.add(chapter) db_chapters.append(chapter) await db.commit() for ch in db_chapters: await db.refresh(ch) return db_chapters