/
alexefan136
/
flowstack
Обзор
Документация
Войти
/
alexefan136
/
flowstack
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
ui/src/lib/tasks-api.ts
151 строка
5 KB
Alexander Efanov
Обновление репозитория
15 июл 2026, 12:19
15 июл 2026, 12:19
76704c6
Код
Авторство
О чём код?
// src/lib/api/tasks-api.ts import { getAuthHeaders } from './stores/auth-store'; import type { Task, CreateTaskRequest, UpdateTaskRequest } from './types/task-types'; const API_BASE = 'http://localhost:8080'; function getRequestHeaders(workspaceId?: string): Record<string, string> { return { 'Content-Type': 'application/json', ...getAuthHeaders(), ...(workspaceId ? { 'X-Workspace-ID': workspaceId } : {}), }; } // ============================================================================ // Tasks CRUD // ============================================================================ export async function fetchTasks(workspaceId: string, params?: { status?: string; priority?: string; limit?: number; offset?: number; }): Promise<Task[]> { const query = new URLSearchParams(); if (params?.status) query.set('status', params.status); if (params?.priority) query.set('priority', params.priority); if (params?.limit) query.set('limit', String(params.limit)); if (params?.offset) query.set('offset', String(params.offset)); const qs = query.toString(); const url = `${API_BASE}/api/v1/tasks${qs ? `?${qs}` : ''}`; const res = await fetch(url, { headers: getRequestHeaders(workspaceId) }); if (!res.ok) throw new Error(`Failed to fetch tasks: ${await res.text()}`); return res.json(); } export async function fetchTask(taskId: string, workspaceId: string): Promise<Task> { const res = await fetch(`${API_BASE}/api/v1/tasks/${taskId}`, { headers: getRequestHeaders(workspaceId), }); if (!res.ok) throw new Error(`Failed to fetch task: ${await res.text()}`); return res.json(); } export async function createTask( workspaceId: string, data: CreateTaskRequest ): Promise<Task> { const res = await fetch(`${API_BASE}/api/v1/tasks`, { method: 'POST', headers: getRequestHeaders(workspaceId), body: JSON.stringify(data), }); if (!res.ok) throw new Error(`Failed to create task: ${await res.text()}`); return res.json(); } export async function updateTask( taskId: string, workspaceId: string, data: UpdateTaskRequest ): Promise<Task> { const res = await fetch(`${API_BASE}/api/v1/tasks/${taskId}`, { method: 'PATCH', headers: getRequestHeaders(workspaceId), body: JSON.stringify(data), }); if (!res.ok) throw new Error(`Failed to update task: ${await res.text()}`); return res.json(); } export async function deleteTask(taskId: string, workspaceId: string): Promise<void> { const res = await fetch(`${API_BASE}/api/v1/tasks/${taskId}`, { method: 'DELETE', headers: getRequestHeaders(workspaceId), }); if (!res.ok) throw new Error(`Failed to delete task: ${await res.text()}`); } // ============================================================================ // Task Runs // ============================================================================ export interface TaskRunResponse { run_id: string; status: string; started_at: string; } /** * Создаёт новый run для задачи. * Endpoint: POST /api/v1/tasks/{task_id}/runs */ export async function createTaskRun( taskId: string, workspaceId: string ): Promise<TaskRunResponse> { const res = await fetch(`${API_BASE}/api/v1/tasks/${taskId}/runs`, { method: 'POST', headers: getRequestHeaders(workspaceId), }); if (!res.ok) throw new Error(`Failed to create task run: ${await res.text()}`); return res.json(); } export async function updateTaskRun( taskId: string, runId: string, workspaceId: string, data: { status?: string; output?: string; duration_ms?: number; } ): Promise<TaskRunResponse> { const res = await fetch(`${API_BASE}/api/v1/tasks/${taskId}/runs/${runId}`, { method: 'PATCH', headers: getRequestHeaders(workspaceId), body: JSON.stringify(data), }); if (!res.ok) throw new Error(`Failed to update task run: ${await res.text()}`); return res.json(); } // ============================================================================ // Stats & Overdue // ============================================================================ export async function fetchTaskStats(workspaceId: string): Promise<{ total_tasks: number; by_status: Record<string, number>; by_priority: Record<string, number>; overdue_count: number; completed_today: number; }> { const res = await fetch(`${API_BASE}/api/v1/tasks/stats`, { headers: getRequestHeaders(workspaceId), }); if (!res.ok) throw new Error(`Failed to fetch task stats: ${await res.text()}`); return res.json(); } export async function fetchOverdueTasks(workspaceId: string): Promise<Task[]> { const res = await fetch(`${API_BASE}/api/v1/tasks/overdue`, { headers: getRequestHeaders(workspaceId), }); if (!res.ok) throw new Error(`Failed to fetch overdue tasks: ${await res.text()}`); return res.json(); }