O2Sound_ver2_final/backend/app/presentation/api/v1/social.py

57 lines
2.3 KiB
Python

from fastapi import APIRouter, Depends, Query, Request
from fastapi.responses import RedirectResponse
from typing import Optional
from app.dependencies import get_google_service
from app.presentation.schemas.social.google_schema import GoogleTokenResponse, GoogleCallbackResponse, GoogleHealthResponse
from app.infra.google.service import GoogleService
from app.shared.decorator.response_wrapper import response_wrapper
FRONTEND_BASE_URL = "http://localhost:3300"
router = APIRouter(prefix="/social", tags=["social"])
@router.get("/google/login")
async def google_login(
request: Request,
return_url: Optional[str] = Query(None, description="로그인 후 돌아갈 URL"),
google_service: GoogleService = Depends(get_google_service)
):
"""Google OAuth 로그인 시작"""
return await google_service.get_login_url(return_url, request)
@router.get("/google/callback")
async def google_callback(
request: Request,
error: Optional[str] = Query(None, description="Google OAuth 에러"),
google_service: GoogleService = Depends(get_google_service)
):
"""Google OAuth 콜백 처리"""
if error:
error_url = f"{FRONTEND_BASE_URL}/auth/error?error={error}"
return RedirectResponse(url=error_url)
try:
result = await google_service.handle_callback(request)
temp_token_id = result.temp_token_id
return_url = result.return_url or f"{FRONTEND_BASE_URL}/auth/success"
# return_url에 토큰 정보 추가
separator = "&" if "?" in return_url else "?"
redirect_url = f"{return_url}{separator}token={temp_token_id}&auth_success=true"
print(f"🔄 Google OAuth 콜백 완료 - 리다이렉트: {redirect_url}")
return RedirectResponse(url=redirect_url)
except Exception as e:
print(f"❌ Google OAuth 콜백 에러: {e}")
error_url = f"{FRONTEND_BASE_URL}/auth/error?message={str(e)}"
return RedirectResponse(url=error_url)
@router.get("/google/token/{temp_token_id}")
async def get_google_token_info(
temp_token_id: str,
google_service: GoogleService = Depends(get_google_service)
) -> GoogleTokenResponse:
"""임시 토큰 ID로 Google 토큰 정보 조회"""
return await google_service.get_token_by_temp_id(temp_token_id)