249 lines
6.9 KiB
TypeScript
249 lines
6.9 KiB
TypeScript
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;
|
|
|