Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
63 lines
2.1 KiB
TypeScript
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,
|
|
});
|
|
}
|