Files
recipe-app/_archive/frontend/lib/error-handler.ts
T
Nils-Johan Gynther ffe50e5151
Test Suite / test (24.15.0) (push) Has been cancelled
feat: add TypeScript definitions for next-auth session with accessToken and user details
2026-05-04 20:09:21 +02:00

68 lines
2.2 KiB
TypeScript

/**
* 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<string> {
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<number, string> = {
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.`;
}