suhail
Initial deployment
7ffe51d
"""Authentication API routes."""
from fastapi import APIRouter, Depends, HTTPException, status
from sqlmodel import Session, select
from src.api.deps import get_db, get_current_user
from src.schemas.auth import SignupRequest, SigninRequest, SignupResponse, TokenResponse, UserProfile
from src.services.auth_service import AuthService
from src.models.user import User
router = APIRouter(prefix="/api/auth", tags=["authentication"])
@router.post("/signup", response_model=SignupResponse, status_code=status.HTTP_201_CREATED)
def signup(
signup_data: SignupRequest,
db: Session = Depends(get_db)
):
"""
Register a new user account.
Args:
signup_data: User signup information (email, password, name)
db: Database session
Returns:
SignupResponse: Created user details
Raises:
HTTPException: 400 if validation fails
HTTPException: 409 if email already exists
"""
service = AuthService(db)
return service.signup(signup_data)
@router.post("/signin", response_model=TokenResponse)
def signin(
signin_data: SigninRequest,
db: Session = Depends(get_db)
):
"""
Authenticate user and issue JWT token.
Args:
signin_data: User signin credentials (email, password)
db: Database session
Returns:
TokenResponse: JWT token and user profile
Raises:
HTTPException: 401 if credentials are invalid
"""
service = AuthService(db)
return service.signin(signin_data)
@router.get("/me", response_model=UserProfile)
def get_current_user_profile(
current_user_id: int = Depends(get_current_user),
db: Session = Depends(get_db)
):
"""
Get current authenticated user's profile.
Args:
current_user_id: ID of authenticated user from JWT token
db: Database session
Returns:
UserProfile: Current user's profile information
Raises:
HTTPException: 404 if user not found
"""
user = db.exec(select(User).where(User.id == current_user_id)).first()
if not user:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="User not found"
)
return UserProfile(
id=user.id,
email=user.email,
name=user.name,
created_at=user.created_at
)