import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { adminFetch } from './admin-api'; export interface OpenSearchStatus { connected: boolean; clusterName: string; clusterHealth: string; version: string; numberOfNodes: number; host: string; } export interface PipelineStats { queueDepth: number; maxQueueSize: number; totalIndexed: number; totalFailed: number; avgLatencyMs: number; } export interface IndexInfo { name: string; health: string; status: string; docsCount: number; storeSize: string; primaryShards: number; replicas: number; } export interface PerformanceStats { queryCacheHitRate: number; requestCacheHitRate: number; avgQueryLatencyMs: number; avgIndexLatencyMs: number; jvmHeapUsedPercent: number; jvmHeapUsedBytes: number; jvmHeapMaxBytes: number; } export interface IndicesParams { search?: string; health?: string; sortBy?: string; sortDir?: 'asc' | 'desc'; page?: number; size?: number; } export function useOpenSearchStatus() { return useQuery({ queryKey: ['admin', 'opensearch', 'status'], queryFn: () => adminFetch('/opensearch/status'), }); } export function usePipelineStats() { return useQuery({ queryKey: ['admin', 'opensearch', 'pipeline'], queryFn: () => adminFetch('/opensearch/pipeline'), refetchInterval: 15000, }); } export function useIndices(params: IndicesParams) { const query = new URLSearchParams(); if (params.search) query.set('search', params.search); if (params.health) query.set('health', params.health); if (params.sortBy) query.set('sortBy', params.sortBy); if (params.sortDir) query.set('sortDir', params.sortDir); if (params.page !== undefined) query.set('page', String(params.page)); if (params.size !== undefined) query.set('size', String(params.size)); const qs = query.toString(); return useQuery({ queryKey: ['admin', 'opensearch', 'indices', params], queryFn: () => adminFetch<{ indices: IndexInfo[]; total: number }>( `/opensearch/indices${qs ? `?${qs}` : ''}`, ), }); } export function usePerformanceStats() { return useQuery({ queryKey: ['admin', 'opensearch', 'performance'], queryFn: () => adminFetch('/opensearch/performance'), refetchInterval: 15000, }); } export function useDeleteIndex() { const qc = useQueryClient(); return useMutation({ mutationFn: async (indexName: string) => { await adminFetch(`/opensearch/indices/${encodeURIComponent(indexName)}`, { method: 'DELETE', }); }, onSuccess: () => qc.invalidateQueries({ queryKey: ['admin', 'opensearch', 'indices'] }), }); }