67 lines
2.0 KiB
Python
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
|