SPB Git forge

spb/uqo-chat

Public
14commits 1branches 0releases
1.4 MBsize
maindefault branch
17 days agolast push
Python 64.6% TypeScript 33.7% CSS 0.8%
3.0 KB · 78 lines python
Raw Blame History
1from __future__ import annotations23from fastapi import APIRouter, Depends, HTTPException, Query, status4from pydantic import BaseModel56from app.core.config import Settings, get_settings7from app.core.security import AuthUser, get_current_user8from app.services import conversations as svc910router = APIRouter(tags=["conversations"])111213class CreateReq(BaseModel):14    course: str | None = None15    title: str | None = None161718class PatchReq(BaseModel):19    title: str | None = None20    pinned: bool | None = None21    archived: bool | None = None22    course: str | None = None232425class FeedbackReq(BaseModel):26    feedback: str | None  # up | down | null272829@router.get("/conversations")30async def list_conversations(q: str | None = None, archived: bool = False,31                             limit: int = Query(50, le=200), offset: int = 0,32                             auth: AuthUser = Depends(get_current_user)) -> list[dict]:33    return await svc.list_conversations(auth.id, q, archived, limit, offset)343536@router.post("/conversations", status_code=201)37async def create(req: CreateReq, auth: AuthUser = Depends(get_current_user),38                 settings: Settings = Depends(get_settings)) -> dict:39    course = (req.course or settings.courses[0]).upper()40    if course not in settings.courses:41        raise HTTPException(status.HTTP_400_BAD_REQUEST, detail="Cours inconnu.")42    return await svc.create_conversation(auth.id, course, req.title)434445@router.get("/conversations/{conv_id}")46async def get(conv_id: str, auth: AuthUser = Depends(get_current_user)) -> dict:47    data = await svc.get_conversation_full(conv_id, auth.id)48    if not data:49        raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Conversation introuvable.")50    return data515253@router.patch("/conversations/{conv_id}")54async def patch(conv_id: str, req: PatchReq, auth: AuthUser = Depends(get_current_user)) -> dict:55    data = await svc.update_conversation(conv_id, auth.id, title=req.title, pinned=req.pinned,56                                         archived=req.archived,57                                         course_code=req.course.upper() if req.course else None)58    if not data:59        raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Conversation introuvable.")60    return data616263@router.delete("/conversations/{conv_id}")64async def delete(conv_id: str, auth: AuthUser = Depends(get_current_user)) -> dict:65    if not await svc.delete_conversation(conv_id, auth.id):66        raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Conversation introuvable.")67    return {"ok": True}686970@router.post("/conversations/{conv_id}/messages/{message_id}/feedback")71async def feedback(conv_id: str, message_id: str, req: FeedbackReq,72                   auth: AuthUser = Depends(get_current_user)) -> dict:73    if req.feedback not in {None, "up", "down"}:74        raise HTTPException(status.HTTP_400_BAD_REQUEST, detail="feedback invalide")75    if not await svc.set_feedback(message_id, auth.id, req.feedback):76        raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Message introuvable.")77    return {"ok": True}78