import { apiFetch, apiUrl } from "@/lib/api"; const BASE = "/api/v1/co_writer"; export interface CoWriterDocumentSummary { id: string; title: string; created_at: number; updated_at: number; preview: string; } export interface CoWriterDocument { id: string; title: string; content: string; created_at: number; updated_at: number; } async function jsonOrThrow(res: Response): Promise { if (!res.ok) { const text = await res.text().catch(() => ""); throw new Error( `Request failed (${res.status}): ${text || res.statusText}`, ); } return res.json() as Promise; } export async function listCoWriterDocuments(): Promise< CoWriterDocumentSummary[] > { const res = await apiFetch(apiUrl(`${BASE}/documents`), { cache: "no-store", }); const data = await jsonOrThrow<{ documents: CoWriterDocumentSummary[] }>(res); return Array.isArray(data?.documents) ? data.documents : []; } export async function createCoWriterDocument(payload?: { title?: string; content?: string; }): Promise { const res = await apiFetch(apiUrl(`${BASE}/documents`), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ title: payload?.title ?? null, content: payload?.content ?? "", }), }); return jsonOrThrow(res); } export async function getCoWriterDocument( docId: string, ): Promise { const res = await apiFetch( apiUrl(`${BASE}/documents/${encodeURIComponent(docId)}`), { cache: "no-store", }, ); return jsonOrThrow(res); } export async function updateCoWriterDocument( docId: string, payload: { title?: string | null; content?: string | null }, ): Promise { const res = await apiFetch( apiUrl(`${BASE}/documents/${encodeURIComponent(docId)}`), { method: "PUT", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ title: payload.title ?? null, content: payload.content ?? null, }), }, ); return jsonOrThrow(res); } export async function deleteCoWriterDocument(docId: string): Promise { const res = await apiFetch( apiUrl(`${BASE}/documents/${encodeURIComponent(docId)}`), { method: "DELETE", }, ); const data = await jsonOrThrow<{ deleted: boolean }>(res); return Boolean(data?.deleted); }