| """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 |
| ) |
|
|