Spaces:
Sleeping
Sleeping
| 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 | |
| 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()) | |
| 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 | |
| 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 | |