From bd652fc1ff79f964b358b637663a67083f5fd48b Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Fri, 14 Feb 2025 12:51:03 +0100 Subject: [PATCH] refacto: servercomponent and first route for config --- src/app/api/komga/config/route.ts | 16 +++++ src/app/libraries/[libraryId]/page.tsx | 31 +++------ src/app/page.tsx | 95 +++++--------------------- src/app/series/[seriesId]/page.tsx | 37 ++-------- src/app/settings/page.tsx | 6 ++ src/lib/services/library.service.ts | 5 +- src/lib/services/series.service.ts | 9 ++- 7 files changed, 62 insertions(+), 137 deletions(-) create mode 100644 src/app/api/komga/config/route.ts diff --git a/src/app/api/komga/config/route.ts b/src/app/api/komga/config/route.ts new file mode 100644 index 0000000..6a78b62 --- /dev/null +++ b/src/app/api/komga/config/route.ts @@ -0,0 +1,16 @@ +import { NextResponse } from "next/server"; + +export async function POST(request: Request) { + try { + const data = await request.json(); + console.log("Configuration Komga reçue:", data); + + return NextResponse.json({ message: "Configuration reçue avec succès" }, { status: 200 }); + } catch (error) { + console.error("Erreur lors de la réception de la configuration:", error); + return NextResponse.json( + { error: "Erreur lors de la réception de la configuration" }, + { status: 400 } + ); + } +} diff --git a/src/app/libraries/[libraryId]/page.tsx b/src/app/libraries/[libraryId]/page.tsx index c7191b1..bb52aaa 100644 --- a/src/app/libraries/[libraryId]/page.tsx +++ b/src/app/libraries/[libraryId]/page.tsx @@ -1,6 +1,7 @@ import { cookies } from "next/headers"; import { PaginatedSeriesGrid } from "@/components/library/PaginatedSeriesGrid"; import { komgaConfigService } from "@/lib/services/komga-config.service"; +import { LibraryService } from "@/lib/services/library.service"; interface PageProps { params: { libraryId: string }; @@ -13,30 +14,16 @@ async function getLibrarySeries(libraryId: string, page: number = 1, unreadOnly: try { const cookiesStore = cookies(); const config = komgaConfigService.validateAndGetConfig(cookiesStore); + const pageIndex = page - 1; - // Paramètres de pagination - const pageIndex = page - 1; // L'API Komga utilise un index base 0 + const series = await LibraryService.getLibrarySeries( + libraryId, + pageIndex, + PAGE_SIZE, + unreadOnly + ); - // Construire l'URL avec les paramètres - let path = `series?library_id=${libraryId}&page=${pageIndex}&size=${PAGE_SIZE}`; - if (unreadOnly) { - path += "&read_status=UNREAD&read_status=IN_PROGRESS"; - } - - const url = komgaConfigService.buildApiUrl(path, cookiesStore); - const headers = komgaConfigService.getAuthHeaders(cookiesStore); - - const response = await fetch(url, { - headers, - next: { revalidate: 300 }, // Cache de 5 minutes - }); - - if (!response.ok) { - throw new Error(`Erreur HTTP: ${response.status} ${response.statusText}`); - } - - const data = await response.json(); - return { data, serverUrl: config.serverUrl }; + return { data: series, serverUrl: config.serverUrl }; } catch (error) { throw error instanceof Error ? error : new Error("Erreur lors de la récupération des séries"); } diff --git a/src/app/page.tsx b/src/app/page.tsx index 6e83b50..4516def 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,90 +1,31 @@ -"use client"; - import { HomeContent } from "@/components/home/HomeContent"; -import { useState, useEffect } from "react"; -import { useRouter } from "next/navigation"; -import { KomgaBook, KomgaSeries } from "@/types/komga"; -import { useToast } from "@/components/ui/use-toast"; +import { HomeService } from "@/lib/services/home.service"; +import { cookies } from "next/headers"; +import { komgaConfigService } from "@/lib/services/komga-config.service"; +import { redirect } from "next/navigation"; -interface HomeData { - ongoing: KomgaSeries[]; - recentlyRead: KomgaBook[]; - onDeck: KomgaBook[]; -} +export default async function HomePage() { + try { + const cookiesStore = cookies(); + komgaConfigService.validateAndGetConfig(cookiesStore); -export default function HomePage() { - const router = useRouter(); - const { toast } = useToast(); - const [data, setData] = useState(null); - const [isLoading, setIsLoading] = useState(true); - const [error, setError] = useState(null); + const data = await HomeService.getHomeData(); - useEffect(() => { - const fetchHomeData = async () => { - try { - const response = await fetch("/api/komga/home"); - if (!response.ok) { - const errorData = await response.json(); - throw new Error(errorData.error || `Erreur ${response.status}`); - } + return ; + } catch (error) { + // Si l'erreur indique une configuration manquante, rediriger vers les préférences + if (error instanceof Error && error.message.includes("Configuration Komga manquante")) { + redirect("/settings"); + } - const jsonData = await response.json(); - setData({ - ongoing: jsonData.ongoing || [], - recentlyRead: jsonData.recentlyRead || [], - onDeck: jsonData.onDeck || [], - }); - } catch (error) { - console.error("Erreur lors de la récupération des données:", error); - const errorMessage = error instanceof Error ? error.message : "Une erreur est survenue"; - setError(errorMessage); - - // Si l'erreur indique une configuration manquante, rediriger vers les préférences - if (errorMessage.includes("Configuration Komga manquante")) { - toast({ - title: "Configuration requise", - description: "Veuillez configurer votre serveur Komga pour continuer", - variant: "destructive", - }); - router.push("/settings"); - } - } finally { - setIsLoading(false); - } - }; - - fetchHomeData(); - }, [router, toast]); - - if (isLoading) { - return ( -
-
-
- {[...Array(3)].map((_, i) => ( -
-
-
- {[...Array(6)].map((_, j) => ( -
- ))} -
-
- ))} -
-
- ); - } - - if (error) { return (
-

{error}

+

+ {error instanceof Error ? error.message : "Une erreur est survenue"} +

); } - - return data ? : null; } diff --git a/src/app/series/[seriesId]/page.tsx b/src/app/series/[seriesId]/page.tsx index 3da7003..0cb54e4 100644 --- a/src/app/series/[seriesId]/page.tsx +++ b/src/app/series/[seriesId]/page.tsx @@ -1,8 +1,9 @@ import { cookies } from "next/headers"; import { PaginatedBookGrid } from "@/components/series/PaginatedBookGrid"; import { SeriesHeader } from "@/components/series/SeriesHeader"; -import { KomgaSeries, KomgaBook } from "@/types/komga"; import { komgaConfigService } from "@/lib/services/komga-config.service"; +import { SeriesService } from "@/lib/services/series.service"; +import { KomgaSeries } from "@/types/komga"; interface PageProps { params: { seriesId: string }; @@ -18,40 +19,14 @@ export default async function SeriesPage({ params, searchParams }: PageProps) { try { const cookiesStore = cookies(); const config = komgaConfigService.validateAndGetConfig(cookiesStore); - - // Paramètres de pagination - const pageIndex = currentPage - 1; // L'API Komga utilise un index base 0 + const pageIndex = currentPage - 1; // Appels API parallèles pour les détails de la série et les tomes - const [seriesResponse, booksResponse] = await Promise.all([ - // Détails de la série - fetch(komgaConfigService.buildApiUrl(`series/${params.seriesId}`, cookiesStore), { - headers: komgaConfigService.getAuthHeaders(cookiesStore), - next: { revalidate: 300 }, - }), - // Liste des tomes avec pagination et filtre - fetch( - komgaConfigService.buildApiUrl( - `series/${ - params.seriesId - }/books?page=${pageIndex}&size=${PAGE_SIZE}&sort=metadata.numberSort,asc${ - unreadOnly ? "&read_status=UNREAD&read_status=IN_PROGRESS" : "" - }`, - cookiesStore - ), - { - headers: komgaConfigService.getAuthHeaders(cookiesStore), - next: { revalidate: 300 }, - } - ), + const [series, books] = await Promise.all([ + SeriesService.getSeries(params.seriesId), + SeriesService.getSeriesBooks(params.seriesId, pageIndex, PAGE_SIZE, unreadOnly), ]); - if (!seriesResponse.ok || !booksResponse.ok) { - throw new Error("Erreur lors de la récupération des données"); - } - - const [series, books] = await Promise.all([seriesResponse.json(), booksResponse.json()]); - return (
diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 07e6d78..2c9e166 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -146,6 +146,12 @@ export default function SettingsPage() { }; komgaConfigService.setConfig(komgaConfig, true); + + fetch("/api/komga/config", { + method: "POST", + body: JSON.stringify(komgaConfig), + }); + setConfig(newConfig); // Émettre un événement pour notifier les autres composants diff --git a/src/lib/services/library.service.ts b/src/lib/services/library.service.ts index d43b409..0b1e89d 100644 --- a/src/lib/services/library.service.ts +++ b/src/lib/services/library.service.ts @@ -27,10 +27,11 @@ export class LibraryService extends BaseApiService { ): Promise> { try { const config = await this.getKomgaConfig(); - const url = this.buildUrl(config, `libraries/${libraryId}/series`, { + const url = this.buildUrl(config, "series", { + library_id: libraryId, page: page.toString(), size: size.toString(), - ...(unreadOnly && { read_status: "UNREAD" }), + ...(unreadOnly && { read_status: "UNREAD,IN_PROGRESS" }), }); const headers = this.getAuthHeaders(config); diff --git a/src/lib/services/series.service.ts b/src/lib/services/series.service.ts index d3b7872..b6cae90 100644 --- a/src/lib/services/series.service.ts +++ b/src/lib/services/series.service.ts @@ -1,18 +1,17 @@ import { BaseApiService } from "./base-api.service"; -import { Series } from "@/types/series"; import { LibraryResponse } from "@/types/library"; -import { KomgaBook } from "@/types/komga"; +import { KomgaBook, KomgaSeries } from "@/types/komga"; export class SeriesService extends BaseApiService { - static async getSeries(seriesId: string): Promise { + static async getSeries(seriesId: string): Promise { try { const config = await this.getKomgaConfig(); const url = this.buildUrl(config, `series/${seriesId}`); const headers = this.getAuthHeaders(config); - return this.fetchWithCache( + return this.fetchWithCache( `series-${seriesId}`, - async () => this.fetchFromApi(url, headers), + async () => this.fetchFromApi(url, headers), "SERIES" ); } catch (error) {