import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { adminFetch } from './admin-api'; // ── Types ────────────────────────────────────────────────────────────── export interface DatabaseStatus { connected: boolean; version: string | null; host: string | null; schema: string | null; timescaleDb: boolean; } export interface PoolStats { activeConnections: number; idleConnections: number; threadsAwaitingConnection: number; connectionTimeout: number; maximumPoolSize: number; } export interface TableInfo { tableName: string; rowCount: number; dataSize: string; indexSize: string; dataSizeBytes: number; indexSizeBytes: number; } export interface ActiveQuery { pid: number; durationSeconds: number; state: string; query: string; } // ── Query Hooks ──────────────────────────────────────────────────────── export function useDatabaseStatus() { return useQuery({ queryKey: ['admin', 'database', 'status'], queryFn: () => adminFetch('/database/status'), refetchInterval: 30_000, }); } export function useConnectionPool() { return useQuery({ queryKey: ['admin', 'database', 'pool'], queryFn: () => adminFetch('/database/pool'), refetchInterval: 10_000, }); } export function useDatabaseTables() { return useQuery({ queryKey: ['admin', 'database', 'tables'], queryFn: () => adminFetch('/database/tables'), refetchInterval: 60_000, }); } export function useActiveQueries() { return useQuery({ queryKey: ['admin', 'database', 'queries'], queryFn: () => adminFetch('/database/queries'), refetchInterval: 5_000, }); } // ── Mutation Hooks ───────────────────────────────────────────────────── export function useKillQuery() { const qc = useQueryClient(); return useMutation({ mutationFn: (pid: number) => adminFetch(`/database/queries/${pid}/kill`, { method: 'POST' }), onSuccess: () => { qc.invalidateQueries({ queryKey: ['admin', 'database', 'queries'] }); }, }); }