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)