TalhaRafique1/Full-stack-Todo
0
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 