O2Sound_ver2_final/backend/app/infra/google/router.py

56 lines
2.2 KiB
Python

from fastapi import APIRouter, Query, Depends
from fastapi.responses import RedirectResponse
from typing import Optional
from .dto import TokenRequest
from .service import GoogleService, get_google_service
router = APIRouter()
@router.get("/social/google/login")
async def get_google_auth_url(
return_url: str = Query(..., description="로그인 후 돌아갈 URL"),
google_service: GoogleService = Depends(get_google_service)
):
"""Google OAuth 로그인 URL 생성"""
return await google_service.login_url(return_url)
@router.get("/social/google/callback")
async def handle_google_callback(
code: str = Query(..., description="Google에서 제공하는 인증 코드"),
state: str = Query(..., description="CSRF 보호용 state 파라미터"),
error: Optional[str] = Query(None, description="Google 인증 에러"),
google_service: GoogleService = Depends(get_google_service)
):
"""Google OAuth 콜백 처리 후 FE로 리다이렉트"""
if error:
# 에러 시 FE 에러 페이지로
return RedirectResponse(url=f"http://localhost:3300/auth/error?error={error}")
try:
result = await google_service.callback(state, code)
temp_token_id = result["temp_token_id"]
return_url = result.get("return_url")
print(f"return_url: {return_url}")
# 성공 시 FE 성공 페이지로 temp_token_id와 함께 리다이렉트
return RedirectResponse(url=f"{return_url}?token={temp_token_id}")
except Exception as e:
# 처리 실패 시 FE 에러 페이지로
return RedirectResponse(url=f"{return_url}?message={str(e)}")
@router.get("/social/google/token/{temp_token_id}")
async def get_token_info(
temp_token_id: str,
google_service: GoogleService = Depends(get_google_service)
):
"""임시 토큰 ID로 실제 토큰 정보 조회"""
return await google_service.get_token_info(temp_token_id)
@router.post("/youtube/channel/info")
async def get_youtube_channel_info(
req: TokenRequest,
google_service: GoogleService = Depends(get_google_service)
):
"""사용자의 YouTube 채널 정보 조회"""
return await google_service.get_all_youtube_channel_info(req.access_token, req.refresh_token)