anoderb
Add manual log refresh and clear log buttons; ensured level filtering works
287a59e
Raw
History Blame Contribute Delete
2.71 kB
// lib/api.ts — All API calls to SIKOMO Forecast backend
const BASE = process.env.NEXT_PUBLIC_API_URL || ''
function getToken() {
if (typeof window !== 'undefined') return localStorage.getItem('sikomo_token') || ''
return ''
}
async function req(path: string, opts: RequestInit = {}) {
const res = await fetch(`${BASE}${path}`, {
...opts,
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${getToken()}`,
...opts.headers,
},
})
if (!res.ok) {
const err = await res.json().catch(() => ({ detail: res.statusText }))
throw new Error(err.detail || 'Request gagal')
}
return res.json()
}
export const api = {
// Auth
login: (password: string) => req('/auth/login', { method: 'POST', body: JSON.stringify({ password }) }),
// Komoditas & Prediksi
getKomoditas: () => req('/komoditas'),
getPrediksi: (id: number) => req(`/prediksi/${id}`),
// Forecast actions
runForecast: (komoditas_id: number) => req('/forecast/run', { method: 'POST', body: JSON.stringify({ komoditas_id }) }),
runForecastAll: () => req('/forecast/run-all', { method: 'POST' }),
stopForecast: () => req('/forecast/stop', { method: 'POST' }),
// Status & Logs (realtime)
getStatus: () => req('/status'),
getLogs: (limit = 200, level?: string) => req(`/logs?limit=${limit}${level && level !== 'ALL' ? `&level=${level}` : ''}`),
clearLogs: () => req('/clear-logs', { method: 'POST' }),
// Scheduler (multiple schedules)
getSchedules: () => req('/schedules'),
addSchedule: (cron_expression: string, label: string) => req('/schedules/add', { method: 'POST', body: JSON.stringify({ cron_expression, label }) }),
removeSchedule: (jobId: string) => req(`/schedules/${jobId}/remove`, { method: 'DELETE' }),
startScheduler: () => req('/schedule/start', { method: 'POST' }),
stopScheduler: () => req('/schedule/stop', { method: 'POST' }),
// Runtime settings
getSettings: () => req('/settings'),
updateSetting: (key: string, value: string) => req('/settings', { method: 'POST', body: JSON.stringify({ key, value }) }),
// CRUD
getInsights: (id: number) => req(`/insight/${id}`),
updateInsight: (id: number, body: object) => req(`/insight/${id}`, { method: 'PUT', body: JSON.stringify(body) }),
addInsight: (id: number, body: object) => req(`/insight/${id}`, { method: 'POST', body: JSON.stringify(body) }),
deleteInsight: (id: number) => req(`/insight/${id}`, { method: 'DELETE' }),
updateRingkasan: (id: number, body: object) => req(`/ringkasan/${id}`, { method: 'PUT', body: JSON.stringify(body) }),
updateModelMl: (id: number, body: object) => req(`/model-ml/${id}`, { method: 'PUT', body: JSON.stringify(body) }),
}