import apiClient from './client' // === Types === export interface BanSystemStatus { enabled: boolean configured: boolean } export interface BanSystemStats { total_users: number active_users: number users_over_limit: number total_requests: number total_punishments: number active_punishments: number nodes_online: number nodes_total: number agents_online: number agents_total: number panel_connected: boolean uptime_seconds: number | null } export interface BanUserIPInfo { ip: string first_seen: string | null last_seen: string | null node: string | null request_count: number country_code: string | null country_name: string | null city: string | null } export interface BanUserRequestLog { timestamp: string source_ip: string destination: string | null dest_port: number | null protocol: string | null action: string | null node: string | null } export interface BanUserListItem { email: string unique_ip_count: number total_requests: number limit: number | null is_over_limit: boolean blocked_count: number last_seen: string | null } export interface BanUsersListResponse { users: BanUserListItem[] total: number offset: number limit: number } export interface BanUserDetailResponse { email: string unique_ip_count: number total_requests: number limit: number | null is_over_limit: boolean blocked_count: number ips: BanUserIPInfo[] recent_requests: BanUserRequestLog[] network_type: string | null } export interface BanPunishmentItem { id: number | null user_id: string uuid: string | null username: string reason: string | null punished_at: string enable_at: string | null ip_count: number limit: number enabled: boolean enabled_at: string | null node_name: string | null } export interface BanPunishmentsListResponse { punishments: BanPunishmentItem[] total: number } export interface BanHistoryResponse { items: BanPunishmentItem[] total: number } export interface BanUserRequest { username: string minutes: number reason?: string } export interface UnbanResponse { success: boolean message: string } export interface BanNodeItem { name: string address: string | null is_connected: boolean last_seen: string | null users_count: number agent_stats: Record | null } export interface BanNodesListResponse { nodes: BanNodeItem[] total: number online: number } export interface BanAgentItem { node_name: string sent_total: number dropped_total: number batches_total: number reconnects: number failures: number queue_size: number queue_max: number dedup_checked: number dedup_skipped: number filter_checked: number filter_filtered: number health: string is_online: boolean last_report: string | null } export interface BanAgentsSummary { total_agents: number online_agents: number total_sent: number total_dropped: number avg_queue_size: number healthy_count: number warning_count: number critical_count: number } export interface BanAgentsListResponse { agents: BanAgentItem[] summary: BanAgentsSummary | null total: number online: number } export interface BanTrafficViolationItem { id: number | null username: string email: string | null violation_type: string description: string | null bytes_used: number bytes_limit: number detected_at: string resolved: boolean } export interface BanTrafficViolationsResponse { violations: BanTrafficViolationItem[] total: number } export interface BanTrafficTopItem { username: string bytes_total: number bytes_limit: number | null over_limit: boolean } export interface BanTrafficResponse { enabled: boolean stats: Record | null top_users: BanTrafficTopItem[] recent_violations: BanTrafficViolationItem[] } // === Settings Types === export interface BanSettingDefinition { key: string value: unknown type: string min_value: number | null max_value: number | null editable: boolean description: string | null category: string | null } export interface BanSettingsResponse { settings: BanSettingDefinition[] } export interface BanWhitelistRequest { username: string } // === Report Types === export interface BanReportTopViolator { username: string count: number } export interface BanReportResponse { period_hours: number current_users: number current_ips: number punishment_stats: Record | null top_violators: BanReportTopViolator[] } // === Health Types === export interface BanHealthComponent { name: string status: string message: string | null details: Record | null } export interface BanHealthResponse { status: string uptime: number | null components: BanHealthComponent[] } export interface BanHealthDetailedResponse { status: string uptime: number | null components: Record } // === Agent History Types === export interface BanAgentHistoryItem { timestamp: string sent_total: number dropped_total: number queue_size: number batches_total: number } export interface BanAgentHistoryResponse { node: string hours: number records: number delta: Record | null first: Record | null last: Record | null history: BanAgentHistoryItem[] } // === API === export const banSystemApi = { // Status getStatus: async (): Promise => { const response = await apiClient.get('/cabinet/admin/ban-system/status') return response.data }, // Stats getStats: async (): Promise => { const response = await apiClient.get('/cabinet/admin/ban-system/stats') return response.data }, // Users getUsers: async (params: { offset?: number limit?: number status?: string } = {}): Promise => { const response = await apiClient.get('/cabinet/admin/ban-system/users', { params }) return response.data }, getUsersOverLimit: async (limit: number = 50): Promise => { const response = await apiClient.get('/cabinet/admin/ban-system/users/over-limit', { params: { limit } }) return response.data }, searchUsers: async (query: string): Promise => { const response = await apiClient.get(`/cabinet/admin/ban-system/users/search/${encodeURIComponent(query)}`) return response.data }, getUser: async (email: string): Promise => { const response = await apiClient.get(`/cabinet/admin/ban-system/users/${encodeURIComponent(email)}`) return response.data }, // Punishments getPunishments: async (): Promise => { const response = await apiClient.get('/cabinet/admin/ban-system/punishments') return response.data }, unbanUser: async (userId: string): Promise => { const response = await apiClient.post(`/cabinet/admin/ban-system/punishments/${userId}/unban`) return response.data }, banUser: async (data: BanUserRequest): Promise => { const response = await apiClient.post('/cabinet/admin/ban-system/ban', data) return response.data }, getPunishmentHistory: async (query: string, limit: number = 20): Promise => { const response = await apiClient.get(`/cabinet/admin/ban-system/history/${encodeURIComponent(query)}`, { params: { limit } }) return response.data }, // Nodes getNodes: async (): Promise => { const response = await apiClient.get('/cabinet/admin/ban-system/nodes') return response.data }, // Agents getAgents: async (params: { search?: string health?: string status?: string } = {}): Promise => { const response = await apiClient.get('/cabinet/admin/ban-system/agents', { params }) return response.data }, getAgentsSummary: async (): Promise => { const response = await apiClient.get('/cabinet/admin/ban-system/agents/summary') return response.data }, // Traffic violations getTrafficViolations: async (limit: number = 50): Promise => { const response = await apiClient.get('/cabinet/admin/ban-system/traffic/violations', { params: { limit } }) return response.data }, // Full Traffic getTraffic: async (): Promise => { const response = await apiClient.get('/cabinet/admin/ban-system/traffic') return response.data }, getTrafficTop: async (limit: number = 20): Promise => { const response = await apiClient.get('/cabinet/admin/ban-system/traffic/top', { params: { limit } }) return response.data }, // Settings getSettings: async (): Promise => { const response = await apiClient.get('/cabinet/admin/ban-system/settings') return response.data }, getSetting: async (key: string): Promise => { const response = await apiClient.get(`/cabinet/admin/ban-system/settings/${key}`) return response.data }, setSetting: async (key: string, value: string): Promise => { const response = await apiClient.post(`/cabinet/admin/ban-system/settings/${key}`, null, { params: { value } }) return response.data }, toggleSetting: async (key: string): Promise => { const response = await apiClient.post(`/cabinet/admin/ban-system/settings/${key}/toggle`) return response.data }, // Whitelist whitelistAdd: async (username: string): Promise => { const response = await apiClient.post('/cabinet/admin/ban-system/settings/whitelist/add', { username }) return response.data }, whitelistRemove: async (username: string): Promise => { const response = await apiClient.post('/cabinet/admin/ban-system/settings/whitelist/remove', { username }) return response.data }, // Reports getReport: async (hours: number = 24): Promise => { const response = await apiClient.get('/cabinet/admin/ban-system/report', { params: { hours } }) return response.data }, // Health getHealth: async (): Promise => { const response = await apiClient.get('/cabinet/admin/ban-system/health') return response.data }, getHealthDetailed: async (): Promise => { const response = await apiClient.get('/cabinet/admin/ban-system/health/detailed') return response.data }, // Agent History getAgentHistory: async (nodeName: string, hours: number = 24): Promise => { const response = await apiClient.get(`/cabinet/admin/ban-system/agents/${encodeURIComponent(nodeName)}/history`, { params: { hours } }) return response.data }, // User Punishment History getUserHistory: async (email: string, limit: number = 20): Promise => { const response = await apiClient.get(`/cabinet/admin/ban-system/users/${encodeURIComponent(email)}/history`, { params: { limit } }) return response.data }, }