import axios, { type AxiosInstance, type AxiosError } from 'axios'; const API_BASE_URL = import.meta.env.VITE_API_URL || 'http://localhost:3000/api/v1'; // Create axios instance const adminApi: AxiosInstance = axios.create({ baseURL: API_BASE_URL, headers: { 'Content-Type': 'application/json', }, }); // Add token interceptor adminApi.interceptors.request.use( (config) => { const token = localStorage.getItem('access_token'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, (error) => { return Promise.reject(error); } ); // Add response interceptor for error handling adminApi.interceptors.response.use( (response) => response, (error: AxiosError) => { if (error.response?.status === 401) { // Redirect to login localStorage.removeItem('access_token'); window.location.href = '/login'; } return Promise.reject(error); } ); // API helper functions export const adminApiHelpers = { // Users getUsers: (params?: { page?: number; limit?: number; role?: string; isActive?: boolean; search?: string; }) => adminApi.get('/admin/users', { params }), getUser: (id: string) => adminApi.get(`/admin/users/${id}`), getUserActivity: (id: string, days: number = 30) => adminApi.get(`/admin/users/${id}/activity`, { params: { days } }), updateUser: (id: string, data: { role?: string; isActive?: boolean; firstName?: string; lastName?: string; }) => adminApi.put(`/admin/users/${id}`, data), deleteUser: (id: string, hard: boolean = false) => adminApi.delete(`/admin/users/${id}?hard=${hard}`), resetPassword: (id: string) => adminApi.post(`/admin/users/${id}/reset-password`), exportUsers: (format: string = 'csv') => adminApi.post('/admin/users/export', null, { params: { format } }), importUsers: (file: File) => { const formData = new FormData(); formData.append('file', file); return adminApi.post('/admin/users/import', formData, { headers: { 'Content-Type': 'multipart/form-data' }, }); }, // Logs getLogs: (params?: { page?: number; limit?: number; level?: string; type?: string; userId?: string; startDate?: string; endDate?: string; search?: string; minDuration?: number; }) => adminApi.get('/admin/logs', { params }), getErrorLogs: (params?: { page?: number; limit?: number; userId?: string; startDate?: string; endDate?: string; }) => adminApi.get('/admin/logs/errors', { params }), getAccessLogs: (params?: { page?: number; limit?: number; userId?: string; startDate?: string; endDate?: string; }) => adminApi.get('/admin/logs/access', { params }), getLogById: (id: string) => adminApi.get(`/admin/logs/${id}`), getLogStats: (startDate?: string, endDate?: string) => adminApi.get('/admin/logs/stats/summary', { params: { startDate, endDate } }), exportLogs: (params: { format?: string; level?: string; startDate?: string; endDate?: string; }) => adminApi.post('/admin/logs/export', null, { params }), cleanupLogs: (days: number = 30) => adminApi.post('/admin/logs/cleanup', null, { params: { days } }), // Analytics getOverview: () => adminApi.get('/admin/analytics/overview'), getUserGrowth: (days: number = 30) => adminApi.get('/admin/analytics/users/growth', { params: { days } }), getRevenue: (period: string = '30days') => adminApi.get('/admin/analytics/revenue', { params: { period } }), getStorageAnalytics: () => adminApi.get('/admin/analytics/storage'), getApiUsage: (days: number = 7) => adminApi.get('/admin/analytics/api-usage', { params: { days } }), getErrorRate: (days: number = 7) => adminApi.get('/admin/analytics/error-rate', { params: { days } }), // System getHealth: () => adminApi.get('/admin/system/health'), getSystemInfo: () => adminApi.get('/admin/system/info'), getSettings: (category?: string) => adminApi.get('/admin/system/settings', { params: { category } }), getSetting: (key: string) => adminApi.get(`/admin/system/settings/${key}`), createSetting: (data: { key: string; value: string; category: string; description?: string; isPublic?: boolean; }) => adminApi.post('/admin/system/settings', data), updateSetting: (key: string, data: { value: string; description?: string; isPublic?: boolean; }) => adminApi.put(`/admin/system/settings/${key}`, data), deleteSetting: (key: string) => adminApi.delete(`/admin/system/settings/${key}`), // Maintenance getMaintenanceStatus: () => adminApi.get('/admin/maintenance'), enableMaintenance: (message?: string) => adminApi.post('/admin/maintenance/enable', { message }), disableMaintenance: () => adminApi.post('/admin/maintenance/disable'), // Announcements getAnnouncements: (activeOnly: boolean = false) => adminApi.get('/admin/announcements', { params: { activeOnly } }), createAnnouncement: (data: { title: string; message: string; type?: string; priority?: number; targetAudience?: string; startsAt?: string; endsAt?: string; }) => adminApi.post('/admin/announcements', data), updateAnnouncement: (id: string, data: { title?: string; message?: string; type?: string; priority?: number; targetAudience?: string; startsAt?: string; endsAt?: string; }) => adminApi.put(`/admin/announcements/${id}`, data), toggleAnnouncement: (id: string) => adminApi.patch(`/admin/announcements/${id}/toggle`), deleteAnnouncement: (id: string) => adminApi.delete(`/admin/announcements/${id}`), // Audit getAuditLogs: (params?: { page?: number; limit?: number; userId?: string; action?: string; resourceType?: string; resourceId?: string; startDate?: string; endDate?: string; }) => adminApi.get('/admin/audit/logs', { params }), getUserAuditActivity: (userId: string, days: number = 30) => adminApi.get(`/admin/audit/users/${userId}`, { params: { days } }), getResourceHistory: (type: string, id: string) => adminApi.get(`/admin/audit/resource/${type}/${id}`), getAuditStats: (startDate?: string, endDate?: string) => adminApi.get('/admin/audit/stats', { params: { startDate, endDate } }), // Security getFailedLogins: (params?: { page?: number; limit?: number; email?: string; ipAddress?: string; }) => adminApi.get('/admin/security/failed-logins', { params }), getSuspiciousActivity: () => adminApi.get('/admin/security/suspicious-activity'), getAllApiKeys: () => adminApi.get('/admin/security/api-keys'), revokeApiKey: (id: string) => adminApi.patch(`/admin/security/api-keys/${id}/revoke`), getRateLimitViolations: (days: number = 7) => adminApi.get('/admin/security/rate-limits', { params: { days } }), getActiveSessions: () => adminApi.get('/admin/security/sessions'), }; export default adminApi;