feat: add React Query hooks for admin infrastructure endpoints

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
hsiegeln
2026-03-17 16:09:31 +01:00
parent 9fbda7715c
commit b61c32729b
5 changed files with 273 additions and 0 deletions

View File

@@ -0,0 +1,71 @@
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { adminFetch } from './admin-api';
export interface DatabaseStatus {
connected: boolean;
version: string;
host: string;
schema: string;
}
export interface PoolStats {
activeConnections: number;
idleConnections: number;
pendingConnections: number;
maxConnections: number;
maxWaitMillis: number;
}
export interface TableInfo {
tableName: string;
rowEstimate: number;
dataSize: string;
indexSize: string;
}
export interface ActiveQuery {
pid: number;
durationMs: number;
state: string;
query: string;
}
export function useDatabaseStatus() {
return useQuery({
queryKey: ['admin', 'database', 'status'],
queryFn: () => adminFetch<DatabaseStatus>('/database/status'),
});
}
export function useDatabasePool() {
return useQuery({
queryKey: ['admin', 'database', 'pool'],
queryFn: () => adminFetch<PoolStats>('/database/pool'),
refetchInterval: 15000,
});
}
export function useDatabaseTables() {
return useQuery({
queryKey: ['admin', 'database', 'tables'],
queryFn: () => adminFetch<TableInfo[]>('/database/tables'),
});
}
export function useDatabaseQueries() {
return useQuery({
queryKey: ['admin', 'database', 'queries'],
queryFn: () => adminFetch<ActiveQuery[]>('/database/queries'),
refetchInterval: 15000,
});
}
export function useKillQuery() {
const qc = useQueryClient();
return useMutation({
mutationFn: async (pid: number) => {
await adminFetch<void>(`/database/queries/${pid}`, { method: 'DELETE' });
},
onSuccess: () => qc.invalidateQueries({ queryKey: ['admin', 'database', 'queries'] }),
});
}