CoolFace
Apppublic

TalhaRafique1/Full-stack-Todo

sourceHugging Faceupdated 8mo agoView on Hugging Face
0likes
auth.py95 linesDownload Raw Back to api
1"""Authentication API endpoints for user registration and login."""2 3from datetime import datetime4from fastapi import APIRouter, HTTPException, status, Depends5from sqlmodel import Session, select6from ..database import get_db7from ..models.user import User, UserCreate, UserResponse, Token8from ..utils.auth import hash_password, verify_password9from ..utils.jwt import create_access_token10from ..middleware.auth import get_current_user11 12 13router = APIRouter(prefix="/api/auth", tags=["authentication"])14 15 16@router.post("/register", response_model=Token, status_code=status.HTTP_201_CREATED)17async def register(user_data: UserCreate, db: Session = Depends(get_db)):18    """Register a new user with email and password."""19 20    # Check if email already exists21    existing = db.exec(select(User).where(User.email == user_data.email)).first()22    if existing:23        raise HTTPException(24            status_code=status.HTTP_409_CONFLICT,25            detail="Email already registered"26        )27 28    # Create new user29    hashed = hash_password(user_data.password)30    new_user = User(31        email=user_data.email,32        hashed_password=hashed33    )34    db.add(new_user)35    db.commit()36    db.refresh(new_user)37 38    # Create JWT token39    token = create_access_token(user_id=new_user.id, email=new_user.email)40 41    return Token(42        access_token=token,43        user=UserResponse(44            id=new_user.id,45            email=new_user.email,46            created_at=new_user.created_at47        )48    )49 50 51@router.post("/login", response_model=Token)52async def login(user_data: UserCreate, db: Session = Depends(get_db)):53    """Authenticate user and return JWT token."""54 55    # Find user by email56    user = db.exec(select(User).where(User.email == user_data.email)).first()57    if not user:58        raise HTTPException(59            status_code=status.HTTP_401_UNAUTHORIZED,60            detail="Invalid email or password"61        )62 63    # Verify password64    if not verify_password(user_data.password, user.hashed_password):65        raise HTTPException(66            status_code=status.HTTP_401_UNAUTHORIZED,67            detail="Invalid email or password"68        )69 70    # Create JWT token71    token = create_access_token(user_id=user.id, email=user.email)72 73    return Token(74        access_token=token,75        user=UserResponse(76            id=user.id,77            email=user.email,78            created_at=user.created_at79        )80    )81 82 83@router.get("/me", response_model=UserResponse)84async def get_me(current_user: UserResponse = Depends(get_current_user)):85    """Get current authenticated user info."""86    return current_user87 88 89@router.post("/logout", status_code=status.HTTP_200_OK)90async def logout():91    """Logout user and invalidate session."""92    # In a stateless JWT system, the client is responsible for removing the token93    # The server doesn't maintain session state to invalidate94    return {"success": True, "message": "Logged out successfully"}95