Ramble-FE / services / oauth / oauth.service.ts
oauth.service.ts
Raw
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<AuthResponse> {
        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<AuthSessionResult>,
        provider: OAuthProvider
    ): Promise<AuthResponse> {
        try {
            await promptAsync();
            return { success: true };
        } catch (error) {
            console.error(`${provider} 인증 요청 실패:`, error);
            return {
                success: false,
                error: `${provider} 인증 요청에 실패했습니다`,
            };
        }
    }
}