Implement health check service and global exception handling

This commit is contained in:
Nils-Johan Gynther
2026-04-10 18:14:48 +02:00
parent 650a1bb55c
commit 2efb5b5627
10 changed files with 327 additions and 36 deletions
@@ -1,6 +1,7 @@
'use client';
import { useState, useTransition } from 'react';
import { parseErrorResponse } from '../../lib/error-handler';
import type { InventoryConsumption } from '../../features/inventory/types';
type Props = {
@@ -28,15 +29,16 @@ export default function InventoryConsumptionHistory({ id }: Props) {
});
if (!res.ok) {
const text = await res.text();
throw new Error(text || 'Kunde inte hämta historik.');
const errorMessage = await parseErrorResponse(res);
throw new Error(errorMessage);
}
const data: InventoryConsumption[] = await res.json();
setHistory(data);
setIsOpen(true);
} catch (err) {
setError(err instanceof Error ? err.message : 'Okänt fel');
const message = err instanceof Error ? err.message : 'Ett okänt fel inträffade.';
setError(message);
}
});
};
+5 -3
View File
@@ -2,6 +2,7 @@
import { useState, useTransition } from 'react';
import Link from 'next/link';
import { parseErrorResponse } from '../../lib/error-handler';
import type {
Recipe,
RecipeInventoryPreview,
@@ -74,14 +75,15 @@ export default function RecipePreview({ recipes }: Props) {
});
if (!res.ok) {
const text = await res.text();
throw new Error(text || 'Kunde inte hämta recept-preview.');
const errorMessage = await parseErrorResponse(res);
throw new Error(errorMessage);
}
const data: RecipeInventoryPreview = await res.json();
setPreview(data);
} catch (err) {
setError(err instanceof Error ? err.message : 'Okänt fel');
const message = err instanceof Error ? err.message : 'Ett okänt fel inträffade.';
setError(message);
}
});
};
+5 -2
View File
@@ -3,6 +3,7 @@
import { useState, useEffect } from 'react';
import { useRouter, useParams } from 'next/navigation';
import { fetchJson } from '../../../../lib/api';
import { parseErrorResponse } from '../../../../lib/error-handler';
import type { Product, Recipe } from '../../../../features/inventory/types';
export default function EditRecipePage() {
@@ -99,12 +100,14 @@ export default function EditRecipePage() {
});
if (!response.ok) {
throw new Error('Kunde inte uppdatera receptet');
const errorMessage = await parseErrorResponse(response);
throw new Error(errorMessage);
}
router.push('/recipes');
} catch (err) {
setError((err as Error).message);
const message = err instanceof Error ? err.message : 'Ett okänt fel inträffade. Försök igen.';
setError(message);
} finally {
setIsSaving(false);
}
@@ -3,6 +3,7 @@
import { useState, useEffect } from 'react';
import { useRouter } from 'next/navigation';
import { fetchJson } from '../../../lib/api';
import { parseErrorResponse } from '../../../lib/error-handler';
import type { Product } from '../../../features/inventory/types';
export default function CreateRecipePage() {
@@ -64,12 +65,14 @@ export default function CreateRecipePage() {
});
if (!response.ok) {
throw new Error('Kunde inte spara receptet');
const errorMessage = await parseErrorResponse(response);
throw new Error(errorMessage);
}
router.push('/recipes');
} catch (err) {
setError((err as Error).message);
const message = err instanceof Error ? err.message : 'Ett okänt fel inträffade. Försök igen.';
setError(message);
} finally {
setIsLoading(false);
}