utp_service/frontend/src/api/tasks.ts

89 lines
2.3 KiB
TypeScript

import { useQuery, useMutation } from '@tanstack/react-query'
import { api } from './client'
export interface TaskEvent {
id: number
message: string
level: string
created_at: string
}
export interface TaskResult {
id: number
device_id: number
status: string
stdout: string | null
stderr: string | null
exit_code: number | null
duration_ms: number | null
executed_at: string | null
}
export interface Task {
id: string
type: string
status: string
target_scope: Record<string, unknown>
target_label: string | null
params: Record<string, unknown>
result: { total: number; ok: number; failed: number } | null
error_message: string | null
created_by: number | null
created_at: string
started_at: string | null
finished_at: string | null
}
export interface TaskDetail extends Task {
events: TaskEvent[]
device_results: TaskResult[]
}
export interface ActionInfo {
name: string
display_name: string
compatible_categories: string[]
params_schema: { name: string; type: string; label: string; required?: boolean }[]
}
export const useTasks = (page = 1, pageSize = 50) =>
useQuery({
queryKey: ['tasks', page, pageSize],
queryFn: () =>
api
.get<Task[]>('/api/v1/tasks', { params: { skip: (page - 1) * pageSize, limit: pageSize } })
.then((r) => r.data),
refetchInterval: 5000,
})
export const useTask = (id: string | undefined) =>
useQuery({
queryKey: ['tasks', id],
queryFn: () => api.get<TaskDetail>(`/api/v1/tasks/${id}`).then((r) => r.data),
enabled: !!id,
refetchInterval: (query) => {
const status = query.state.data?.status
return status === 'running' || status === 'pending' ? 2000 : false
},
})
export const useActions = () =>
useQuery({
queryKey: ['actions'],
queryFn: () => api.get<ActionInfo[]>('/api/v1/tasks/actions').then((r) => r.data),
})
export const useCreateTask = () =>
useMutation({
mutationFn: (body: { type: string; target_scope: object; params: object }) =>
api.post<Task>('/api/v1/tasks', body).then((r) => r.data),
})
export const useDeviceTasks = (deviceId: number) =>
useQuery({
queryKey: ['tasks', 'device', deviceId],
queryFn: () =>
api
.get<Task[]>('/api/v1/tasks', { params: { device_id: deviceId, limit: 100 } })
.then((r) => r.data),
})