import axios, { AxiosInstance, AxiosError, InternalAxiosRequestConfig } from 'axios'; const ANALYTICS_HOST = process.env.NEXT_PUBLIC_ANALYTICS_HOST || 'http://localhost:8086'; export const analyticsClient: AxiosInstance = axios.create({ baseURL: ANALYTICS_HOST, timeout: 30000, headers: { 'Content-Type': 'application/json', }, }); // Request interceptor - JWT 토큰 μΆ”κ°€ analyticsClient.interceptors.request.use( (config: InternalAxiosRequestConfig) => { console.log('πŸš€ Analytics API Request:', { method: config.method?.toUpperCase(), url: config.url, baseURL: config.baseURL, params: config.params, }); const token = localStorage.getItem('accessToken'); if (token && config.headers) { config.headers.Authorization = `Bearer ${token}`; console.log('πŸ”‘ Token added to analytics request'); } return config; }, (error: AxiosError) => { console.error('❌ Analytics Request Error:', error); return Promise.reject(error); } ); // Response interceptor - μ—λŸ¬ 처리 analyticsClient.interceptors.response.use( (response) => { console.log('βœ… Analytics API Response:', { status: response.status, url: response.config.url, data: response.data, }); return response; }, (error: AxiosError) => { console.error('❌ Analytics API Error:', { message: error.message, status: error.response?.status, statusText: error.response?.statusText, url: error.config?.url, data: error.response?.data, }); if (error.response?.status === 401) { console.warn('πŸ”’ 401 Unauthorized - Redirecting to login'); localStorage.removeItem('accessToken'); if (typeof window !== 'undefined') { window.location.href = '/login'; } } return Promise.reject(error); } ); export default analyticsClient;