Python 64.6%
TypeScript 33.7%
CSS 0.8%
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