const API_BASE = `${location.protocol}//${location.hostname}/api` async function request(path, options = {}) { const url = API_BASE + path const res = await fetch(url, { headers: { 'Content-Type': 'application/json', ...options.headers }, ...options, }) if (res.status === 204) return null if (!res.ok) { const err = await res.json().catch(() => ({})) throw { status: res.status, body: err } } return res.json() } // Categories export const getCategories = () => request('/categories') export const getCategory = (id) => request(`/categories/${id}`) export const createCategory = (data) => request('/categories', { method: 'POST', body: JSON.stringify(data) }) export const updateCategory = (id, data) => request(`/categories/${id}`, { method: 'PUT', body: JSON.stringify(data) }) export const deleteCategory = (id) => request(`/categories/${id}`, { method: 'DELETE' }) // Schemas export const getSchemas = () => request('/schemas') export const getSchema = (id) => request(`/schemas/${id}`) export const createSchema = (data) => request('/schemas', { method: 'POST', body: JSON.stringify(data) }) export const updateSchema = (id, data) => request(`/schemas/${id}`, { method: 'PUT', body: JSON.stringify(data) }) export const deleteSchema = (id, deleteTasks = false) => { const params = deleteTasks ? '?deleteTasks=1' : '' return request(`/schemas/${id}${params}`, { method: 'DELETE' }) } // Tasks export const getTasks = () => request('/tasks') export const getTask = (id) => request(`/tasks/${id}`) export const createTask = (data) => request('/tasks', { method: 'POST', body: JSON.stringify(data) }) export const updateTask = (id, data) => request(`/tasks/${id}`, { method: 'PUT', body: JSON.stringify(data) }) export const deleteTask = (id) => request(`/tasks/${id}`, { method: 'DELETE' }) export const toggleTask = (id) => request(`/tasks/${id}/toggle`, { method: 'PATCH' })