import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { adminFetch } from './admin-api'; import { useRefreshInterval } from '../use-refresh-interval'; // ── Types ────────────────────────────────────────────────────────────── export interface OpenSearchStatus { reachable: boolean; clusterHealth: string; version: string | null; nodeCount: number; host: string; } export interface PipelineStats { queueDepth: number; maxQueueSize: number; failedCount: number; indexedCount: number; debounceMs: number; indexingRate: number; lastIndexedAt: string | null; } export interface IndexInfo { name: string; docCount: number; size: string; sizeBytes: number; health: string; primaryShards: number; replicas: number; } export interface IndicesPage { indices: IndexInfo[]; totalIndices: number; totalDocs: number; totalSize: string; page: number; pageSize: number; totalPages: number; } export interface PerformanceStats { queryCacheHitRate: number; requestCacheHitRate: number; searchLatencyMs: number; indexingLatencyMs: number; heapUsedBytes: number; heapMaxBytes: number; } // ── Query Hooks ──────────────────────────────────────────────────────── export function useOpenSearchStatus() { const refetchInterval = useRefreshInterval(30_000); return useQuery({ queryKey: ['admin', 'opensearch', 'status'], queryFn: () => adminFetch('/opensearch/status'), refetchInterval, }); } export function usePipelineStats() { const refetchInterval = useRefreshInterval(10_000); return useQuery({ queryKey: ['admin', 'opensearch', 'pipeline'], queryFn: () => adminFetch('/opensearch/pipeline'), refetchInterval, }); } export function useOpenSearchIndices(page = 0, size = 20, search = '', prefix = 'executions') { return useQuery({ queryKey: ['admin', 'opensearch', 'indices', prefix, page, size, search], queryFn: () => { const params = new URLSearchParams(); params.set('page', String(page)); params.set('size', String(size)); params.set('prefix', prefix); if (search) params.set('search', search); return adminFetch(`/opensearch/indices?${params}`); }, placeholderData: (prev) => prev, }); } export function useOpenSearchPerformance() { const refetchInterval = useRefreshInterval(30_000); return useQuery({ queryKey: ['admin', 'opensearch', 'performance'], queryFn: () => adminFetch('/opensearch/performance'), refetchInterval, }); } // ── Mutation Hooks ───────────────────────────────────────────────────── export function useDeleteIndex() { const qc = useQueryClient(); return useMutation({ mutationFn: (indexName: string) => adminFetch(`/opensearch/indices/${indexName}`, { method: 'DELETE' }), onSuccess: () => { qc.invalidateQueries({ queryKey: ['admin', 'opensearch', 'indices'] }); }, }); }