diff --git a/src/shared/apis/base/baseFetcher.ts b/src/shared/apis/base/baseFetcher.ts deleted file mode 100644 index c2a33c39..00000000 --- a/src/shared/apis/base/baseFetcher.ts +++ /dev/null @@ -1,108 +0,0 @@ -type ApiError = Error & { - status: number; - code?: string; -}; - -let refreshPromise: Promise | null = null; -const REQUEST_TIMEOUT_MS = 10_000; -const isAbortError = (error: unknown): boolean => { - return error instanceof DOMException && error.name === 'AbortError'; -}; - -/** - * ### baseFetcher - * @description - * - 모든 API 요청에 공통으로 사용되는 fetch 유틸 함수입니다. - * - `credentials: 'include'`가 기본 적용되어 있어, 쿠키 기반 인증을 사용합니다. - * - 요청 body가 `FormData`인 경우에는 `Content-Type`을 자동으로 설정하지 않습니다. - * - 응답이 401이고 `/auth` 도메인이 아닌 경우, 토큰 재발급(`/auth/tokens`)을 1회만 시도한 뒤 - * 원래 요청을 재시도합니다. - * - * @template T - * @param endpoint - API 엔드포인트 경로 (예: `/activities`) - * @param options - fetch API 옵션 (`method`, `body`, `headers` 등) - * @returns 서버 응답 JSON을 제네릭 타입 `T`로 반환합니다. - * - * @throws - * - 인증 만료 또는 재발급 실패 시 Error를 throw합니다. - * - 그 외 응답이 `ok`가 아닐 경우 서버 메시지를 포함한 Error를 throw합니다. - */ -export const baseFetcher = async (endpoint: string, options: RequestInit = {}): Promise => { - const BASE_URL = process.env.NEXT_PUBLIC_API_URL; - if (!BASE_URL) { - throw new Error('NEXT_PUBLIC_API_URL 환경 변수가 설정되지 않았습니다.'); - } - - const isFormData = typeof FormData !== 'undefined' && options.body instanceof FormData; - - const request = async (): Promise => { - const controller = new AbortController(); - const headers = new Headers(options.headers); - - if (isFormData) { - headers.delete('Content-Type'); - } else if (!headers.has('Content-Type')) { - headers.set('Content-Type', 'application/json'); - } - - const timeoutId = setTimeout(() => { - controller.abort(); - }, REQUEST_TIMEOUT_MS); - - try { - const response = await fetch(`${BASE_URL}${endpoint}`, { - ...options, - credentials: 'include', - signal: controller.signal, - headers: (() => { - return headers; - })(), - }); - - return response; - } catch (error) { - if (isAbortError(error)) { - throw new Error('요청 시간이 초과되었습니다.'); - } - throw error; - } finally { - clearTimeout(timeoutId); - } - }; - - let response = await request(); - - if (response.status === 401 && !endpoint.startsWith('/auth')) { - if (!refreshPromise) { - refreshPromise = fetch(`${BASE_URL}/auth/tokens`, { - method: 'POST', - credentials: 'include', - }) - .then((res) => { - if (!res.ok) { - throw new Error('토큰 재발급 실패'); - } - }) - .finally(() => { - refreshPromise = null; - }); - } - - try { - await refreshPromise; - response = await request(); - } catch { - throw new Error('인증이 만료되었습니다. 다시 로그인해주세요.'); - } - } - - if (!response.ok) { - const errorData: { message?: string; code?: string } = await response.json().catch(() => ({})); - const error = new Error(errorData.message || 'API 요청 중 오류가 발생했습니다.') as ApiError; - error.status = response.status; - error.code = errorData.code; - - throw error; - } - return response.status === 204 ? (undefined as T) : response.json(); -}; diff --git a/src/shared/apis/base/coreFetch.ts b/src/shared/apis/base/coreFetch.ts new file mode 100644 index 00000000..fb8263f9 --- /dev/null +++ b/src/shared/apis/base/coreFetch.ts @@ -0,0 +1,109 @@ +import { isRecord } from '@/shared/utils/errorGuards'; + +type ApiError = Error & { + status: number; + code?: string; +}; + +type AbortError = { + name: 'AbortError'; +}; + +export const isAbortError = (error: unknown): error is AbortError => { + if (!isRecord(error)) { + return false; + } + + return error.name === 'AbortError'; +}; + +/** + * ### coreFetch + * + * @description + * URL과 RequestInit 옵션을 받아 fetch 요청을 실행하는 공통 실행기 함수입니다. + * + * @error + * - 요청이 abort된 경우(시간 초과 또는 외부 취소), Error를 throw 합니다. + * - HTTP 상태 코드가 2xx가 아닌 경우, status와 code를 포함한 ApiError를 throw 합니다. + * + * @param url + * - 완성된 요청 URL + * @param options + * - fetch에 전달할 RequestInit 옵션 + * @param timeoutMs + * - 요청 제한 시간(ms), 기본값은 10초 + * + * @returns + * 응답이 204(No Content)인 경우 undefined를 반환하고 그 외는 JSON 파싱 데이터 반환 + */ +export const coreFetch = async ( + url: string, + options: RequestInit = {}, + timeoutMs: number = 10_000 +): Promise => { + const isFormData = typeof FormData !== 'undefined' && options.body instanceof FormData; + + const request = async (): Promise => { + const controller = new AbortController(); + const headers = new Headers(options.headers); + let abortedByTimeout = false; + + if (isFormData) { + headers.delete('Content-Type'); + } else if (!headers.has('Content-Type')) { + headers.set('Content-Type', 'application/json'); + } + + let abortHandler: (() => void) | undefined; + + if (options.signal) { + abortHandler = () => controller.abort(); + + if (options.signal.aborted) { + controller.abort(); + } else { + options.signal.addEventListener('abort', abortHandler); + } + } + + const timeoutId = setTimeout(() => { + abortedByTimeout = true; + controller.abort(); + }, timeoutMs); + + try { + const response = await fetch(url, { + ...options, + signal: controller.signal, + headers, + }); + return response; + } catch (error) { + if (isAbortError(error)) { + if (abortedByTimeout) { + throw new Error('요청 시간이 초과되었습니다. 다시 시도해주세요.'); + } + throw new Error('요청이 취소되었습니다.'); + } + throw error; + } finally { + clearTimeout(timeoutId); + if (options.signal && abortHandler) { + options.signal.removeEventListener('abort', abortHandler); + } + } + }; + + const response = await request(); + + if (!response.ok) { + const errorData: { message?: string; code?: string } = await response.json().catch(() => ({})); + const error = new Error(errorData.message || 'API 요청 중 오류가 발생했습니다.') as ApiError; + error.status = response.status; + error.code = errorData.code; + + throw error; + } + return response.status === 204 ? (undefined as T) : response.json(); +}; diff --git a/src/shared/apis/base/publicFetch.ts b/src/shared/apis/base/publicFetch.ts new file mode 100644 index 00000000..f3bc78a8 --- /dev/null +++ b/src/shared/apis/base/publicFetch.ts @@ -0,0 +1,34 @@ +import { coreFetch } from '@/shared/apis/base/coreFetch'; + +/** + * ### publicFetch + * + * @description + * - 비인증(public) API 호출을 위한 fetch 래퍼 함수입니다. + * + * @param endpoint + * - `/`로 시작하는 백엔드 API 엔드포인트 + * + * @param options + * - fetch에 전달할 RequestInit 옵션 + * + * @param timeoutMs + * - 요청 제한 시간(ms) + * - 지정하지 않으면 coreFetch의 기본 timeout을 사용합니다. + * + * @returns + * JSON 파싱된 응답 데이터 + */ +export const publicFetch = async ( + endpoint: string, + options: RequestInit = {}, + timeoutMs?: number +): Promise => { + const BASE_URL = process.env.NEXT_PUBLIC_API_URL; + if (!BASE_URL) { + throw new Error('NEXT_PUBLIC_API_URL 환경 변수가 설정되지 않았습니다.'); + } + const url = BASE_URL + endpoint; + + return coreFetch(url, options, timeoutMs); +}; diff --git a/src/shared/apis/feature/activities.ts b/src/shared/apis/feature/activities.ts index 1925f439..f82e256b 100644 --- a/src/shared/apis/feature/activities.ts +++ b/src/shared/apis/feature/activities.ts @@ -1,4 +1,4 @@ -import { baseFetcher } from '@/shared/apis/base/baseFetcher'; +import { publicFetch } from '@/shared/apis/base/publicFetch'; import type { CreateActivityBodyDto, CreateReservationBodyDto, @@ -16,7 +16,7 @@ import { createQueryString } from '@/shared/utils/createQueryString'; */ export const getActivities = (params: GetActivitiesParams) => { const queryString = createQueryString(params); - return baseFetcher(`/activities${queryString}`, { method: 'GET' }); + return publicFetch(`/activities${queryString}`, { method: 'GET' }); }; /** @@ -26,7 +26,7 @@ export const getActivities = (params: GetActivitiesParams) => { * @returns 체험 등록 API 응답 Promise */ export const createActivity = (data: CreateActivityBodyDto) => { - return baseFetcher(`/activities`, { method: 'POST', body: JSON.stringify(data) }); + return publicFetch(`/activities`, { method: 'POST', body: JSON.stringify(data) }); }; /** @@ -36,7 +36,7 @@ export const createActivity = (data: CreateActivityBodyDto) => { * @returns 체험 상세 조회 API 응답 Promise */ export const getActivityDetail = (activityId: number) => { - return baseFetcher(`/activities/${activityId}`, { method: 'GET' }); + return publicFetch(`/activities/${activityId}`, { method: 'GET' }); }; /** @@ -48,7 +48,7 @@ export const getActivityDetail = (activityId: number) => { */ export const getActivitySchedules = (activityId: number, params: GetActivitySchedulesParams) => { const queryString = createQueryString(params); - return baseFetcher(`/activities/${activityId}/available-schedule${queryString}`, { + return publicFetch(`/activities/${activityId}/available-schedule${queryString}`, { method: 'GET', }); }; @@ -62,7 +62,7 @@ export const getActivitySchedules = (activityId: number, params: GetActivitySche */ export const getActivityReviews = (activityId: number, params: GetActivityReviewsParams) => { const queryString = createQueryString(params); - return baseFetcher(`/activities/${activityId}/reviews${queryString}`, { + return publicFetch(`/activities/${activityId}/reviews${queryString}`, { method: 'GET', }); }; @@ -75,7 +75,7 @@ export const getActivityReviews = (activityId: number, params: GetActivityReview * @returns 체험 예약 신청 API 응답 Promise */ export const createActivityReservation = (activityId: number, data: CreateReservationBodyDto) => { - return baseFetcher(`/activities/${activityId}/reservations`, { + return publicFetch(`/activities/${activityId}/reservations`, { method: 'POST', body: JSON.stringify(data), }); @@ -91,7 +91,7 @@ export const createActivityImage = (image: File) => { const formData = new FormData(); formData.append('image', image); - return baseFetcher<{ imageUrl: string }>('/activities/images', { + return publicFetch<{ imageUrl: string }>('/activities/images', { method: 'POST', body: formData, }); diff --git a/src/shared/apis/feature/auth.ts b/src/shared/apis/feature/auth.ts index 4dfd668a..a24a091d 100644 --- a/src/shared/apis/feature/auth.ts +++ b/src/shared/apis/feature/auth.ts @@ -1,26 +1,25 @@ -import { baseFetcher } from '@/shared/apis/base/baseFetcher'; -import type { LoginRequest } from '@/shared/types/auth.types'; +// import type { LoginRequest } from '@/shared/types/auth.types'; /** - * 로그인 API + * 로그인 API (BFF) * * @param data - 로그인에 필요한 사용자 정보 * @returns 로그인 API 응답 Promise */ -export const logIn = (data: LoginRequest) => { - return baseFetcher('/auth/login', { - method: 'POST', - body: JSON.stringify(data), - }); -}; +// export const logIn = (data: LoginRequest) => { +// return baseFetcher('/auth/login', { +// method: 'POST', +// body: JSON.stringify(data), +// }); +// }; /** - * 토큰 재발급 API + * 토큰 재발급 API (BFF) * * @returns 토큰 재발급 API 응답 Promise */ -export const refreshToken = () => { - return baseFetcher('/auth/tokens', { - method: 'POST', - }); -}; +// export const refreshToken = () => { +// return baseFetcher('/auth/tokens', { +// method: 'POST', +// }); +// }; diff --git a/src/shared/apis/feature/myActivities.ts b/src/shared/apis/feature/myActivities.ts index f2584a4a..c049ab0f 100644 --- a/src/shared/apis/feature/myActivities.ts +++ b/src/shared/apis/feature/myActivities.ts @@ -1,121 +1,121 @@ -import { baseFetcher } from '@/shared/apis/base/baseFetcher'; -import type { - GetMyActivitiesParams, - GetMyActivityReservationDashboardParams, - GetMyActivityReservedSchedulesParams, - GetMyActivityReservationsParams, - UpdateMyActivityReservationBodyDto, - UpdateMyActivityBodyDto, -} from '@/shared/types/myActivities.types'; -import { createQueryString } from '@/shared/utils/createQueryString'; +// import { baseFetcher } from '@/shared/apis/base/baseFetcher'; +// import type { +// GetMyActivitiesParams, +// GetMyActivityReservationDashboardParams, +// GetMyActivityReservedSchedulesParams, +// GetMyActivityReservationsParams, +// UpdateMyActivityReservationBodyDto, +// UpdateMyActivityBodyDto, +// } from '@/shared/types/myActivities.types'; +// import { createQueryString } from '@/shared/utils/createQueryString'; /** - * 내 체험 리스트 조회 API + * 내 체험 리스트 조회 API (BFF) * * @param params - 내 체험 리스트 조회를 위한 쿼리 파라미터 * @returns 내 체험 리스트 조회 API 응답 Promise */ -export const getMyActivities = (params: GetMyActivitiesParams) => { - const queryString = createQueryString(params); +// export const getMyActivities = (params: GetMyActivitiesParams) => { +// const queryString = createQueryString(params); - return baseFetcher(`/my-activities${queryString}`, { - method: 'GET', - }); -}; +// return baseFetcher(`/my-activities${queryString}`, { +// method: 'GET', +// }); +// }; /** - * 내 체험 월별 예약 현황 조회 API + * 내 체험 월별 예약 현황 조회 API (BFF) * * @param activityId - 조회할 체험 ID * @param params - 월별 예약 현황 조회를 위한 쿼리 파라미터 * @returns 내 체험 월별 예약 현황 조회 API 응답 Promise */ -export const getMyActivityReservationDashboard = ( - activityId: number, - params: GetMyActivityReservationDashboardParams -) => { - const queryString = createQueryString(params); +// export const getMyActivityReservationDashboard = ( +// activityId: number, +// params: GetMyActivityReservationDashboardParams +// ) => { +// const queryString = createQueryString(params); - return baseFetcher(`/my-activities/${activityId}/reservation-dashboard${queryString}`, { - method: 'GET', - }); -}; +// return baseFetcher(`/my-activities/${activityId}/reservation-dashboard${queryString}`, { +// method: 'GET', +// }); +// }; /** - * 내 체험 날짜별 예약 정보가 있는 스케줄 조회 API + * 내 체험 날짜별 예약 정보가 있는 스케줄 조회 API (BFF) * * @param activityId - 조회할 체험 ID * @param params - 날짜별 예약 스케줄 조회를 위한 쿼리 파라미터 * @returns 내 체험 날짜별 예약 스케줄 조회 API 응답 Promise */ -export const getMyActivityReservedSchedules = ( - activityId: number, - params: GetMyActivityReservedSchedulesParams -) => { - const queryString = createQueryString(params); +// export const getMyActivityReservedSchedules = ( +// activityId: number, +// params: GetMyActivityReservedSchedulesParams +// ) => { +// const queryString = createQueryString(params); - return baseFetcher(`/my-activities/${activityId}/reserved-schedule${queryString}`, { - method: 'GET', - }); -}; +// return baseFetcher(`/my-activities/${activityId}/reserved-schedule${queryString}`, { +// method: 'GET', +// }); +// }; /** - * 내 체험 예약 시간대별 예약 내역 조회 API + * 내 체험 예약 시간대별 예약 내역 조회 API (BFF) * * @param activityId - 조회할 체험 ID * @param params - 예약 내역 조회를 위한 쿼리 파라미터 * @returns 내 체험 예약 내역 조회 API 응답 Promise */ -export const getMyActivityReservations = ( - activityId: number, - params: GetMyActivityReservationsParams -) => { - const queryString = createQueryString(params); +// export const getMyActivityReservations = ( +// activityId: number, +// params: GetMyActivityReservationsParams +// ) => { +// const queryString = createQueryString(params); - return baseFetcher(`/my-activities/${activityId}/reservations${queryString}`, { - method: 'GET', - }); -}; +// return baseFetcher(`/my-activities/${activityId}/reservations${queryString}`, { +// method: 'GET', +// }); +// }; /** - * 내 체험 예약 상태 업데이트 API + * 내 체험 예약 상태 업데이트 API (BFF) * * @param activityId - 체험 ID * @param reservationId - 예약 ID * @param data - 예약 상태 업데이트에 필요한 정보 * @returns 내 체험 예약 상태 업데이트 API 응답 Promise */ -export const updateMyActivityReservationStatus = ( - activityId: number, - reservationId: number, - data: UpdateMyActivityReservationBodyDto -) => { - return baseFetcher(`/my-activities/${activityId}/reservations/${reservationId}`, { - method: 'PATCH', - body: JSON.stringify(data), - }); -}; +// export const updateMyActivityReservationStatus = ( +// activityId: number, +// reservationId: number, +// data: UpdateMyActivityReservationBodyDto +// ) => { +// return baseFetcher(`/my-activities/${activityId}/reservations/${reservationId}`, { +// method: 'PATCH', +// body: JSON.stringify(data), +// }); +// }; /** - * 내 체험 삭제 API + * 내 체험 삭제 API (BFF) * * @param activityId - 삭제할 체험 ID * @returns 내 체험 삭제 API 응답 Promise */ -export const deleteMyActivity = (activityId: number) => { - return baseFetcher(`/my-activities/${activityId}`, { method: 'DELETE' }); -}; +// export const deleteMyActivity = (activityId: number) => { +// return baseFetcher(`/my-activities/${activityId}`, { method: 'DELETE' }); +// }; /** - * 내 체험 수정 API + * 내 체험 수정 API (BFF) * * @param activityId - 수정할 체험 ID * @param data - 체험 수정에 필요한 정보 * @returns 내 체험 수정 API 응답 Promise */ -export const updateMyActivity = (activityId: number, data: UpdateMyActivityBodyDto) => { - return baseFetcher(`/my-activities/${activityId}`, { - method: 'PATCH', - body: JSON.stringify(data), - }); -}; +// export const updateMyActivity = (activityId: number, data: UpdateMyActivityBodyDto) => { +// return baseFetcher(`/my-activities/${activityId}`, { +// method: 'PATCH', +// body: JSON.stringify(data), +// }); +// }; diff --git a/src/shared/apis/feature/myNotifications.ts b/src/shared/apis/feature/myNotifications.ts index 78906142..b21ac7d9 100644 --- a/src/shared/apis/feature/myNotifications.ts +++ b/src/shared/apis/feature/myNotifications.ts @@ -1,26 +1,25 @@ -import { baseFetcher } from '@/shared/apis/base/baseFetcher'; -import type { GetMyNotificationsParams } from '@/shared/types/myNotifications.types'; -import { createQueryString } from '@/shared/utils/createQueryString'; +// import type { GetMyNotificationsParams } from '@/shared/types/myNotifications.types'; +// import { createQueryString } from '@/shared/utils/createQueryString'; /** - * 내 알림 리스트 조회 API + * 내 알림 리스트 조회 API (BFF) * * @param params - 내 알림 리스트 조회를 위한 쿼리 파라미터 * @returns 내 알림 리스트 조회 API 응답 Promise */ -export const getMyNotifications = (params: GetMyNotificationsParams) => { - const queryString = createQueryString(params); - return baseFetcher(`/my-notifications${queryString}`, { method: 'GET' }); -}; +// export const getMyNotifications = (params: GetMyNotificationsParams) => { +// const queryString = createQueryString(params); +// return baseFetcher(`/my-notifications${queryString}`, { method: 'GET' }); +// }; /** - * 내 알림 삭제 API + * 내 알림 삭제 API (BFF) * * @param notificationId - 삭제할 알림 ID * @returns 내 알림 삭제 API 응답 Promise */ -export const deleteNotification = (notificationId: number) => { - return baseFetcher(`/my-notifications/${notificationId}`, { - method: 'DELETE', - }); -}; +// export const deleteNotification = (notificationId: number) => { +// return baseFetcher(`/my-notifications/${notificationId}`, { +// method: 'DELETE', +// }); +// }; diff --git a/src/shared/apis/feature/myReservations.ts b/src/shared/apis/feature/myReservations.ts index 60ad18dd..e7d2135c 100644 --- a/src/shared/apis/feature/myReservations.ts +++ b/src/shared/apis/feature/myReservations.ts @@ -1,46 +1,45 @@ -import { baseFetcher } from '@/shared/apis/base/baseFetcher'; -import type { - GetMyReservationsParams, - UpdateMyReservationBodyDto, - CreateReviewBodyDto, -} from '@/shared/types/myReservations.types'; -import { createQueryString } from '@/shared/utils/createQueryString'; +// import type { +// GetMyReservationsParams, +// UpdateMyReservationBodyDto, +// CreateReviewBodyDto, +// } from '@/shared/types/myReservations.types'; +// import { createQueryString } from '@/shared/utils/createQueryString'; /** - * 내 예약 리스트 조회 API + * 내 예약 리스트 조회 API (BFF) * * @param params - 내 예약 리스트 조회를 위한 쿼리 파라미터 * @returns 내 예약 리스트 조회 API 응답 Promise */ -export const getMyReservations = (params: GetMyReservationsParams) => { - const queryString = createQueryString(params); - return baseFetcher(`/my-reservations${queryString}`, { method: 'GET' }); -}; +// export const getMyReservations = (params: GetMyReservationsParams) => { +// const queryString = createQueryString(params); +// return baseFetcher(`/my-reservations${queryString}`, { method: 'GET' }); +// }; /** - * 내 예약 수정(취소) API + * 내 예약 수정(취소) API (BFF) * * @param reservationId - 수정할 예약 ID * @param data - 예약 수정(취소)에 필요한 정보 * @returns 내 예약 수정 API 응답 Promise */ -export const updateMyReservation = (reservationId: number, data: UpdateMyReservationBodyDto) => { - return baseFetcher(`/my-reservations/${reservationId}`, { - method: 'PATCH', - body: JSON.stringify(data), - }); -}; +// export const updateMyReservation = (reservationId: number, data: UpdateMyReservationBodyDto) => { +// return baseFetcher(`/my-reservations/${reservationId}`, { +// method: 'PATCH', +// body: JSON.stringify(data), +// }); +// }; /** - * 내 예약 리뷰 작성 API + * 내 예약 리뷰 작성 API (BFF) * * @param reservationId - 리뷰를 작성할 예약 ID * @param data - 리뷰 작성에 필요한 정보 * @returns 내 예약 리뷰 작성 API 응답 Promise */ -export const createReview = (reservationId: number, data: CreateReviewBodyDto) => { - return baseFetcher(`/my-reservations/${reservationId}/reviews`, { - method: 'POST', - body: JSON.stringify(data), - }); -}; +// export const createReview = (reservationId: number, data: CreateReviewBodyDto) => { +// return baseFetcher(`/my-reservations/${reservationId}/reviews`, { +// method: 'POST', +// body: JSON.stringify(data), +// }); +// }; diff --git a/src/shared/apis/feature/oauth.ts b/src/shared/apis/feature/oauth.ts index 7197b407..6e0cf4f0 100644 --- a/src/shared/apis/feature/oauth.ts +++ b/src/shared/apis/feature/oauth.ts @@ -1,45 +1,44 @@ -import { baseFetcher } from '@/shared/apis/base/baseFetcher'; -import type { - UpsertOauthAppRequestBody, - SignUpWithOauthRequestBody, - SignInWithOauthRequestBody, -} from '@/shared/types/oauth.types'; +// import type { +// UpsertOauthAppRequestBody, +// SignUpWithOauthRequestBody, +// SignInWithOauthRequestBody, +// } from '@/shared/types/oauth.types'; /** - * 간편 로그인 App 등록 및 수정 API + * 간편 로그인 App 등록 및 수정 API (BFF) * * @param data - 간편 로그인 App 등록/수정에 필요한 정보 * @returns 간편 로그인 App 등록/수정 API 응답 Promise */ -export const registerOauthApp = (data: UpsertOauthAppRequestBody) => { - return baseFetcher('/oauth/apps', { - method: 'POST', - body: JSON.stringify(data), - }); -}; +// export const registerOauthApp = (data: UpsertOauthAppRequestBody) => { +// return baseFetcher('/oauth/apps', { +// method: 'POST', +// body: JSON.stringify(data), +// }); +// }; /** - * OAuth 기반 간편 회원가입 API + * OAuth 기반 간편 회원가입 API (BFF) * * @param data - OAuth 회원가입에 필요한 사용자 정보 * @returns OAuth 회원가입 API 응답 Promise */ -export const signUpWithOauth = (data: SignUpWithOauthRequestBody) => { - return baseFetcher('/oauth/sign-up/kakao', { - method: 'POST', - body: JSON.stringify(data), - }); -}; +// export const signUpWithOauth = (data: SignUpWithOauthRequestBody) => { +// return baseFetcher('/oauth/sign-up/kakao', { +// method: 'POST', +// body: JSON.stringify(data), +// }); +// }; /** - * OAuth 기반 간편 로그인 API + * OAuth 기반 간편 로그인 API (BFF) * * @param data - OAuth 로그인에 필요한 사용자 정보 * @returns OAuth 로그인 API 응답 Promise */ -export const signInWithOauth = (data: SignInWithOauthRequestBody) => { - return baseFetcher('/oauth/sign-in/kakao', { - method: 'POST', - body: JSON.stringify(data), - }); -}; +// export const signInWithOauth = (data: SignInWithOauthRequestBody) => { +// return baseFetcher('/oauth/sign-in/kakao', { +// method: 'POST', +// body: JSON.stringify(data), +// }); +// }; diff --git a/src/shared/apis/feature/users.ts b/src/shared/apis/feature/users.ts index e295ca3c..3fe2db31 100644 --- a/src/shared/apis/feature/users.ts +++ b/src/shared/apis/feature/users.ts @@ -1,5 +1,6 @@ -import { baseFetcher } from '@/shared/apis/base/baseFetcher'; -import type { CreateUserBodyDto, UpdateUserBodyDto } from '@/shared/types/auth.types'; +import { publicFetch } from '@/shared/apis/base/publicFetch'; +import type { CreateUserBodyDto } from '@/shared/types/auth.types'; +// import type { UpdateUserBodyDto} from '@/shared/types/auth.types'; /** * 회원가입 요청 API @@ -8,46 +9,46 @@ import type { CreateUserBodyDto, UpdateUserBodyDto } from '@/shared/types/auth.t * @returns 회원가입 API 응답 Promise */ export const signUp = (data: CreateUserBodyDto) => { - return baseFetcher(`/users`, { + return publicFetch(`/users`, { method: 'POST', body: JSON.stringify(data), }); }; /** - * 로그인한 사용자의 내 정보 조회 API + * 로그인한 사용자의 내 정보 조회 API (BFF) * * @returns 내 정보 조회 API 응답 Promise */ -export const getMyInfo = () => { - return baseFetcher(`/users/me`, { method: 'GET' }); -}; +// export const getMyInfo = () => { +// return baseFetcher(`/users/me`, { method: 'GET' }); +// }; /** - * 로그인한 사용자의 내 정보 수정 API + * 로그인한 사용자의 내 정보 수정 API (BFF) * * @param data - 수정할 사용자 정보 * @returns 내 정보 수정 API 응답 Promise */ -export const updateMyInfo = (data: UpdateUserBodyDto) => { - return baseFetcher(`/users/me`, { - method: 'PATCH', - body: JSON.stringify(data), - }); -}; +// export const updateMyInfo = (data: UpdateUserBodyDto) => { +// return baseFetcher(`/users/me`, { +// method: 'PATCH', +// body: JSON.stringify(data), +// }); +// }; /** - * 프로필 이미지 업로드를 위한 이미지 URL 생성 API + * 프로필 이미지 업로드를 위한 이미지 URL 생성 API (BFF) * * @param image - 업로드할 프로필 이미지 파일 * @returns 프로필 이미지 URL 생성 API 응답 Promise */ -export const createProfileImageUrl = (image: File) => { - const formData = new FormData(); - formData.append('image', image); +// export const createProfileImageUrl = (image: File) => { +// const formData = new FormData(); +// formData.append('image', image); - return baseFetcher(`/users/me/image`, { - method: 'POST', - body: formData, - }); -}; +// return baseFetcher(`/users/me/image`, { +// method: 'POST', +// body: formData, +// }); +// };