kernelmind/Resume-Screener-API
0
1"""2Authentication routes.3 4Endpoints for user registration, login, and profile.5"""6 7from fastapi import APIRouter, Depends, HTTPException, status8from sqlalchemy.orm import Session9 10from src.database import get_db11from src.auth.models import User12from src.auth.schemas import UserCreate, UserLogin, Token, UserResponse13from src.auth.jwt import create_access_token14from src.auth.dependencies import get_current_user15 16 17router = APIRouter(prefix="/api/v1/auth", tags=["Authentication"])18 19 20@router.post("/register", response_model=UserResponse, status_code=status.HTTP_201_CREATED)21async def register(user_data: UserCreate, db: Session = Depends(get_db)):22 """23 Register a new user.24 25 - **email**: Valid email address (must be unique)26 - **password**: Minimum 6 characters27 """28 try:29 # Check if email already exists30 existing_user = db.query(User).filter(User.email == user_data.email).first()31 if existing_user:32 raise HTTPException(33 status_code=status.HTTP_400_BAD_REQUEST,34 detail="Email already registered"35 )36 37 # Create new user38 hashed_password = User.hash_password(user_data.password)39 new_user = User(email=user_data.email, hashed_password=hashed_password)40 41 db.add(new_user)42 db.commit()43 db.refresh(new_user)44 45 return new_user46 except HTTPException:47 raise48 except Exception as e:49 import traceback50 print(f"Registration error: {e}")51 print(traceback.format_exc())52 raise HTTPException(53 status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,54 detail=f"Registration failed: {str(e)}"55 )56 57 58@router.post("/login", response_model=Token)59async def login(user_data: UserLogin, db: Session = Depends(get_db)):60 """61 Login and get JWT token.62 63 Returns access token that must be included in Authorization header64 for protected endpoints.65 """66 # Find user67 user = db.query(User).filter(User.email == user_data.email).first()68 69 if not user or not user.verify_password(user_data.password):70 raise HTTPException(71 status_code=status.HTTP_401_UNAUTHORIZED,72 detail="Invalid email or password",73 headers={"WWW-Authenticate": "Bearer"},74 )75 76 # Create token77 access_token = create_access_token(data={"sub": user.email})78 79 return Token(access_token=access_token)80 81 82@router.get("/me", response_model=UserResponse)83async def get_me(current_user: User = Depends(get_current_user)):84 """85 Get current user info.86 87 Requires valid JWT token in Authorization header.88 """89 return current_user90 