""" Routes pour l'authentification et les électeurs. """ from fastapi import APIRouter, HTTPException, status, Depends from sqlalchemy.orm import Session from .. import schemas, services from ..auth import create_access_token from ..dependencies import get_db, get_current_voter from ..models import Voter from datetime import timedelta router = APIRouter(prefix="/api/auth", tags=["auth"]) @router.post("/register", response_model=schemas.RegisterResponse) def register(voter_data: schemas.VoterRegister, db: Session = Depends(get_db)): """Enregistrer un nouvel électeur""" # Vérifier que l'email n'existe pas déjà existing_voter = services.VoterService.get_voter_by_email(db, voter_data.email) if existing_voter: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Email already registered" ) # Créer le nouvel électeur voter = services.VoterService.create_voter(db, voter_data) # Créer le token JWT access_token_expires = timedelta(minutes=30) access_token = create_access_token( data={"voter_id": voter.id}, expires_delta=access_token_expires ) return schemas.RegisterResponse( access_token=access_token, expires_in=30 * 60, id=voter.id, email=voter.email, first_name=voter.first_name, last_name=voter.last_name ) @router.post("/login", response_model=schemas.LoginResponse) def login(credentials: schemas.VoterLogin, db: Session = Depends(get_db)): """Authentifier un électeur et retourner un token""" voter = services.VoterService.verify_voter_credentials( db, credentials.email, credentials.password ) if not voter: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid email or password" ) # Créer le token JWT access_token_expires = timedelta(minutes=30) access_token = create_access_token( data={"voter_id": voter.id}, expires_delta=access_token_expires ) return schemas.LoginResponse( access_token=access_token, expires_in=30 * 60, id=voter.id, email=voter.email, first_name=voter.first_name, last_name=voter.last_name ) @router.get("/profile", response_model=schemas.VoterProfile) def get_profile(current_voter: Voter = Depends(get_current_voter)): """Récupérer le profil de l'électeur actuel""" return current_voter