ay/backend/routers/france_travail_offers.py
2025-07-01 18:25:10 +02:00

86 lines
No EOL
4.8 KiB
Python

import logging
from typing import List, Optional
from fastapi import APIRouter, Depends, HTTPException, status, Query
from services.france_travail_offer_service import france_travail_offer_service
# Assuming these imports are still needed for your project context,
# even if not directly used in the current problem scope.
# from core.security import get_current_user
# from models.user import User
from schemas.france_travail import FranceTravailSearchResponse, OffreDetail, Offre
router = APIRouter()
logger = logging.getLogger(__name__)
@router.get("/search", response_model=FranceTravailSearchResponse)
async def search_france_travail_offers(
motsCles: Optional[str] = Query(None, description="Mots-clés de recherche (ex: 'développeur full stack')"),
commune_input: Optional[str] = Query(None, alias="commune", description="Nom de la commune (ex: 'Paris', 'Marseille'). Si spécifié, le code départemental sera automatiquement dérivé."),
distance: Optional[int] = Query(10, description="Distance maximale en km autour de la commune ou du code postal. Applicable avec 'commune' ou 'codePostal', 'latitude'/'longitude'."),
codePostal: Optional[str] = Query(None, description="Code postal spécifique (ex: '75001')"),
latitude: Optional[float] = Query(None, description="Latitude du point de recherche (ex: 48.8566)"),
longitude: Optional[float] = Query(None, description="Longitude du point de recherche (ex: 2.3522)"),
# codeDepartement: Optional[str] = Query(None, description="Code départemental sur 2 chiffres (ex: '75' pour Paris). Prioritaire sur les autres paramètres de localisation."), # Ce paramètre est maintenant géré en interne par le service
page: int = Query(0, description="Numéro de la page de résultats (commence à 0)"),
limit: int = Query(15, description="Nombre d'offres par page (max 100 pour l'API France Travail)"),
contrat: Optional[str] = Query(None, description="Type de contrat (ex: 'CDI', 'CDD', 'MIS'). Plusieurs séparés par des virgules."),
experience: Optional[str] = Query(None, description="Niveau d'expérience (ex: 'E' pour expérimenté, 'D' pour débutant). Plusieurs séparés par des virgules.")
# current_user: User = Depends(get_current_user) # Décommentez si l'authentification est nécessaire
):
"""
Recherche des offres d'emploi via l'API France Travail.
La localisation peut être spécifiée par commune (le département sera dérivé), code postal, ou latitude/longitude.
"""
logger.info(f"Requête de recherche d'offres reçue: motsCles='{motsCles}', commune_input='{commune_input}', codePostal='{codePostal}', latitude='{latitude}', longitude='{longitude}', distance={distance}, page={page}, limit={limit}")
range_start = page * limit
range_end = range_start + limit - 1
logger.info(f"Paramètre 'range' calculé pour l'API France Travail: {range_start}-{range_end}")
# Convertir les chaînes de contrats et expériences en listes
contrats_list = contrat.split(',') if contrat else None
experiences_list = experience.split(',') if experience else None
# Les paramètres de localisation sont passés directement au service,
# qui gérera la dérivation du département et la priorité.
try:
response = await france_travail_offer_service.search_offers(
motsCles=motsCles,
commune=commune_input, # Passe le nom de la commune directement
codePostal=codePostal,
latitude=latitude,
longitude=longitude,
distance=distance,
# codeDepartement n'est plus passé ici, il est dérivé dans le service
range_start=range_start,
range_end=range_end,
typeContrat=contrats_list,
experience=experiences_list
)
return response
except RuntimeError as e:
logger.error(f"Erreur lors de la recherche d'offres France Travail: {e}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Impossible de récupérer les offres de France Travail: {e}"
)
@router.get("/{offer_id}", response_model=OffreDetail)
async def get_france_travail_offer_details(
offer_id: str,
# current_user: User = Depends(get_current_user)
):
"""
Récupère les détails d'une offre d'emploi spécifique de l'API France Travail par son ID.
Nécessite une authentification.
"""
try:
details = await france_travail_offer_service.get_offer_details(offer_id)
return details
except RuntimeError as e:
logger.error(f"Erreur lors de la récupération des détails de l'offre {offer_id} de France Travail: {e}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Impossible de récupérer les détails de l'offre {offer_id}: {e}"
)