// API Service for AIOps Platform // 有后端支持的模块调用真实 API,无后端的模块暂用 mock 数据 import { http, type ListResponse } from './http'; import { useUserStore } from '@/store'; import * as mockData from '@/mocks/data'; // ==================== 用户认证 API ==================== export const userApi = { login: async (username: string, password: string) => { return http.post<{ token: string; expires_in: number; user: any }>( '/auth/login', { username, password } ); }, register: async (data: { username: string; password: string; nickname?: string; email?: string }) => { return http.post('/auth/register', data); }, getProfile: async () => { return http.get('/user/profile'); }, updateProfile: async (data: any) => { return http.put('/user/profile', data); }, changePassword: async (data: { old_password: string; new_password: string }) => { return http.put('/user/password', data); }, getUsers: async (params?: { page?: number; page_size?: number; keyword?: string }) => { return http.get('/admin/users', params); }, createUser: async (data: any) => { return http.post('/admin/users', data); }, updateUser: async (id: number | string, data: any) => { return http.put(`/admin/users/${id}`, data); }, deleteUser: async (id: number | string) => { return http.delete(`/admin/users/${id}`); }, batchImport: async (data: { users: any[]; skip_existing?: boolean }) => { return http.post('/admin/users/batch-import', data); }, downloadTemplate: () => { const token = useUserStore.getState().token; const baseUrl = import.meta.env.VITE_API_BASE_URL || 'http://localhost:8080/api/v1'; window.open(`${baseUrl}/admin/users/import-template?token=${token}`, '_blank'); }, }; // ==================== LDAP 配置 API ==================== export const ldapApi = { getConfig: async () => { return http.get('/admin/ldap-config'); }, updateConfig: async (data: any) => { return http.put('/admin/ldap-config', data); }, testConnection: async (data?: { test_user?: string; test_password?: string }) => { return http.post('/admin/ldap-config/test', data || {}); }, listUsers: async (ouDn?: string) => { return http.post('/admin/ldap-config/users', { ou_dn: ouDn || '' }); }, batchImport: async (users: any[]) => { return http.post('/admin/ldap-config/import', { users }); }, listOUs: async () => { return http.post('/admin/ldap-config/ou-list', {}); }, createOU: async (data: { ou_name: string; parent_dn?: string; description?: string }) => { return http.post('/admin/ldap-config/create-ou', data); }, createUser: async (data: { username: string; password: string; display_name?: string; email?: string; ou_dn?: string }) => { return http.post('/admin/ldap-config/create-user', data); }, deleteUser: async (dn: string) => { return http.post('/admin/ldap-config/delete-user', { dn }); }, updateUser: async (data: { dn: string; cn?: string; mail?: string; phone?: string; title?: string }) => { return http.post('/admin/ldap-config/update-user', data); }, }; // ==================== 仪表盘 API ==================== export const dashboardStatsApi = { getStats: async () => { return http.get('/dashboard/stats'); }, getAlerts: async (limit?: number) => { return http.get('/dashboard/recent-alerts', limit ? { limit } : undefined); }, getReleases: async (limit?: number) => { return http.get('/dashboard/recent-releases', limit ? { limit } : undefined); }, getMetrics: async (hours?: number) => { return http.get('/dashboard/metrics', hours ? { hours } : undefined); }, }; // ==================== 服务器管理 API ==================== export const serverApi = { getServers: async (params?: { page?: number; page_size?: number; keyword?: string; status?: string }) => { return http.get('/servers', params); }, getServerDetail: async (id: number | string) => { return http.get(`/servers/${id}`); }, getServerStats: async () => { return http.get('/servers/stats'); }, createServer: async (data: any) => { return http.post('/servers', data); }, updateServer: async (id: number | string, data: any) => { return http.put(`/servers/${id}`, data); }, deleteServer: async (id: number | string) => { return http.delete(`/servers/${id}`); }, batchDelete: async (ids: number[]) => { return http.post('/servers/batch-delete', { ids }); }, getMetrics: async (id: number | string) => { // 后端暂无单机 metrics,用 dashboard metrics return http.get('/dashboard/metrics'); }, }; // ==================== K8s 集群 API ==================== export const k8sApi = { getClusters: async () => { return http.get('/k8s-clusters'); }, getClusterDetail: async (id: number | string) => { return http.get(`/k8s-clusters/${id}`); }, createCluster: async (data: any) => { return http.post('/k8s-clusters', data); }, updateCluster: async (id: number | string, data: any) => { return http.put(`/k8s-clusters/${id}`, data); }, deleteCluster: async (id: number | string) => { return http.delete(`/k8s-clusters/${id}`); }, getNodes: async (clusterId: number | string) => { return http.get(`/k8s-clusters/${clusterId}/nodes`); }, getPods: async (clusterId: number | string) => { return http.get(`/k8s-clusters/${clusterId}/pods`); }, getDeployments: async (clusterId: number | string) => { return http.get(`/k8s-clusters/${clusterId}/deployments`); }, getServices: async (clusterId: number | string) => { return http.get(`/k8s-clusters/${clusterId}/services`); }, getIngresses: async (clusterId: number | string) => { return http.get(`/k8s-clusters/${clusterId}/ingresses`); }, scaleDeployment: async (_clusterId: string, _namespace: string, _name: string, _replicas: number) => { return { success: true }; }, restartDeployment: async (_clusterId: string, _namespace: string, _name: string) => { return { success: true }; }, deletePod: async (_clusterId: string, _namespace: string, _name: string) => { return { success: true }; }, }; // ==================== 告警 API ==================== export const alertApi = { getAlerts: async (params?: { page?: number; page_size?: number; status?: string; severity?: string }) => { return http.get('/alerts', params); }, getRules: async () => { return http.get('/alerts/rules'); }, createRule: async (data: any) => { return http.post('/alerts/rules', data); }, updateRule: async (id: number | string, data: any) => { return http.put(`/alerts/rules/${id}`, data); }, deleteRule: async (id: number | string) => { return http.delete(`/alerts/rules/${id}`); }, toggleRule: async (id: number | string) => { return http.post(`/alerts/rules/${id}/toggle`); }, acknowledge: async (id: number | string) => { return http.post(`/alerts/${id}/ack`); }, // 通知渠道管理 getNotifyChannels: async () => { return http.get('/alerts/notify-channels'); }, createNotifyChannel: async (data: any) => { return http.post('/alerts/notify-channels', data); }, updateNotifyChannel: async (id: number | string, data: any) => { return http.put(`/alerts/notify-channels/${id}`, data); }, deleteNotifyChannel: async (id: number | string) => { return http.delete(`/alerts/notify-channels/${id}`); }, testNotifyChannel: async (id: number | string) => { return http.post(`/alerts/notify-channels/${id}/test`); }, }; // ==================== 流水线 API ==================== export const pipelineApi = { getPipelines: async (params?: { page?: number; page_size?: number }) => { return http.get('/pipelines', params); }, getPipelineDetail: async (id: number | string) => { return http.get(`/pipelines/${id}`); }, createPipeline: async (data: any) => { return http.post('/pipelines', data); }, updatePipeline: async (id: number | string, data: any) => { return http.put(`/pipelines/${id}`, data); }, deletePipeline: async (id: number | string) => { return http.delete(`/pipelines/${id}`); }, triggerPipeline: async (id: number | string) => { return http.post(`/pipelines/${id}/trigger`); }, getRuns: async (id: number | string) => { return http.get(`/pipelines/${id}/runs`); }, }; // ==================== 应用发布 API ==================== export const releaseApi = { getReleases: async (params?: { page?: number; page_size?: number }) => { return http.get('/releases', params); }, createRelease: async (data: any) => { return http.post('/releases', data); }, approveRelease: async (id: number | string) => { return http.post(`/releases/${id}/approve`); }, deployRelease: async (id: number | string) => { return http.post(`/releases/${id}/deploy`); }, rollbackRelease: async (id: number | string) => { return http.post(`/releases/${id}/rollback`); }, }; // ==================== 定时任务 API ==================== export const cronJobApi = { getJobs: async (params?: { page?: number; page_size?: number }) => { return http.get('/cron-jobs', params); }, getJob: async (id: number | string) => { return http.get(`/cron-jobs/${id}`); }, createJob: async (data: any) => { return http.post('/cron-jobs', data); }, updateJob: async (id: number | string, data: any) => { return http.put(`/cron-jobs/${id}`, data); }, deleteJob: async (id: number | string) => { return http.delete(`/cron-jobs/${id}`); }, toggleJob: async (id: number | string) => { return http.post(`/cron-jobs/${id}/toggle`); }, executeJob: async (id: number | string) => { return http.post(`/cron-jobs/${id}/execute`); }, }; // ==================== 脚本 API ==================== export const scriptApi = { getScripts: async (params?: { page?: number; page_size?: number }) => { return http.get('/scripts', params); }, getScript: async (id: number | string) => { return http.get(`/scripts/${id}`); }, createScript: async (data: any) => { return http.post('/scripts', data); }, updateScript: async (id: number | string, data: any) => { return http.put(`/scripts/${id}`, data); }, deleteScript: async (id: number | string) => { return http.delete(`/scripts/${id}`); }, executeScript: async (id: number | string) => { return http.post(`/scripts/${id}/execute`); }, }; // ==================== 任务执行记录 API ==================== export const taskExecutionApi = { getExecutions: async (params?: { task_type?: string; task_id?: string; page?: number; page_size?: number }) => { return http.get('/task-executions', params); }, }; // ==================== 审批流程 API ==================== export const approvalApi = { getTemplates: async () => { return http.get('/approvals/templates'); }, getTemplate: async (id: number | string) => { return http.get(`/approvals/templates/${id}`); }, createTemplate: async (data: any) => { return http.post('/approvals/templates', data); }, updateTemplate: async (id: number | string, data: any) => { return http.put(`/approvals/templates/${id}`, data); }, deleteTemplate: async (id: number | string) => { return http.delete(`/approvals/templates/${id}`); }, getProcesses: async (params?: { page?: number; page_size?: number; status?: string }) => { return http.get('/approvals/processes', params); }, createProcess: async (data: any) => { return http.post('/approvals/processes', data); }, approveProcess: async (id: number | string, comment?: string) => { return http.post(`/approvals/processes/${id}/approve`, { comment }); }, rejectProcess: async (id: number | string, comment?: string) => { return http.post(`/approvals/processes/${id}/reject`, { comment }); }, }; // ==================== 导航管理 API ==================== export const navigationApi = { getGroups: async () => { return http.get('/navigations/groups'); }, createGroup: async (data: any) => { return http.post('/navigations/groups', data); }, updateGroup: async (id: number | string, data: any) => { return http.put(`/navigations/groups/${id}`, data); }, deleteGroup: async (id: number | string) => { return http.delete(`/navigations/groups/${id}`); }, getLinks: async () => { return http.get('/navigations/links'); }, createLink: async (data: any) => { return http.post('/navigations/links', data); }, updateLink: async (id: number | string, data: any) => { return http.put(`/navigations/links/${id}`, data); }, deleteLink: async (id: number | string) => { return http.delete(`/navigations/links/${id}`); }, toggleFavorite: async (id: number | string) => { return http.post(`/navigations/links/${id}/favorite`); }, }; // ==================== 云管理 API ==================== export const cloudApi = { getAccounts: async () => { return http.get('/cloud-accounts'); }, createAccount: async (data: any) => { return http.post('/cloud-accounts', data); }, updateAccount: async (id: number | string, data: any) => { return http.put(`/cloud-accounts/${id}`, data); }, deleteAccount: async (id: number | string) => { return http.delete(`/cloud-accounts/${id}`); }, getDomains: async (params?: { page?: number; page_size?: number; keyword?: string }) => { return http.get('/domains', params); }, createDomain: async (data: any) => { return http.post('/domains', data); }, updateDomain: async (id: number | string, data: any) => { return http.put(`/domains/${id}`, data); }, deleteDomain: async (id: number | string) => { return http.delete(`/domains/${id}`); }, }; // ==================== 云平台 API ==================== export const platformApi = { list: async () => { return http.get('/platforms'); }, create: async (data: any) => { return http.post('/platforms', data); }, update: async (id: number | string, data: any) => { return http.put(`/platforms/${id}`, data); }, delete: async (id: number | string) => { return http.delete(`/platforms/${id}`); }, }; // ==================== 云账单 API ==================== export const billingApi = { getStats: async () => { return http.get('/cloud-billings/stats'); }, list: async (params?: { provider?: string; start_date?: string; end_date?: string; page?: number; page_size?: number }) => { return http.get('/cloud-billings', params); }, create: async (data: any) => { return http.post('/cloud-billings', data); }, batchCreate: async (records: any[]) => { return http.post('/cloud-billings/batch', { records }); }, remove: async (id: number | string) => { return http.delete(`/cloud-billings/${id}`); }, getProviders: async () => { return http.get('/cloud-billings/providers'); }, // 预警规则 listAlertRules: async () => { return http.get('/billing-alerts'); }, createAlertRule: async (data: any) => { return http.post('/billing-alerts', data); }, updateAlertRule: async (id: number | string, data: any) => { return http.put(`/billing-alerts/${id}`, data); }, deleteAlertRule: async (id: number | string) => { return http.delete(`/billing-alerts/${id}`); }, toggleAlertRule: async (id: number | string) => { return http.post(`/billing-alerts/${id}/toggle`); }, }; // ==================== Agent 监控 API ==================== export const agentApi = { getLatest: () => http.get('/agent/latest'), getHistory: (hostname: string, hours = 1) => http.get(`/agent/history/${hostname}?hours=${hours}`), createTask: (data: { hostname: string; type: string; command: string; timeout?: number }) => http.post('/agent/tasks', data), listTasks: (params?: Record) => http.get('/agent/tasks', params), listRules: () => http.get('/agent/rules'), createRule: (data: any) => http.post('/agent/rules', data), updateRule: (id: number, data: any) => http.put(`/agent/rules/${id}`, data), deleteRule: (id: number) => http.delete(`/agent/rules/${id}`), listAlerts: (params?: Record) => http.get('/agent/alerts', params), resolveAlert: (id: number) => http.post(`/agent/alerts/${id}/resolve`), }; // ==================== 区域管理 API ==================== export const regionApi = { list: async () => { return http.get('/regions'); }, create: async (data: any) => { return http.post('/regions', data); }, update: async (id: number | string, data: any) => { return http.put(`/regions/${id}`, data); }, delete: async (id: number | string) => { return http.delete(`/regions/${id}`); }, }; // ==================== 资源模型 API ==================== export const resourceModelApi = { list: async () => { return http.get('/resource-models'); }, create: async (data: any) => { return http.post('/resource-models', data); }, update: async (id: number | string, data: any) => { return http.put(`/resource-models/${id}`, data); }, delete: async (id: number | string) => { return http.delete(`/resource-models/${id}`); }, }; // ==================== 审计日志 API ==================== export const auditApi = { getLogs: async (params?: { page?: number; page_size?: number; module?: string; action?: string }) => { return http.get('/audit/logs', params); }, getModules: async () => { return http.get('/audit/modules'); }, getActions: async () => { return http.get('/audit/actions'); }, getStatistics: async () => { return http.get('/audit/statistics'); }, clearLogs: async () => { return http.post('/audit/logs/clear'); }, }; // ==================== 以下模块暂无后端,使用 Mock 数据 ==================== // SQL Audit API(无后端) export const sqlAuditApi = { getRecords: async () => ({ data: mockData.sqlAuditRecords as any }), getRules: async () => ({ data: mockData.sqlAuditRules as any }), analyzeSQL: async (data: { sql: string }) => { return { data: { id: Date.now().toString(), riskLevel: 'medium', rules: ['规则1'] } }; }, approve: async (id: string) => ({ success: true }), reject: async (id: string) => ({ success: true }), execute: async (id: string) => ({ success: true }), toggleRule: async (ruleId: string, enabled: boolean) => ({ success: true }), }; // Ansible API(无后端) export const ansibleApi = { getPlaybooks: async () => ({ data: mockData.ansiblePlaybooks as any }), getJobs: async () => ({ data: mockData.ansibleJobs as any }), getInventories: async () => ({ data: mockData.ansibleInventories as any }), createPlaybook: async (data: any) => ({ success: true, data: { id: Date.now().toString() } }), deletePlaybook: async (id: string) => ({ success: true }), executePlaybook: async (id: string, config: any) => ({ success: true, data: { jobId: Date.now().toString() } }), }; // Logs API(无后端) export const logsApi = { query: async (query: any) => ({ data: mockData.logMonitorEntries as any }), getSources: async () => ({ data: mockData.logSources as any }), export: async (query: any) => ({ success: true }), }; // Alert Center API(无后端,独立于 alertApi) export const alertCenterApi = { getAlerts: async () => ({ data: mockData.alertCenterAlerts as any }), getRules: async () => ({ data: mockData.alertCenterRules as any }), getChannels: async () => ({ data: mockData.notificationChannels as any }), acknowledge: async (id: string) => ({ success: true }), resolve: async (id: string) => ({ success: true }), silence: async (id: string, duration: string) => ({ success: true }), toggleRule: async (ruleId: string, enabled: boolean) => ({ success: true }), }; // Trace API(无后端) export const traceApi = { getTraces: async (params: any) => ({ data: mockData.traces as any }), getServices: async (timeRange: string) => ({ data: mockData.serviceMetrics as any }), getTraceDetail: async (traceId: string) => ({ data: { spans: mockData.traceSpans as any } }), }; // Grafana Dashboard API(无后端) export const dashboardApi = { getDashboards: async () => ({ data: mockData.grafanaDashboards as any }), getDatasources: async () => ({ data: mockData.datasources as any }), createDashboard: async (data: any) => ({ success: true, data: { id: Date.now().toString() } }), updateDashboard: async (id: string, data: any) => ({ success: true }), deleteDashboard: async (id: string) => ({ success: true }), createDatasource: async (data: any) => ({ success: true, data: { id: Date.now().toString() } }), }; // AI Assistant API(无后端) export const aiAssistantApi = { chat: async (message: string, history: any[]) => { return { data: { reply: `我收到了您的问题: "${message}"。作为AIOps智能助手,我可以帮您分析告警、诊断问题、生成报告等。`, suggestions: ['分析当前告警', '查看性能趋势', '生成运维报告'], }, }; }, analyzeAlert: async (alertId: string) => { return { data: { analysis: '根据告警信息分析,可能是由于数据库连接池耗尽导致的。建议检查数据库连接配置和当前连接数。', recommendations: ['增加连接池大小', '检查慢查询', '重启应用服务'], }, }; }, generateReport: async (params: any) => ({ data: { report: '运维报告已生成...' } }), };