174 lines
5.6 KiB
JavaScript
174 lines
5.6 KiB
JavaScript
import axios from 'axios'
|
|
|
|
const api = axios.create({
|
|
baseURL: '/api',
|
|
timeout: 30000,
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
}
|
|
})
|
|
|
|
// Request interceptor
|
|
api.interceptors.request.use(
|
|
config => config,
|
|
error => Promise.reject(error)
|
|
)
|
|
|
|
// Response interceptor
|
|
api.interceptors.response.use(
|
|
response => response.data,
|
|
error => {
|
|
console.error('API Error:', error)
|
|
return Promise.reject(error)
|
|
}
|
|
)
|
|
|
|
// Server API
|
|
export const serverApi = {
|
|
getAll: () => api.get('/servers'),
|
|
getAllActive: () => api.get('/servers/active'),
|
|
getById: (id) => api.get(`/servers/${id}`),
|
|
create: (data) => api.post('/servers', data),
|
|
update: (id, data) => api.put(`/servers/${id}`, data),
|
|
delete: (id) => api.delete(`/servers/${id}`),
|
|
testConnection: (id) => api.post(`/servers/${id}/test-connection`)
|
|
}
|
|
|
|
// LogPath API
|
|
export const logPathApi = {
|
|
getByServerId: (serverId) => api.get(`/log-paths/server/${serverId}`),
|
|
getActiveByServerId: (serverId) => api.get(`/log-paths/server/${serverId}/active`),
|
|
getById: (id) => api.get(`/log-paths/${id}`),
|
|
create: (data) => api.post('/log-paths', data),
|
|
update: (id, data) => api.put(`/log-paths/${id}`, data),
|
|
delete: (id) => api.delete(`/log-paths/${id}`)
|
|
}
|
|
|
|
// Pattern API
|
|
export const patternApi = {
|
|
getAll: () => api.get('/patterns'),
|
|
getAllActive: () => api.get('/patterns/active'),
|
|
getById: (id) => api.get(`/patterns/${id}`),
|
|
create: (data) => api.post('/patterns', data),
|
|
update: (id, data) => api.put(`/patterns/${id}`, data),
|
|
delete: (id) => api.delete(`/patterns/${id}`),
|
|
test: (regex, sampleText) => api.post('/patterns/test', null, { params: { regex, sampleText } })
|
|
}
|
|
|
|
// Setting API
|
|
export const settingApi = {
|
|
getAll: () => api.get('/settings'),
|
|
getAllAsMap: () => api.get('/settings/map'),
|
|
getValue: (key) => api.get(`/settings/${key}`),
|
|
save: (data) => api.post('/settings', data),
|
|
saveAll: (settings) => api.put('/settings', settings),
|
|
delete: (key) => api.delete(`/settings/${key}`)
|
|
}
|
|
|
|
// Scan API
|
|
export const scanApi = {
|
|
// SSE 기반 스캔 시작 (진행상황 실시간 수신)
|
|
startWithProgress: (serverId, onProgress, onComplete, onError) => {
|
|
const eventSource = new EventSource(`/api/scan/start/${serverId}`)
|
|
|
|
eventSource.addEventListener('progress', (event) => {
|
|
const progress = JSON.parse(event.data)
|
|
onProgress && onProgress(progress)
|
|
})
|
|
|
|
eventSource.addEventListener('complete', (event) => {
|
|
const result = JSON.parse(event.data)
|
|
onComplete && onComplete(result)
|
|
eventSource.close()
|
|
})
|
|
|
|
eventSource.addEventListener('error', (event) => {
|
|
if (event.data) {
|
|
onError && onError(event.data)
|
|
}
|
|
eventSource.close()
|
|
})
|
|
|
|
eventSource.onerror = () => {
|
|
eventSource.close()
|
|
}
|
|
|
|
return eventSource
|
|
},
|
|
|
|
// SSE 기반 전체 서버 스캔
|
|
startAllWithProgress: (onProgress, onComplete, onError) => {
|
|
const eventSource = new EventSource('/api/scan/start-all')
|
|
|
|
eventSource.addEventListener('progress', (event) => {
|
|
const progress = JSON.parse(event.data)
|
|
onProgress && onProgress(progress)
|
|
})
|
|
|
|
eventSource.addEventListener('complete', (event) => {
|
|
const results = JSON.parse(event.data)
|
|
onComplete && onComplete(results)
|
|
eventSource.close()
|
|
})
|
|
|
|
eventSource.addEventListener('error', (event) => {
|
|
if (event.data) {
|
|
onError && onError(event.data)
|
|
}
|
|
eventSource.close()
|
|
})
|
|
|
|
eventSource.onerror = () => {
|
|
eventSource.close()
|
|
}
|
|
|
|
return eventSource
|
|
},
|
|
|
|
// 동기 방식 스캔 (간단 실행)
|
|
execute: (serverId) => api.post(`/scan/execute/${serverId}`),
|
|
|
|
// 진행 상황 조회
|
|
getProgress: (serverId) => api.get(`/scan/progress/${serverId}`),
|
|
|
|
// 스캔 이력 조회
|
|
getHistory: (serverId) => api.get(`/scan/history/${serverId}`),
|
|
|
|
// 분석 결과 초기화
|
|
reset: (serverId) => api.delete(`/scan/reset/${serverId}`),
|
|
resetAll: () => api.delete('/scan/reset-all'),
|
|
|
|
// 에러 통계
|
|
getStatsByFile: (serverId) => api.get('/scan/stats/by-file', { params: { serverId } }),
|
|
getStatsByServer: () => api.get('/scan/stats/by-server'),
|
|
getStatsByPattern: (serverId) => api.get('/scan/stats/by-pattern', { params: { serverId } }),
|
|
|
|
// 대시보드용: 서버별 최근 N일 일별 통계
|
|
getDailyStatsByServer: (days = 30) => api.get('/scan/stats/daily-by-server', { params: { days } }),
|
|
|
|
// 월별현황용: 서버별 해당 월 일별 통계
|
|
getMonthlyStatsByServer: (year, month) => api.get('/scan/stats/monthly-by-server', { params: { year, month } }),
|
|
|
|
// 일별현황용: 서버별 해당 날짜 5분 단위 통계
|
|
getTimeStatsByServer: (date, intervalMinutes = 5) => api.get('/scan/stats/time-by-server', { params: { date, intervalMinutes } })
|
|
}
|
|
|
|
// ErrorLog API
|
|
export const errorLogApi = {
|
|
search: (params) => api.get('/error-logs', { params }),
|
|
getById: (id) => api.get(`/error-logs/${id}`),
|
|
getByServer: (serverId, params) => api.get(`/error-logs/server/${serverId}`, { params }),
|
|
getTree: () => api.get('/error-logs/tree'),
|
|
getFiles: (serverId) => api.get('/error-logs/files', { params: { serverId } }),
|
|
deleteByIds: (ids) => api.delete('/error-logs/batch', { data: ids }),
|
|
deleteByFile: (serverId, filePath) => api.delete('/error-logs/by-file', { params: { serverId, filePath } })
|
|
}
|
|
|
|
// Export API (Step 5에서 구현 예정)
|
|
export const exportApi = {
|
|
exportHtml: (params) => api.post('/export/html', params, { responseType: 'blob' }),
|
|
exportTxt: (params) => api.post('/export/txt', params, { responseType: 'blob' })
|
|
}
|
|
|
|
export default api
|