|
| 1 | +""" |
| 2 | +Authentication Routes |
| 3 | +Handles user signup, login, and session management |
| 4 | +""" |
| 5 | +from fastapi import APIRouter, HTTPException, Depends, status |
| 6 | +from pydantic import BaseModel, EmailStr |
| 7 | +from typing import Optional, Dict, Any |
| 8 | +from services.auth import get_auth_service |
| 9 | +from middleware.auth import get_current_user |
| 10 | + |
| 11 | +# Create router |
| 12 | +router = APIRouter(prefix="/api/auth", tags=["Authentication"]) |
| 13 | + |
| 14 | + |
| 15 | +# Request/Response Models |
| 16 | +class SignupRequest(BaseModel): |
| 17 | + email: EmailStr |
| 18 | + password: str |
| 19 | + github_username: Optional[str] = None |
| 20 | + |
| 21 | + |
| 22 | +class LoginRequest(BaseModel): |
| 23 | + email: EmailStr |
| 24 | + password: str |
| 25 | + |
| 26 | + |
| 27 | +class RefreshRequest(BaseModel): |
| 28 | + refresh_token: str |
| 29 | + |
| 30 | + |
| 31 | +class AuthResponse(BaseModel): |
| 32 | + user: Dict[str, Any] |
| 33 | + session: Dict[str, Any] |
| 34 | + |
| 35 | + |
| 36 | +# Routes |
| 37 | +@router.post("/signup", response_model=AuthResponse) |
| 38 | +async def signup(request: SignupRequest): |
| 39 | + """ |
| 40 | + Sign up a new user with Supabase Auth |
| 41 | + |
| 42 | + - **email**: Valid email address |
| 43 | + - **password**: Password (min 6 characters recommended) |
| 44 | + - **github_username**: Optional GitHub username for profile |
| 45 | + |
| 46 | + Returns user data and session tokens (access_token, refresh_token) |
| 47 | + """ |
| 48 | + auth_service = get_auth_service() |
| 49 | + return await auth_service.signup( |
| 50 | + email=request.email, |
| 51 | + password=request.password, |
| 52 | + github_username=request.github_username |
| 53 | + ) |
| 54 | + |
| 55 | + |
| 56 | +@router.post("/login", response_model=AuthResponse) |
| 57 | +async def login(request: LoginRequest): |
| 58 | + """ |
| 59 | + Login with email and password |
| 60 | + |
| 61 | + - **email**: Registered email address |
| 62 | + - **password**: User password |
| 63 | + |
| 64 | + Returns user data and session tokens |
| 65 | + """ |
| 66 | + auth_service = get_auth_service() |
| 67 | + return await auth_service.login( |
| 68 | + email=request.email, |
| 69 | + password=request.password |
| 70 | + ) |
| 71 | + |
| 72 | + |
| 73 | +@router.post("/refresh") |
| 74 | +async def refresh(request: RefreshRequest): |
| 75 | + """ |
| 76 | + Refresh access token using refresh token |
| 77 | + |
| 78 | + - **refresh_token**: Valid refresh token from login/signup |
| 79 | + |
| 80 | + Returns new access token |
| 81 | + """ |
| 82 | + auth_service = get_auth_service() |
| 83 | + return await auth_service.refresh_session(request.refresh_token) |
| 84 | + |
| 85 | + |
| 86 | +@router.post("/logout") |
| 87 | +async def logout(user: Dict = Depends(get_current_user)): |
| 88 | + """ |
| 89 | + Logout current user and invalidate session |
| 90 | + |
| 91 | + Requires: Valid JWT token in Authorization header |
| 92 | + """ |
| 93 | + auth_service = get_auth_service() |
| 94 | + return await auth_service.logout(token="") # Supabase handles session |
| 95 | + |
| 96 | + |
| 97 | +@router.get("/me") |
| 98 | +async def get_current_user_info(user: Dict = Depends(get_current_user)): |
| 99 | + """ |
| 100 | + Get current authenticated user information |
| 101 | + |
| 102 | + Requires: Valid JWT token in Authorization header |
| 103 | + |
| 104 | + Returns user profile data |
| 105 | + """ |
| 106 | + return {"user": user} |
0 commit comments