// SRC-04: dünner Client für die eigene Backend-for-Frontend-Route // app/api/search/route.ts. Kein direkter Zugriff auf Manticore oder eine // externe Mail-API vom Client aus (Rolle: "Datenzugriff ausschließlich // über die bereitgestellte API"). export class ApiError extends Error {} export interface SearchHit { messageId: string; subjectSnippet: string; bodySnippet: string; score: number; } export interface SearchResponse { hits: SearchHit[]; } // tenantSlug: bis zu einer zentralen Session-/IAM-Anbindung (Core-Board- // Scope, nicht Bestandteil dieser Kachel) wird der Mandant vom Aufrufer // mitgegeben. Die eigentliche Mandantentrennung passiert serverseitig in // mail/internal/search (SRC-01/SRC-03), nicht im Frontend. export async function search(tenantSlug: string, query: string): Promise { const params = new URLSearchParams({ tenant: tenantSlug, q: query }); const res = await fetch(`/api/search?${params.toString()}`); if (!res.ok) { const body = await res.json().catch(() => ({})); throw new ApiError(body.error ?? `Suche fehlgeschlagen (${res.status})`); } return res.json(); }