File size: 2,609 Bytes
7190fd0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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