67 lines
2.0 KiB
Python

"""
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.VoterProfile)
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)
return voter
@router.post("/login", response_model=schemas.TokenResponse)
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.TokenResponse(
access_token=access_token,
expires_in=30 * 60 # en secondes
)
@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