import type { PaginatedResponse } from '@shared/models/pagination'; import type { Project, ProjectStatus } from '@shared/models/project'; import { apiFetch } from './http-client'; export type ProjectsListResponse = PaginatedResponse; export interface FetchProjectsParams { limit?: number; offset?: number; status?: ProjectStatus; signal?: AbortSignal; } export const fetchProjects = async ( params: FetchProjectsParams = {} ): Promise => { const searchParams = new URLSearchParams(); if (params.limit !== undefined) { searchParams.set('limit', String(params.limit)); } if (params.offset !== undefined) { searchParams.set('offset', String(params.offset)); } if (params.status) { searchParams.set('status', params.status); } const query = searchParams.toString(); const path = query ? `/projects?${query}` : '/projects'; return apiFetch(path, { signal: params.signal }); }; export interface CreateProjectPayload { name: string; description?: string | null; status?: ProjectStatus; attributes?: string[]; priorityRules?: unknown; } interface SingleProjectResponse { data: Project; } export interface UpdateProjectPayload { name?: string; description?: string | null; status?: ProjectStatus; attributes?: string[]; priorityRules?: unknown; } export const createProject = async ( payload: CreateProjectPayload ): Promise => { const response = await apiFetch('/projects', { method: 'POST', body: { name: payload.name, description: payload.description ?? null, status: payload.status ?? undefined, attributes: payload.attributes ?? [], priorityRules: payload.priorityRules ?? [] } }); return response.data; }; export interface FetchProjectParams { signal?: AbortSignal; } export const fetchProject = async ( projectId: string, params: FetchProjectParams = {} ): Promise => { const response = await apiFetch( `/projects/${projectId}`, { signal: params.signal } ); return response.data; }; export const updateProject = async ( projectId: string, payload: UpdateProjectPayload ): Promise => { const body: Record = {}; if (payload.name !== undefined) { body.name = payload.name; } if (payload.description !== undefined) { body.description = payload.description ?? null; } if (payload.status !== undefined) { body.status = payload.status; } if (payload.attributes !== undefined) { body.attributes = payload.attributes; } if (payload.priorityRules !== undefined) { body.priorityRules = payload.priorityRules; } const response = await apiFetch(`/projects/${projectId}`, { method: 'PATCH', body }); return response.data; }; export const deleteProject = async (projectId: string): Promise => { await apiFetch(`/projects/${projectId}`, { method: 'DELETE' }); };