168 lines
4.7 KiB
TypeScript
168 lines
4.7 KiB
TypeScript
import axios from 'axios';
|
|
import type {
|
|
User,
|
|
Server,
|
|
FanCurve,
|
|
FanCurvePoint,
|
|
TemperatureReading,
|
|
FanReading,
|
|
SensorReading,
|
|
SystemLog,
|
|
DashboardStats,
|
|
ServerStatus,
|
|
ServerSensors,
|
|
FanControlCommand,
|
|
AutoControlSettings,
|
|
SSHSensorData,
|
|
SystemInfo,
|
|
} from '../types';
|
|
|
|
const API_URL = import.meta.env.VITE_API_URL || '';
|
|
|
|
const api = axios.create({
|
|
baseURL: `${API_URL}/api`,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
});
|
|
|
|
// Request interceptor to add auth token
|
|
api.interceptors.request.use((config) => {
|
|
const token = localStorage.getItem('token');
|
|
if (token) {
|
|
config.headers.Authorization = `Bearer ${token}`;
|
|
}
|
|
return config;
|
|
});
|
|
|
|
// Response interceptor to handle auth errors
|
|
api.interceptors.response.use(
|
|
(response) => response,
|
|
(error) => {
|
|
if (error.response?.status === 401) {
|
|
localStorage.removeItem('token');
|
|
window.location.href = '/login';
|
|
}
|
|
return Promise.reject(error);
|
|
}
|
|
);
|
|
|
|
// Auth API
|
|
export const authApi = {
|
|
login: (username: string, password: string) =>
|
|
api.post<{ access_token: string; token_type: string }>('/auth/login', {
|
|
username,
|
|
password,
|
|
}),
|
|
getMe: () => api.get<User>('/auth/me'),
|
|
};
|
|
|
|
// Setup API
|
|
export const setupApi = {
|
|
getStatus: () => api.get<{ setup_complete: boolean }>('/setup/status'),
|
|
completeSetup: (username: string, password: string, confirmPassword: string) =>
|
|
api.post<User>('/setup/complete', {
|
|
username,
|
|
password,
|
|
confirm_password: confirmPassword,
|
|
}),
|
|
};
|
|
|
|
// Servers API
|
|
export const serversApi = {
|
|
getAll: () => api.get<Server[]>('/servers'),
|
|
getById: (id: number) => api.get<Server>(`/servers/${id}`),
|
|
create: (data: {
|
|
name: string;
|
|
vendor: string;
|
|
ipmi: {
|
|
ipmi_host: string;
|
|
ipmi_port: number;
|
|
ipmi_username: string;
|
|
ipmi_password: string;
|
|
};
|
|
ssh: {
|
|
use_ssh: boolean;
|
|
ssh_host?: string;
|
|
ssh_port: number;
|
|
ssh_username?: string;
|
|
ssh_password?: string;
|
|
ssh_key_file?: string;
|
|
};
|
|
}) => api.post<Server>('/servers', data),
|
|
update: (id: number, data: any) =>
|
|
api.put<Server>(`/servers/${id}`, data),
|
|
delete: (id: number) => api.delete(`/servers/${id}`),
|
|
getStatus: (id: number) => api.get<ServerStatus>(`/servers/${id}/status`),
|
|
getSensors: (id: number) => api.get<ServerSensors>(`/servers/${id}/sensors`),
|
|
getPower: (id: number) => api.get<Record<string, string>>(`/servers/${id}/power`),
|
|
// SSH endpoints
|
|
getSSHSensors: (id: number) => api.get<SSHSensorData>(`/servers/${id}/ssh/sensors`),
|
|
getSSHSystemInfo: (id: number) => api.get<SystemInfo>(`/servers/${id}/ssh/system-info`),
|
|
executeSSHCommand: (id: number, command: string) =>
|
|
api.post<{ exit_code: number; stdout: string; stderr: string }>(`/servers/${id}/ssh/execute`, { command }),
|
|
};
|
|
|
|
// Fan Control API
|
|
export const fanControlApi = {
|
|
enableManual: (serverId: number) =>
|
|
api.post(`/servers/${serverId}/fans/manual/enable`),
|
|
disableManual: (serverId: number) =>
|
|
api.post(`/servers/${serverId}/fans/manual/disable`),
|
|
setSpeed: (serverId: number, command: FanControlCommand) =>
|
|
api.post(`/servers/${serverId}/fans/set`, command),
|
|
enableAuto: (serverId: number, settings: AutoControlSettings) =>
|
|
api.post(`/servers/${serverId}/auto-control/enable`, settings),
|
|
disableAuto: (serverId: number) =>
|
|
api.post(`/servers/${serverId}/auto-control/disable`),
|
|
};
|
|
|
|
// Fan Curves API
|
|
export const fanCurvesApi = {
|
|
getAll: (serverId: number) =>
|
|
api.get<FanCurve[]>(`/servers/${serverId}/fan-curves`),
|
|
create: (
|
|
serverId: number,
|
|
data: {
|
|
name: string;
|
|
curve_data: FanCurvePoint[];
|
|
sensor_source: string;
|
|
is_active: boolean;
|
|
}
|
|
) => api.post<FanCurve>(`/servers/${serverId}/fan-curves`, data),
|
|
update: (
|
|
serverId: number,
|
|
curveId: number,
|
|
data: {
|
|
name: string;
|
|
curve_data: FanCurvePoint[];
|
|
sensor_source: string;
|
|
is_active: boolean;
|
|
}
|
|
) => api.put<FanCurve>(`/servers/${serverId}/fan-curves/${curveId}`, data),
|
|
delete: (serverId: number, curveId: number) =>
|
|
api.delete(`/servers/${serverId}/fan-curves/${curveId}`),
|
|
};
|
|
|
|
// Dashboard API
|
|
export const dashboardApi = {
|
|
getStats: () => api.get<DashboardStats>('/dashboard/stats'),
|
|
getServerData: (serverId: number) =>
|
|
api.get<{
|
|
server: Server;
|
|
current_temperatures: TemperatureReading[];
|
|
current_fans: FanReading[];
|
|
recent_sensor_data: SensorReading[];
|
|
recent_fan_data: FanReading[];
|
|
power_consumption: Record<string, string> | null;
|
|
}>(`/dashboard/servers/${serverId}`),
|
|
};
|
|
|
|
// Logs API
|
|
export const logsApi = {
|
|
getAll: (params?: { server_id?: number; event_type?: string; limit?: number }) =>
|
|
api.get<SystemLog[]>('/logs', { params }),
|
|
};
|
|
|
|
export default api;
|