|
|
"""Authentication Router.""" |
|
|
|
|
|
from fastapi import APIRouter, HTTPException, Depends, Query |
|
|
from sqlalchemy.ext.asyncio import AsyncSession |
|
|
|
|
|
from app.shared.db.session import get_db |
|
|
from app.auth import GoogleLoginRequest, LoginResponse, LogoutResponse |
|
|
from app.auth.controls import login_control, logout_control |
|
|
|
|
|
|
|
|
router = APIRouter(prefix="/auth", tags=["Authentication"]) |
|
|
|
|
|
|
|
|
@router.post( |
|
|
"/login", |
|
|
response_model=LoginResponse, |
|
|
summary="Login with Google OAuth", |
|
|
description="Authenticate user with Google OAuth access token and return JWT token.", |
|
|
) |
|
|
async def login( |
|
|
request: GoogleLoginRequest, |
|
|
db: AsyncSession = Depends(get_db), |
|
|
) -> LoginResponse: |
|
|
""" |
|
|
Login with Google OAuth. |
|
|
|
|
|
Verifies the Google access token, creates or updates the user profile, |
|
|
and returns a JWT token for authentication. |
|
|
""" |
|
|
try: |
|
|
result = await login_control(request.access_token, db) |
|
|
|
|
|
return LoginResponse( |
|
|
user_id=result["user_id"], |
|
|
email=result["email"], |
|
|
full_name=result["full_name"], |
|
|
avatar_url=result["avatar_url"], |
|
|
token=result["token"], |
|
|
message="Login successful" |
|
|
) |
|
|
except HTTPException: |
|
|
raise |
|
|
except Exception as e: |
|
|
raise HTTPException( |
|
|
status_code=500, |
|
|
detail=f"Login failed: {str(e)}" |
|
|
) |
|
|
|
|
|
|
|
|
@router.post( |
|
|
"/logout", |
|
|
response_model=LogoutResponse, |
|
|
summary="Logout user", |
|
|
description="Logout the current user.", |
|
|
) |
|
|
async def logout( |
|
|
user_id: str = Query(..., description="User ID (from JWT token)"), |
|
|
db: AsyncSession = Depends(get_db), |
|
|
) -> LogoutResponse: |
|
|
""" |
|
|
Logout user. |
|
|
|
|
|
Performs logout operations such as logging the event. |
|
|
Client should discard the JWT token after this call. |
|
|
""" |
|
|
try: |
|
|
result = await logout_control(user_id, db) |
|
|
|
|
|
return LogoutResponse(message=result["message"]) |
|
|
except Exception as e: |
|
|
raise HTTPException( |
|
|
status_code=500, |
|
|
detail=f"Logout failed: {str(e)}" |
|
|
) |
|
|
|