import { OAuthProvider } from "@/types"; import { AuthRequest, AuthSessionResult } from "expo-auth-session"; import { AuthResponse, AuthService } from "../auth"; /** * OAuth 인증 처리 서비스 */ export class OAuthService { /** * OAuth 인증 응답을 처리하고 토큰을 반환하는 함수 */ static async processAuthResponse( response: AuthSessionResult | null, request: AuthRequest | null, provider: OAuthProvider ): Promise { if (!response || response.type !== "success") { return { success: false, error: `${provider} 인증이 실패했습니다`, }; } if (response.params.error) { return { success: false, error: `${provider} 인증 오류: ${response.params.error_description || response.params.error}`, }; } const { code } = response.params; if (!code || !request?.codeVerifier || !request?.redirectUri) { return { success: false, error: `${provider} 인증 요청이 유효하지 않습니다`, }; } switch (provider) { case OAuthProvider.GOOGLE: case OAuthProvider.APPLE: return await AuthService.login( { code, codeVerifier: request.codeVerifier, redirectUri: request.redirectUri, }, provider, ); default: const _exhaustiveCheck: never = provider; return { success: false, error: `지원하지 않는 인증 제공자입니다: ${_exhaustiveCheck}`, }; } } /** * OAuth 프롬프트를 시작하는 함수 */ static async startAuthPrompt( promptAsync: () => Promise, provider: OAuthProvider ): Promise { try { await promptAsync(); return { success: true }; } catch (error) { console.error(`${provider} 인증 요청 실패:`, error); return { success: false, error: `${provider} 인증 요청에 실패했습니다`, }; } } }