cherry2250 974961e1bd 이벤트 목록 Mock 데이터 적용 및 Participation API 연동
- 이벤트 목록 페이지에 Mock 데이터 적용 (evt_2025012301 등 4개 이벤트)
- 이벤트 상세 페이지 Analytics API 임시 주석처리 (서버 이슈)
- Participation API 프록시 라우트 URL 구조 수정 (/events/ 제거)
- EventID localStorage 저장 기능 추가
- 상세한 console.log 추가 (생성된 eventId, objective, timestamp)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-30 20:17:09 +09:00

110 lines
3.2 KiB
TypeScript

import axios, { AxiosInstance, AxiosError, InternalAxiosRequestConfig } from 'axios';
// 마이크로서비스별 호스트 설정
const GATEWAY_HOST = 'http://kt-event-marketing-api.20.214.196.128.nip.io';
const API_HOSTS = {
user: GATEWAY_HOST,
event: GATEWAY_HOST,
content: GATEWAY_HOST,
ai: GATEWAY_HOST,
participation: GATEWAY_HOST,
distribution: GATEWAY_HOST,
analytics: GATEWAY_HOST,
};
const API_VERSION = process.env.NEXT_PUBLIC_API_VERSION || 'api';
// 기본 User API 클라이언트 (Gateway 직접 연결)
const API_BASE_URL = API_HOSTS.user;
export const apiClient: AxiosInstance = axios.create({
baseURL: API_BASE_URL,
timeout: 90000,
headers: {
'Content-Type': 'application/json',
},
});
// Participation API 전용 클라이언트
export const participationClient: AxiosInstance = axios.create({
baseURL: `${API_HOSTS.participation}/${API_VERSION}`,
timeout: 90000,
headers: {
'Content-Type': 'application/json',
},
});
// Distribution API 전용 클라이언트
export const distributionClient: AxiosInstance = axios.create({
baseURL: `${API_HOSTS.distribution}`,
timeout: 90000,
headers: {
'Content-Type': 'application/json',
},
});
// 공통 Request interceptor 함수
const requestInterceptor = (config: InternalAxiosRequestConfig) => {
console.log('🚀 API Request:', {
method: config.method?.toUpperCase(),
url: config.url,
baseURL: config.baseURL,
data: config.data,
});
const token = localStorage.getItem('accessToken');
if (token && config.headers) {
config.headers.Authorization = `Bearer ${token}`;
console.log('🔑 Token added to request');
}
return config;
};
const requestErrorInterceptor = (error: AxiosError) => {
console.error('❌ Request Error:', error);
return Promise.reject(error);
};
// 공통 Response interceptor 함수
const responseInterceptor = (response: any) => {
console.log('✅ API Response:', {
status: response.status,
url: response.config.url,
data: response.data,
});
return response;
};
const responseErrorInterceptor = (error: AxiosError) => {
console.error('❌ 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);
};
// User API Client 인터셉터 적용
apiClient.interceptors.request.use(requestInterceptor, requestErrorInterceptor);
apiClient.interceptors.response.use(responseInterceptor, responseErrorInterceptor);
// Participation API Client 인터셉터 적용
participationClient.interceptors.request.use(requestInterceptor, requestErrorInterceptor);
participationClient.interceptors.response.use(responseInterceptor, responseErrorInterceptor);
// Distribution API Client 인터셉터 적용
distributionClient.interceptors.request.use(requestInterceptor, requestErrorInterceptor);
distributionClient.interceptors.response.use(responseInterceptor, responseErrorInterceptor);
export default apiClient;