import { API_BASE, ApiError } from './client.ts'; import { devUser } from '$lib/auth/dev-stub.svelte.ts'; export interface MediaUploadResult { id: string; url: string; mime_type: string; kind: 'image' | 'audio' | 'video' | 'other'; size_bytes: number; original_filename: string | null; } /** * Lädt ein einzelnes File via multipart/form-data hoch. Anders als der * Standard-API-Helper geht das nicht über `Content-Type: application/json`, * deshalb hier ein eigener Pfad mit FormData + manuellem fetch. */ export async function uploadMedia(file: File | Blob, filename?: string): Promise { const form = new FormData(); const wrapped = file instanceof File ? file : new File([file], filename ?? 'upload.bin'); form.append('file', wrapped); await devUser.ensureFreshToken(); const buildHeaders = (): Record => { const h: Record = {}; if (devUser.token) h['Authorization'] = `Bearer ${devUser.token}`; else if (devUser.stubId) h['X-User-Id'] = devUser.stubId; return h; }; let res = await fetch(`${API_BASE}/api/v1/media/upload`, { method: 'POST', body: form, headers: buildHeaders(), }); if (res.status === 401 && devUser.token) { const refreshed = await devUser.tryRefresh(); if (refreshed) { res = await fetch(`${API_BASE}/api/v1/media/upload`, { method: 'POST', body: form, headers: buildHeaders(), }); } } if (!res.ok) { let body: unknown = null; try { body = await res.json(); } catch { body = await res.text().catch(() => null); } throw new ApiError(res.status, body, `media upload failed: ${res.status}`); } return res.json(); }