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)