import axios from 'axios'; import Cookies from 'js-cookie'; const api = axios.create({ baseURL: '/api/v1', headers: { 'Content-Type': 'application/json' }, }); // Request interceptor - add auth token api.interceptors.request.use((config) => { const token = Cookies.get('accessToken'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }); // Response interceptor - handle token refresh api.interceptors.response.use( (response) => response, async (error) => { const originalRequest = error.config; if (error.response?.status === 401 && !originalRequest._retry) { originalRequest._retry = true; try { const refreshToken = Cookies.get('refreshToken'); const { data } = await axios.post('/api/v1/auth/refresh-token', { refreshToken }); const { accessToken, refreshToken: newRefresh } = data.data; Cookies.set('accessToken', accessToken, { expires: 1 }); Cookies.set('refreshToken', newRefresh, { expires: 7 }); originalRequest.headers.Authorization = `Bearer ${accessToken}`; return api(originalRequest); } catch { Cookies.remove('accessToken'); Cookies.remove('refreshToken'); window.location.href = '/login'; } } return Promise.reject(error); } ); // Auth API export const authAPI = { register: (data: { email: string; password: string; name: string }) => api.post('/auth/register', data), login: (data: { email: string; password: string }) => api.post('/auth/login', data), me: () => api.get('/auth/me'), logout: () => api.post('/auth/logout'), }; // Scan API export const scanAPI = { getHistory: (params?: Record) => api.get('/scans', { params }), getDetail: (id: string) => api.get(`/scans/${id}`), getCount: () => api.get('/scans/count'), }; // Subscription API export const subscriptionAPI = { getPlans: () => api.get('/subscriptions/plans'), subscribe: (plan: string) => api.post('/subscriptions/subscribe', { plan }), getMySubscriptions: () => api.get('/subscriptions/my'), getPayments: (params?: Record) => api.get('/subscriptions/payments', { params }), checkStatus: (invoiceNumber: string) => api.get(`/subscriptions/status/${invoiceNumber}`), }; // License API export const licenseAPI = { getMy: () => api.get('/licenses/my'), }; // User API export const userAPI = { getProfile: () => api.get('/users/profile'), updateProfile: (data: { name: string }) => api.put('/users/profile', data), changePassword: (data: { currentPassword: string; newPassword: string }) => api.put('/users/change-password', data), }; // Admin API export const adminAPI = { getDashboard: () => api.get('/admin/dashboard'), getUsers: (params?: Record) => api.get('/admin/users', { params }), suspendUser: (id: string) => api.put(`/admin/users/${id}/suspend`), activateUser: (id: string) => api.put(`/admin/users/${id}/activate`), generateLicense: (data: { userId: string; plan: string; durationDays?: number }) => api.post('/admin/licenses', data), getRevenue: (months?: number) => api.get('/admin/revenue', { params: { months } }), }; export default api;