import axios from 'axios' // API Base URL (환경변수 또는 기본값) const API_BASE_URL = process.env.NUXT_PUBLIC_API_BASE || 'https://gojinaudi.mycafe24.com/api' // Axios 인스턴스 생성 const apiClient = axios.create({ baseURL: API_BASE_URL, timeout: 30000, headers: { 'Content-Type': 'application/json' } }) // Request Interceptor (토큰 자동 추가) apiClient.interceptors.request.use( (config) => { if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') { const token = localStorage.getItem('admin_token') if (token) { config.headers.Authorization = `Bearer ${token}` console.log('[useApi] Request with token:', config.url, token.substring(0, 20) + '...') } else { console.log('[useApi] Request without token:', config.url) } } return config }, (error) => { return Promise.reject(error) } ) // Response Interceptor (에러 처리) apiClient.interceptors.response.use( (response) => { console.log('[useApi] Response:', response.config.url, response.status) return response }, (error) => { const status = error.response?.status const url = error.config?.url console.log('[useApi] Error:', { url, status, message: error.message, hasToken: !!localStorage.getItem('admin_token') }) // 401 에러만 토큰 삭제 및 로그아웃 처리 if (status === 401) { console.log('[useApi] 401 Unauthorized - 토큰 삭제 및 로그아웃') if (typeof window !== 'undefined') { localStorage.removeItem('admin_token') localStorage.removeItem('admin_user') window.location.href = '/admin' } } else { console.log('[useApi] 401이 아닌 에러 - 토큰 유지') } return Promise.reject(error) } ) export const useApi = () => { // GET 요청 const get = async (url, params = {}) => { try { const response = await apiClient.get(url, { params }) // 전체 응답 반환: { success, data, message } return { data: response.data, error: null } } catch (error) { return { data: null, error: error.response?.data || error.message } } } // POST 요청 const post = async (url, data = {}) => { try { const response = await apiClient.post(url, data) // 전체 응답 반환: { success, data, message } return { data: response.data, error: null } } catch (error) { return { data: null, error: error.response?.data || error.message } } } // PUT 요청 const put = async (url, data = {}) => { try { const response = await apiClient.put(url, data) // 전체 응답 반환: { success, data, message } return { data: response.data, error: null } } catch (error) { return { data: null, error: error.response?.data || error.message } } } // DELETE 요청 const del = async (url) => { try { const response = await apiClient.delete(url) // 전체 응답 반환: { success, data, message } return { data: response.data, error: null } } catch (error) { return { data: null, error: error.response?.data || error.message } } } // 파일 업로드 const upload = async (url, formData) => { try { const response = await apiClient.post(url, formData, { headers: { 'Content-Type': 'multipart/form-data' } }) // 전체 응답 반환: { success, data, message } return { data: response.data, error: null } } catch (error) { return { data: null, error: error.response?.data || error.message } } } return { get, post, put, del, upload } }