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} 인증 요청에 실패했습니다`,
};
}
}
}