Files
UHD_Media_Tool/apps/web/app/api/system.ts
T

63 lines
2.1 KiB
TypeScript

import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import type {
StorageCleanupResult,
StorageCleanupTarget,
SystemHealth,
SystemHealthHistory,
SystemResources,
SystemStorage,
} from "@umt/contracts";
import { apiData } from "~/lib/api.ts";
import { qk } from "~/lib/query-keys.ts";
// 进程与健康(W9-I):GET /system/health、/system/health/history;存储(CACHE-2):GET /system/storage、
// POST /system/storage/cleanup/{target}。仅 admin。
export function useSystemHealth(refetchMs = 15_000) {
return useQuery({
queryKey: qk.sub("system", "health"),
queryFn: ({ signal }) => apiData<SystemHealth>("/system/health", { signal }),
refetchInterval: refetchMs,
});
}
export function useSystemHealthHistory(hours: number) {
return useQuery({
queryKey: qk.sub("system", "history", hours),
queryFn: ({ signal }) => apiData<SystemHealthHistory>("/system/health/history", { params: { hours }, signal }),
refetchInterval: 60_000,
});
}
/** 存储明细:目录用量服务端缓存 5 分钟,这里 1 分钟刷新一次 */
export function useSystemStorage() {
return useQuery({
queryKey: qk.sub("system", "storage"),
queryFn: ({ signal }) => apiData<SystemStorage>("/system/storage", { signal }),
refetchInterval: 60_000,
});
}
/** 手动清理:把对应的维护任务排入立即执行 */
export function useStorageCleanup() {
const qc = useQueryClient();
return useMutation({
mutationFn: (target: StorageCleanupTarget) =>
apiData<StorageCleanupResult>("/system/storage/cleanup/{target}", {
method: "POST",
pathParams: { target },
body: {},
}),
onSuccess: () => void qc.invalidateQueries({ queryKey: qk.sub("system", "storage") }),
});
}
/** 资源监控:CPU / 内存 / 网络 / 磁盘读写的当前值与最近 minutes 分钟趋势(服务端每 5 秒采样) */
export function useSystemResources(minutes = 60, refetchMs = 5_000) {
return useQuery({
queryKey: qk.sub("system", "resources", minutes),
queryFn: ({ signal }) => apiData<SystemResources>("/system/resources", { params: { minutes }, signal }),
refetchInterval: refetchMs,
});
}