from fastapi import APIRouter, Depends, HTTPException, status from motor.motor_asyncio import AsyncIOMotorDatabase from src.core.database import mongo_db from src.models.mongo.cv_model import CVModel from pydantic import BaseModel, Field from typing import Optional, Dict, Any from bson import ObjectId router = APIRouter() class CVCreate(BaseModel): user_id: str parsed_data: Dict[str, Any] raw_text: Optional[str] = None upload_date: str class CVResponse(BaseModel): id: str = Field(alias="_id") user_id: str parsed_data: Dict[str, Any] raw_text: Optional[str] = None upload_date: str class Config: populate_by_name = True json_encoders = {ObjectId: str} from_attributes = True @router.post("/cvs", response_model=CVResponse) async def create_cv(cv: CVCreate, db: AsyncIOMotorDatabase = Depends(lambda: mongo_db)): cv_entry = cv.model_dump(by_alias=True, exclude_unset=True) cv_id = await CVModel.create(db, CVModel.collection_name, cv_entry) cv_entry['id'] = cv_id return CVResponse(**cv_entry) @router.get("/cvs/{cv_id}", response_model=CVResponse) async def get_cv_by_id(cv_id: str, db: AsyncIOMotorDatabase = Depends(lambda: mongo_db)): if not ObjectId.is_valid(cv_id): raise HTTPException(status_code=400, detail="ID de CV invalide") cv = await CVModel.get(db, CVModel.collection_name, {"_id": ObjectId(cv_id)}) if cv is None: raise HTTPException(status_code=404, detail="CV not found") # MODIFICATION : Convertit explicitement l'ObjectId en str avant de retourner l'objet. # On supprime la clé '_id' d'origine pour ne pas avoir de conflits avec la clé 'id' lors de la validation. cv['id'] = str(cv.pop('_id')) return CVResponse(**cv)