diff --git a/src/app/api/komga/home/route.ts b/src/app/api/komga/home/route.ts index 885af02..fc8b7f6 100644 --- a/src/app/api/komga/home/route.ts +++ b/src/app/api/komga/home/route.ts @@ -3,12 +3,16 @@ import { HomeService } from "@/lib/services/home.service"; import { ERROR_CODES } from "@/constants/errorCodes"; import { AppError } from "@/utils/errors"; import { getErrorMessage } from "@/utils/errors"; -export const dynamic = "force-dynamic"; +export const revalidate = 60; export async function GET() { try { const data = await HomeService.getHomeData(); - return NextResponse.json(data); + return NextResponse.json(data, { + headers: { + 'Cache-Control': 'public, s-maxage=60, stale-while-revalidate=120' + } + }); } catch (error) { console.error("API Home - Erreur:", error); if (error instanceof AppError) { diff --git a/src/app/api/komga/libraries/[libraryId]/series/route.ts b/src/app/api/komga/libraries/[libraryId]/series/route.ts index eca340b..0638a5e 100644 --- a/src/app/api/komga/libraries/[libraryId]/series/route.ts +++ b/src/app/api/komga/libraries/[libraryId]/series/route.ts @@ -4,7 +4,7 @@ import { ERROR_CODES } from "@/constants/errorCodes"; import { AppError } from "@/utils/errors"; import { getErrorMessage } from "@/utils/errors"; import type { NextRequest } from "next/server"; -export const dynamic = "force-dynamic"; +export const revalidate = 60; const DEFAULT_PAGE_SIZE = 20; @@ -26,7 +26,14 @@ export async function GET( LibraryService.getLibrary(libraryId) ]); - return NextResponse.json({ series, library }); + return NextResponse.json( + { series, library }, + { + headers: { + 'Cache-Control': 'public, s-maxage=60, stale-while-revalidate=120' + } + } + ); } catch (error) { console.error("API Library Series - Erreur:", error); if (error instanceof AppError) { diff --git a/src/app/api/komga/series/[seriesId]/books/route.ts b/src/app/api/komga/series/[seriesId]/books/route.ts index 594e967..e2d7552 100644 --- a/src/app/api/komga/series/[seriesId]/books/route.ts +++ b/src/app/api/komga/series/[seriesId]/books/route.ts @@ -4,7 +4,7 @@ import { ERROR_CODES } from "@/constants/errorCodes"; import { AppError } from "@/utils/errors"; import { getErrorMessage } from "@/utils/errors"; import type { NextRequest } from "next/server"; -export const dynamic = "force-dynamic"; +export const revalidate = 60; const DEFAULT_PAGE_SIZE = 20; @@ -25,7 +25,14 @@ export async function GET( SeriesService.getSeries(seriesId) ]); - return NextResponse.json({ books, series }); + return NextResponse.json( + { books, series }, + { + headers: { + 'Cache-Control': 'public, s-maxage=60, stale-while-revalidate=120' + } + } + ); } catch (error) { console.error("API Series Books - Erreur:", error); if (error instanceof AppError) { diff --git a/src/app/api/komga/series/[seriesId]/route.ts b/src/app/api/komga/series/[seriesId]/route.ts index e75d8b1..9000875 100644 --- a/src/app/api/komga/series/[seriesId]/route.ts +++ b/src/app/api/komga/series/[seriesId]/route.ts @@ -5,7 +5,7 @@ import { AppError } from "@/utils/errors"; import type { KomgaSeries } from "@/types/komga"; import { getErrorMessage } from "@/utils/errors"; import type { NextRequest } from "next/server"; -export const dynamic = "force-dynamic"; +export const revalidate = 60; export async function GET( request: NextRequest, @@ -15,7 +15,11 @@ export async function GET( const seriesId: string = (await params).seriesId; const series: KomgaSeries = await SeriesService.getSeries(seriesId); - return NextResponse.json(series); + return NextResponse.json(series, { + headers: { + 'Cache-Control': 'public, s-maxage=60, stale-while-revalidate=120' + } + }); } catch (error) { console.error("API Series - Erreur:", error); if (error instanceof AppError) { diff --git a/src/app/libraries/[libraryId]/ClientLibraryPage.tsx b/src/app/libraries/[libraryId]/ClientLibraryPage.tsx index 92655a3..240afb6 100644 --- a/src/app/libraries/[libraryId]/ClientLibraryPage.tsx +++ b/src/app/libraries/[libraryId]/ClientLibraryPage.tsx @@ -55,7 +55,9 @@ export function ClientLibraryPage({ params.append("search", search); } - const response = await fetch(`/api/komga/libraries/${libraryId}/series?${params}`); + const response = await fetch(`/api/komga/libraries/${libraryId}/series?${params}`, { + cache: 'default' // Utilise le cache HTTP du navigateur + }); if (!response.ok) { const errorData = await response.json(); @@ -98,7 +100,9 @@ export function ClientLibraryPage({ params.append("search", search); } - const response = await fetch(`/api/komga/libraries/${libraryId}/series?${params}`); + const response = await fetch(`/api/komga/libraries/${libraryId}/series?${params}`, { + cache: 'reload' // Force un nouveau fetch après invalidation + }); if (!response.ok) { throw new Error("Error refreshing library"); @@ -130,7 +134,9 @@ export function ClientLibraryPage({ params.append("search", search); } - const response = await fetch(`/api/komga/libraries/${libraryId}/series?${params}`); + const response = await fetch(`/api/komga/libraries/${libraryId}/series?${params}`, { + cache: 'reload' // Force un nouveau fetch lors du retry + }); if (!response.ok) { const errorData = await response.json(); diff --git a/src/app/series/[seriesId]/ClientSeriesPage.tsx b/src/app/series/[seriesId]/ClientSeriesPage.tsx index 9b8cdd4..96ef5c9 100644 --- a/src/app/series/[seriesId]/ClientSeriesPage.tsx +++ b/src/app/series/[seriesId]/ClientSeriesPage.tsx @@ -46,7 +46,9 @@ export function ClientSeriesPage({ unread: String(unreadOnly), }); - const response = await fetch(`/api/komga/series/${seriesId}/books?${params}`); + const response = await fetch(`/api/komga/series/${seriesId}/books?${params}`, { + cache: 'default' // Utilise le cache HTTP du navigateur + }); if (!response.ok) { const errorData = await response.json(); @@ -85,7 +87,9 @@ export function ClientSeriesPage({ unread: String(unreadOnly), }); - const response = await fetch(`/api/komga/series/${seriesId}/books?${params}`); + const response = await fetch(`/api/komga/series/${seriesId}/books?${params}`, { + cache: 'reload' // Force un nouveau fetch après invalidation + }); if (!response.ok) { throw new Error("Erreur lors du rafraîchissement de la série"); @@ -113,7 +117,9 @@ export function ClientSeriesPage({ unread: String(unreadOnly), }); - const response = await fetch(`/api/komga/series/${seriesId}/books?${params}`); + const response = await fetch(`/api/komga/series/${seriesId}/books?${params}`, { + cache: 'reload' // Force un nouveau fetch lors du retry + }); if (!response.ok) { const errorData = await response.json(); diff --git a/src/components/home/ClientHomePage.tsx b/src/components/home/ClientHomePage.tsx index 734bddb..ec864cc 100644 --- a/src/components/home/ClientHomePage.tsx +++ b/src/components/home/ClientHomePage.tsx @@ -19,7 +19,9 @@ export function ClientHomePage() { setError(null); try { - const response = await fetch("/api/komga/home"); + const response = await fetch("/api/komga/home", { + cache: 'default' // Utilise le cache HTTP du navigateur + }); if (!response.ok) { const errorData = await response.json(); @@ -61,7 +63,9 @@ export function ClientHomePage() { } // Récupérer les nouvelles données - const response = await fetch("/api/komga/home"); + const response = await fetch("/api/komga/home", { + cache: 'reload' // Force un nouveau fetch après invalidation + }); if (!response.ok) { throw new Error("Erreur lors du rafraîchissement de la page d'accueil"); diff --git a/src/components/ui/cover-client.tsx b/src/components/ui/cover-client.tsx index 920fd9a..59969c7 100644 --- a/src/components/ui/cover-client.tsx +++ b/src/components/ui/cover-client.tsx @@ -22,14 +22,14 @@ export const CoverClient = ({ const [isLoading, setIsLoading] = useState(true); const timeoutRef = useRef(null); - // Timeout de sécurité : si l'image ne se charge pas en 10 secondes, on arrête le loading + // Timeout de sécurité : si l'image ne se charge pas en 30 secondes, on arrête le loading useEffect(() => { timeoutRef.current = setTimeout(() => { if (isLoading) { - console.warn("Image loading timeout for:", imageUrl); setIsLoading(false); + setImageError(true); } - }, 10000); + }, 30000); return () => { if (timeoutRef.current) { @@ -49,8 +49,8 @@ export const CoverClient = ({ if (timeoutRef.current) { clearTimeout(timeoutRef.current); } - console.error("Image loading error for:", imageUrl); setImageError(true); + setIsLoading(false); }; if (imageError) {