async function req(pfad, opts = {}) { const r = await fetch('/api' + pfad, { headers: { 'content-type': 'application/json' }, ...opts, body: opts.body ? JSON.stringify(opts.body) : undefined, }) if (!r.ok) { let detail = r.statusText try { detail = (await r.json()).detail || detail } catch { /* leer */ } throw new Error(detail) } const ct = r.headers.get('content-type') || '' return ct.includes('json') ? r.json() : r.text() } // Pfade: /api/themen//v/… – die Version ist immer Teil der Adresse const e = encodeURIComponent const v = (slug, n) => `/themen/${e(slug)}/v${n}` export const api = { themen: () => req('/themen'), anlegen: (name, hinweise = '', spezialisierung = '') => req('/themen', { method: 'POST', body: { name, hinweise, spezialisierung } }), loeschen: (slug) => req(`/themen/${e(slug)}`, { method: 'DELETE' }), versionAnlegen: (slug, eingaben) => req(`/themen/${e(slug)}/versionen`, { method: 'POST', body: eingaben }), versionLoeschen: (slug, n) => req(v(slug, n), { method: 'DELETE' }), state: (slug, n) => req(v(slug, n)), start: (slug, n) => req(v(slug, n) + '/start', { method: 'POST' }), pause: (slug, n) => req(v(slug, n) + '/pause', { method: 'POST' }), reset: (slug, n) => req(v(slug, n) + '/reset', { method: 'POST' }), buch: (slug, n) => req(v(slug, n) + '/buch'), position: (slug, n) => req(v(slug, n) + '/position'), positionSetzen: (slug, n, daten) => req(v(slug, n) + '/position', { method: 'PUT', body: daten }), buchMdUrl: (slug, n) => '/api' + v(slug, n) + '/buch.md', pdfUrl: (slug, n) => '/api' + v(slug, n) + '/buch.pdf', kernUrl: (slug, n) => '/api' + v(slug, n) + '/kern.md', }