import { fetchWithAuth } from "@/lib"; import { AuthResponse, GoogleWebLoginParams } from "@/types"; import { ResponseUtils, TokenUtils, tokenStorage } from "@/utils"; import Constants from "expo-constants"; import { Platform } from "react-native"; export class AuthService { private static readonly API_BASE_URL = Constants.expoConfig?.extra?.apiBaseUrl as string; private static readonly CONTENT_TYPE_JSON = "application/json"; private static readonly DEFAULT_HEADERS = { "Content-Type": AuthService.CONTENT_TYPE_JSON, "Ramble-Client-Platform": Platform.OS, }; static async loginWithGoogle(params: GoogleWebLoginParams): Promise { try { const response = await fetch(`${AuthService.API_BASE_URL}/oauth/authorize/google`, { method: "POST", credentials: 'include' as RequestCredentials, headers: AuthService.DEFAULT_HEADERS, body: JSON.stringify(params), }); if (!response.ok) { await ResponseUtils.handleApiError(response, "Google 로그인"); } const tokens = TokenUtils.extractTokensFromHeaders(response.headers); await tokenStorage.setAccessToken(tokens.accessToken); return { success: true }; } catch (error) { return { success: false, error: error instanceof Error ? error.message : "Google 로그인에 실패했습니다" }; } } static async reissueToken(): Promise { try { const response = await fetch(`${AuthService.API_BASE_URL}/auth/reissue`, { method: "POST", credentials: 'include' as RequestCredentials, headers: AuthService.DEFAULT_HEADERS, }); if (!response.ok) { await ResponseUtils.handleApiError(response, "토큰 갱신"); } const tokens = TokenUtils.extractTokensFromHeaders(response.headers); await tokenStorage.setAccessToken(tokens.accessToken); return { success: true }; } catch (error) { await tokenStorage.removeAccessToken(); return { success: false, error: error instanceof Error ? error.message : "토큰 갱신에 실패했습니다" }; } } static async logout(): Promise { try { await fetchWithAuth("/auth/logout", { method: "POST", }); await tokenStorage.removeAccessToken(); return { success: true }; } catch (error) { return { success: false, error: error instanceof Error ? error.message : "로그아웃에 실패했습니다" }; } } }