/** * Utility för att parse HTTP-responses och extrahera tydliga felmeddelanden */ // Deklarativ mappning av kända tekniska felsträngar → svenska meddelanden const MESSAGE_MAP: Array<{ match: string; label: string }> = [ { match: 'User_email_key', label: 'E-postadressen används redan av en annan användare.' }, { match: 'Det finns redan en annan produkt med detta namn', label: 'Det finns redan en annan produkt med detta namn. Välj ett unikt namn.' }, ]; function translateMessage(msg: string): string { const found = MESSAGE_MAP.find((entry) => msg.includes(entry.match)); return found ? found.label : msg; } export async function parseErrorResponse(response: Response): Promise { const status = response.status; // Läs body som text en gång — Response.body kan bara konsumeras en gång let bodyText = ''; try { bodyText = await response.text(); } catch { // Body kunde inte läsas } // Försök tolka som JSON try { const data = JSON.parse(bodyText); // NestJS class-validator kan returnera message som array if (Array.isArray(data.message) && data.message.length > 0) { return translateMessage(String(data.message[0])); } if (typeof data.message === 'string') { return translateMessage(data.message); } if (typeof data.error === 'string') { return translateMessage(data.error); } if (typeof data.details === 'string') { return translateMessage(data.details); } } catch { // Inte JSON — använd råtexten om den är kortfattad if (bodyText && bodyText.length < 200) { return bodyText; } } // Fallback baserat på HTTP-status const defaultMessages: Record = { 400: 'Ogiltiga data. Kontrollera dina inmatningar.', 401: 'Du är inte autentiserad. Logga in.', 403: 'Du har inte behörighet till detta.', 404: 'Resursen hittades inte.', 409: 'Konflikt med befintlig data.', 422: 'Valideringen misslyckades. Kontrollera dina inmatningar.', 500: 'Serverfel. Försök igen senare.', 503: 'Tjänsten är inte tillgänglig.', }; return defaultMessages[status] || `Fel (${status}). Försök igen senare.`; }