Files
stack/apps/web/src/lib/api/tasks.ts
Jason Woltje 172ed1d40f
Some checks failed
ci/woodpecker/push/web Pipeline failed
ci/woodpecker/push/orchestrator Pipeline was successful
ci/woodpecker/push/api Pipeline was successful
feat(web): add kanban board page with drag-and-drop (#478)
Co-authored-by: Jason Woltje <jason@diversecanvas.com>
Co-committed-by: Jason Woltje <jason@diversecanvas.com>
2026-02-23 04:26:25 +00:00

49 lines
1.3 KiB
TypeScript

/**
* Task API Client
* Handles task-related API requests
*/
import type { Task } from "@mosaic/shared";
import type { TaskStatus, TaskPriority } from "@mosaic/shared";
import { apiGet, apiPatch, type ApiResponse } from "./client";
export interface TaskFilters {
status?: TaskStatus;
priority?: TaskPriority;
workspaceId?: string;
}
/**
* Fetch tasks with optional filters
*/
export async function fetchTasks(filters?: TaskFilters): Promise<Task[]> {
const params = new URLSearchParams();
// Add filter parameters (not workspace ID - that goes in header)
if (filters?.status) {
params.append("status", filters.status);
}
if (filters?.priority) {
params.append("priority", filters.priority);
}
const queryString = params.toString();
const endpoint = queryString ? `/api/tasks?${queryString}` : "/api/tasks";
// Pass workspaceId via header (X-Workspace-Id) instead of query string
const response = await apiGet<ApiResponse<Task[]>>(endpoint, filters?.workspaceId);
return response.data;
}
/**
* Update a task by ID
*/
export async function updateTask(
id: string,
data: Partial<Task>,
workspaceId?: string
): Promise<Task> {
const res = await apiPatch<ApiResponse<Task>>(`/api/tasks/${id}`, data, workspaceId);
return res.data;
}