from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from app.dependencies import get_db, get_current_user from app.models.subject import Subject from app.models.user import User from app.schemas.subject import SubjectCreate, SubjectOut, SubjectUpdate router = APIRouter(prefix="/api/subjects", tags=["subjects"]) @router.get("", response_model=list[SubjectOut]) async def list_subjects( current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): result = await db.execute( select(Subject).where(Subject.user_id == current_user.id).order_by(Subject.name) ) return result.scalars().all() @router.post("", response_model=SubjectOut, status_code=status.HTTP_201_CREATED) async def create_subject( body: SubjectCreate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): subject = Subject(**body.model_dump(), user_id=current_user.id) db.add(subject) await db.commit() await db.refresh(subject) return subject @router.get("/{subject_id}", response_model=SubjectOut) async def get_subject( subject_id: int, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): result = await db.execute( select(Subject).where(Subject.id == subject_id, Subject.user_id == current_user.id) ) subject = result.scalar_one_or_none() if not subject: raise HTTPException(status_code=404, detail="Subject not found") return subject @router.patch("/{subject_id}", response_model=SubjectOut) async def update_subject( subject_id: int, body: SubjectUpdate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): result = await db.execute( select(Subject).where(Subject.id == subject_id, Subject.user_id == current_user.id) ) subject = result.scalar_one_or_none() if not subject: raise HTTPException(status_code=404, detail="Subject not found") for field, value in body.model_dump(exclude_none=True).items(): setattr(subject, field, value) await db.commit() await db.refresh(subject) return subject @router.delete("/{subject_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_subject( subject_id: int, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): result = await db.execute( select(Subject).where(Subject.id == subject_id, Subject.user_id == current_user.id) ) subject = result.scalar_one_or_none() if not subject: raise HTTPException(status_code=404, detail="Subject not found") await db.delete(subject) await db.commit()