diff --git a/routes/auth.py b/routes/auth.py index 90c30d6..961f1c3 100644 --- a/routes/auth.py +++ b/routes/auth.py @@ -1,4 +1,3 @@ -# auth/routes.py from fastapi import APIRouter, Depends, HTTPException, status, Request from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select @@ -194,13 +193,57 @@ async def register( } +@router.get("/verify-email") +async def verify_email_get( + token: str, + session: AsyncSession = Depends(get_session) +): + """ + ✅ Vérification de l'email via lien cliquable (GET) + Utilisé quand l'utilisateur clique sur le lien dans l'email + """ + result = await session.execute( + select(User).where(User.verification_token == token) + ) + user = result.scalar_one_or_none() + + if not user: + return { + "success": False, + "message": "Token de vérification invalide ou déjà utilisé." + } + + # Vérifier l'expiration + if user.verification_token_expires < datetime.now(): + return { + "success": False, + "message": "Token expiré. Veuillez demander un nouvel email de vérification.", + "expired": True + } + + # Activer le compte + user.is_verified = True + user.verification_token = None + user.verification_token_expires = None + await session.commit() + + logger.info(f"✅ Email vérifié: {user.email}") + + return { + "success": True, + "message": "✅ Email vérifié avec succès ! Vous pouvez maintenant vous connecter.", + "email": user.email + } + + @router.post("/verify-email") -async def verify_email( +async def verify_email_post( data: VerifyEmailRequest, session: AsyncSession = Depends(get_session) ): """ - ✅ Vérification de l'email via token + ✅ Vérification de l'email via API (POST) + Utilisé pour les appels programmatiques depuis le frontend """ result = await session.execute( select(User).where(User.verification_token == data.token)