From 4ae606ea099fb5a6124d47da92f40700fbdb576d Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Mon, 17 Feb 2025 08:17:31 +0100 Subject: [PATCH] reacto: images not called directly in routes --- .../[bookId]/pages/[pageNumber]/route.ts | 14 ++----- .../images/books/[bookId]/thumbnail/route.ts | 12 ++---- .../series/[seriesId]/first-page/route.ts | 31 ++-------------- .../series/[seriesId]/thumbnail/route.ts | 14 ++----- src/lib/services/book.service.ts | 14 +++++++ src/lib/services/series.service.ts | 37 +++++++++++++++++++ 6 files changed, 63 insertions(+), 59 deletions(-) diff --git a/src/app/api/komga/images/books/[bookId]/pages/[pageNumber]/route.ts b/src/app/api/komga/images/books/[bookId]/pages/[pageNumber]/route.ts index d20f134..dacb942 100644 --- a/src/app/api/komga/images/books/[bookId]/pages/[pageNumber]/route.ts +++ b/src/app/api/komga/images/books/[bookId]/pages/[pageNumber]/route.ts @@ -1,5 +1,5 @@ import { NextRequest, NextResponse } from "next/server"; -import { ImageService } from "@/lib/services/image.service"; +import { BookService } from "@/lib/services/book.service"; export const dynamic = "force-dynamic"; @@ -8,16 +8,8 @@ export async function GET( { params }: { params: { bookId: string; pageNumber: string } } ) { try { - const { buffer, contentType } = await ImageService.getImage( - `books/${params.bookId}/pages/${params.pageNumber}` - ); - - return new NextResponse(buffer, { - headers: { - "Content-Type": contentType || "image/jpeg", - "Cache-Control": "public, max-age=31536000, immutable", - }, - }); + const response = await BookService.getPage(params.bookId, parseInt(params.pageNumber)); + return response; } catch (error) { console.error("Erreur lors de la récupération de la page du livre:", error); return new NextResponse("Erreur lors de la récupération de la page", { status: 500 }); diff --git a/src/app/api/komga/images/books/[bookId]/thumbnail/route.ts b/src/app/api/komga/images/books/[bookId]/thumbnail/route.ts index 2b07c93..0c9831e 100644 --- a/src/app/api/komga/images/books/[bookId]/thumbnail/route.ts +++ b/src/app/api/komga/images/books/[bookId]/thumbnail/route.ts @@ -1,16 +1,10 @@ import { NextRequest, NextResponse } from "next/server"; -import { ImageService } from "@/lib/services/image.service"; +import { BookService } from "@/lib/services/book.service"; export async function GET(request: NextRequest, { params }: { params: { bookId: string } }) { try { - const { buffer, contentType } = await ImageService.getImage(`books/${params.bookId}/thumbnail`); - - return new NextResponse(buffer, { - headers: { - "Content-Type": contentType || "image/jpeg", - "Cache-Control": "public, max-age=31536000, immutable", - }, - }); + const response = await BookService.getThumbnail(params.bookId); + return response; } catch (error) { console.error("Erreur lors de la récupération de la miniature du livre:", error); return new NextResponse("Erreur lors de la récupération de la miniature", { status: 500 }); diff --git a/src/app/api/komga/images/series/[seriesId]/first-page/route.ts b/src/app/api/komga/images/series/[seriesId]/first-page/route.ts index 4f961fb..5d2bf80 100644 --- a/src/app/api/komga/images/series/[seriesId]/first-page/route.ts +++ b/src/app/api/komga/images/series/[seriesId]/first-page/route.ts @@ -1,39 +1,14 @@ import { NextRequest, NextResponse } from "next/server"; -import { ImageService } from "@/lib/services/image.service"; import { SeriesService } from "@/lib/services/series.service"; export const dynamic = "force-dynamic"; export async function GET(request: NextRequest, { params }: { params: { seriesId: string } }) { try { - // Récupérer l'ID du premier livre - const firstBookId = await SeriesService.getFirstBook(params.seriesId); - - // Récupérer la première page du premier livre - const { buffer, contentType } = await ImageService.getImage(`books/${firstBookId}/pages/1`); - - return new NextResponse(buffer, { - headers: { - "Content-Type": contentType || "image/jpeg", - "Cache-Control": "public, max-age=31536000, immutable", - }, - }); + const response = await SeriesService.getFirstPage(params.seriesId); + return response; } catch (error) { console.error("Erreur lors de la récupération de la première page de la série:", error); - - // En cas d'erreur, on essaie de récupérer le thumbnail comme fallback - try { - const { buffer, contentType } = await ImageService.getImage( - `series/${params.seriesId}/thumbnail` - ); - return new NextResponse(buffer, { - headers: { - "Content-Type": contentType || "image/jpeg", - "Cache-Control": "public, max-age=31536000, immutable", - }, - }); - } catch (fallbackError) { - return new NextResponse("Erreur lors de la récupération de l'image", { status: 500 }); - } + return new NextResponse("Erreur lors de la récupération de l'image", { status: 500 }); } } diff --git a/src/app/api/komga/images/series/[seriesId]/thumbnail/route.ts b/src/app/api/komga/images/series/[seriesId]/thumbnail/route.ts index 37b7aaf..bf568cd 100644 --- a/src/app/api/komga/images/series/[seriesId]/thumbnail/route.ts +++ b/src/app/api/komga/images/series/[seriesId]/thumbnail/route.ts @@ -1,18 +1,10 @@ import { NextRequest, NextResponse } from "next/server"; -import { ImageService } from "@/lib/services/image.service"; +import { SeriesService } from "@/lib/services/series.service"; export async function GET(request: NextRequest, { params }: { params: { seriesId: string } }) { try { - const { buffer, contentType } = await ImageService.getImage( - `series/${params.seriesId}/thumbnail` - ); - - return new NextResponse(buffer, { - headers: { - "Content-Type": contentType || "image/jpeg", - "Cache-Control": "public, max-age=31536000, immutable", - }, - }); + const response = await SeriesService.getThumbnail(params.seriesId); + return response; } catch (error) { console.error("Erreur lors de la récupération de la miniature de la série:", error); return new NextResponse("Erreur lors de la récupération de la miniature", { status: 500 }); diff --git a/src/lib/services/book.service.ts b/src/lib/services/book.service.ts index 7e031b1..95e0eba 100644 --- a/src/lib/services/book.service.ts +++ b/src/lib/services/book.service.ts @@ -98,6 +98,20 @@ export class BookService extends BaseApiService { } } + static async getThumbnail(bookId: string): Promise { + try { + const response = await ImageService.getImage(`books/${bookId}/thumbnail`); + return new Response(response.buffer, { + headers: { + "Content-Type": response.contentType || "image/jpeg", + "Cache-Control": "public, max-age=31536000, immutable", + }, + }); + } catch (error) { + throw this.handleError(error, "Impossible de récupérer la miniature du livre"); + } + } + static getPageUrl(bookId: string, pageNumber: number): string { return `/api/komga/images/books/${bookId}/pages/${pageNumber}`; } diff --git a/src/lib/services/series.service.ts b/src/lib/services/series.service.ts index 47b7dcb..7412159 100644 --- a/src/lib/services/series.service.ts +++ b/src/lib/services/series.service.ts @@ -1,6 +1,8 @@ import { BaseApiService } from "./base-api.service"; import { LibraryResponse } from "@/types/library"; import { KomgaBook, KomgaSeries } from "@/types/komga"; +import { BookService } from "./book.service"; +import { ImageService } from "./image.service"; export class SeriesService extends BaseApiService { static async getSeries(seriesId: string): Promise { @@ -73,4 +75,39 @@ export class SeriesService extends BaseApiService { return this.handleError(error, "Impossible de récupérer le premier livre"); } } + + static async getFirstPage(seriesId: string): Promise { + try { + // Récupérer l'ID du premier livre + const firstBookId = await this.getFirstBook(seriesId); + return await BookService.getPage(firstBookId, 1); + } catch (error) { + // En cas d'erreur, on essaie de récupérer le thumbnail comme fallback + try { + const response = await ImageService.getImage(`series/${seriesId}/thumbnail`); + return new Response(response.buffer, { + headers: { + "Content-Type": response.contentType || "image/jpeg", + "Cache-Control": "public, max-age=31536000, immutable", + }, + }); + } catch (fallbackError) { + throw this.handleError(fallbackError, "Impossible de récupérer l'image de la série"); + } + } + } + + static async getThumbnail(seriesId: string): Promise { + try { + const response = await ImageService.getImage(`series/${seriesId}/thumbnail`); + return new Response(response.buffer, { + headers: { + "Content-Type": response.contentType || "image/jpeg", + "Cache-Control": "public, max-age=31536000, immutable", + }, + }); + } catch (error) { + throw this.handleError(error, "Impossible de récupérer la miniature de la série"); + } + } }