Files
api-copp/route/choice_crud.py
2026-03-31 13:25:14 +05:00

113 lines
3.5 KiB
Python

from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel
from typing import Optional
import uuid
from bd import make_engine
from bd.tables.choice import Choice
from bd.tables.question import Question
from route.auth_utils import require_admin_key
router = APIRouter(tags=["choices"], prefix="/choices")
class ChoiceCreate(BaseModel):
question_id: str
text: str
position: Optional[int]
class ChoiceUpdate(BaseModel):
text: Optional[str]
position: Optional[int]
def get_session():
from sqlalchemy.orm import sessionmaker
return sessionmaker(bind=make_engine(), future=True)
@router.post("/", status_code=201, dependencies=[Depends(require_admin_key)])
def create_choice(payload: ChoiceCreate):
Session = get_session()
try:
qid = uuid.UUID(payload.question_id)
except Exception:
raise HTTPException(status_code=400, detail="Invalid question UUID")
with Session() as session:
question = session.get(Question, qid)
if not question:
raise HTTPException(status_code=404, detail="Question not found")
ch = Choice(question_id=qid, text=payload.text, position=payload.position)
session.add(ch)
session.commit()
session.refresh(ch)
return {"id": str(ch.id)}
@router.put("/{choice_id}", dependencies=[Depends(require_admin_key)])
def update_choice(choice_id: str, payload: ChoiceUpdate):
Session = get_session()
try:
cid = uuid.UUID(choice_id)
except Exception:
raise HTTPException(status_code=400, detail="Invalid UUID")
with Session() as session:
ch = session.get(Choice, cid)
if not ch:
raise HTTPException(status_code=404, detail="Choice not found")
if payload.text is not None:
ch.text = payload.text
if payload.position is not None:
ch.position = payload.position
session.add(ch)
session.commit()
session.refresh(ch)
return {"id": str(ch.id)}
@router.delete("/{choice_id}", status_code=204, dependencies=[Depends(require_admin_key)])
def delete_choice(choice_id: str):
Session = get_session()
try:
cid = uuid.UUID(choice_id)
except Exception:
raise HTTPException(status_code=400, detail="Invalid UUID")
with Session() as session:
ch = session.get(Choice, cid)
if not ch:
raise HTTPException(status_code=404, detail="Choice not found")
session.delete(ch)
session.commit()
return {}
@router.get("/")
def list_choices(question_id: Optional[str] = None):
Session = get_session()
with Session() as session:
q = session.query(Choice)
if question_id:
try:
qid = uuid.UUID(question_id)
q = q.filter(Choice.question_id == qid)
except Exception:
raise HTTPException(status_code=400, detail="Invalid question_id UUID")
rows = q.all()
return [{"id": str(r.id), "text": r.text, "question_id": str(r.question_id)} for r in rows]
@router.get("/{choice_id}")
def get_choice(choice_id: str):
Session = get_session()
try:
cid = uuid.UUID(choice_id)
except Exception:
raise HTTPException(status_code=400, detail="Invalid UUID")
with Session() as session:
ch = session.get(Choice, cid)
if not ch:
raise HTTPException(status_code=404, detail="Choice not found")
return {"id": str(ch.id), "text": ch.text, "question_id": str(ch.question_id)}