diff --git a/docs/server-actions-plan.md b/docs/server-actions-plan.md index 6f7cad2..32e9884 100644 --- a/docs/server-actions-plan.md +++ b/docs/server-actions-plan.md @@ -12,6 +12,7 @@ | `DELETE /api/komga/favorites` | `removeFromFavorites()` | ✅ Done | | `PUT /api/preferences` | `updatePreferences()` | ✅ Done | | `POST /api/komga/libraries/[libraryId]/scan` | `scanLibrary()` | ✅ Done | +| `POST /api/komga/config` | `saveKomgaConfig()` | ✅ Done | --- diff --git a/src/app/actions/config.ts b/src/app/actions/config.ts new file mode 100644 index 0000000..65111d4 --- /dev/null +++ b/src/app/actions/config.ts @@ -0,0 +1,45 @@ +"use server"; + +import { revalidatePath } from "next/cache"; +import { ConfigDBService } from "@/lib/services/config-db.service"; +import { ERROR_CODES } from "@/constants/errorCodes"; +import { AppError } from "@/utils/errors"; +import type { KomgaConfig, KomgaConfigData } from "@/types/komga"; + +interface SaveConfigInput { + url: string; + username: string; + password?: string; + authHeader?: string; +} + +/** + * Sauvegarde la configuration Komga + */ +export async function saveKomgaConfig( + config: SaveConfigInput +): Promise<{ success: boolean; message: string; data?: KomgaConfig }> { + try { + const configData: KomgaConfigData = { + url: config.url, + username: config.username, + password: config.password, + authHeader: config.authHeader || "", + }; + const mongoConfig = await ConfigDBService.saveConfig(configData); + + // Invalider le cache + revalidatePath("/settings"); + + return { + success: true, + message: "Configuration sauvegardée", + data: mongoConfig, + }; + } catch (error) { + if (error instanceof AppError) { + return { success: false, message: error.message }; + } + return { success: false, message: "Erreur lors de la sauvegarde" }; + } +} diff --git a/src/app/api/komga/config/route.ts b/src/app/api/komga/config/route.ts index ffcf62c..7b371fc 100644 --- a/src/app/api/komga/config/route.ts +++ b/src/app/api/komga/config/route.ts @@ -1,49 +1,13 @@ import { NextResponse } from "next/server"; import { ConfigDBService } from "@/lib/services/config-db.service"; import { ERROR_CODES } from "@/constants/errorCodes"; -import type { KomgaConfig, KomgaConfigData } from "@/types/komga"; +import type { KomgaConfig } from "@/types/komga"; import { getErrorMessage } from "@/utils/errors"; -import type { NextRequest } from "next/server"; import logger from "@/lib/logger"; export const dynamic = "force-dynamic"; -export async function POST(request: NextRequest) { - try { - const data: KomgaConfigData = await request.json(); - const mongoConfig: KomgaConfig = await ConfigDBService.saveConfig(data); - - return NextResponse.json( - { message: "⚙️ Configuration sauvegardée avec succès", mongoConfig }, - { status: 200 } - ); - } catch (error) { - logger.error({ err: error }, "Erreur lors de la sauvegarde de la configuration:"); - if (error instanceof Error && error.message === "Utilisateur non authentifié") { - return NextResponse.json( - { - error: { - code: ERROR_CODES.MIDDLEWARE.UNAUTHORIZED, - name: "Unauthorized", - message: getErrorMessage(ERROR_CODES.MIDDLEWARE.UNAUTHORIZED), - }, - }, - { status: 401 } - ); - } - return NextResponse.json( - { - error: { - code: ERROR_CODES.CONFIG.SAVE_ERROR, - name: "Config save error", - message: getErrorMessage(ERROR_CODES.CONFIG.SAVE_ERROR), - }, - }, - { status: 500 } - ); - } -} - +// GET reste utilisé pour récupérer la config export async function GET() { try { const mongoConfig: KomgaConfig | null = await ConfigDBService.getConfig(); diff --git a/src/components/settings/KomgaSettings.tsx b/src/components/settings/KomgaSettings.tsx index 07ddbf8..9c1437b 100644 --- a/src/components/settings/KomgaSettings.tsx +++ b/src/components/settings/KomgaSettings.tsx @@ -7,6 +7,7 @@ import { Network, Loader2 } from "lucide-react"; import type { KomgaConfig } from "@/types/komga"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import logger from "@/lib/logger"; +import { saveKomgaConfig } from "@/app/actions/config"; interface KomgaSettingsProps { initialConfig: KomgaConfig | null; @@ -90,31 +91,22 @@ export function KomgaSettings({ initialConfig }: KomgaSettingsProps) { }; try { - const response = await fetch("/api/komga/config", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - url: newConfig.serverUrl, - username: newConfig.username, - password: newConfig.password, - }), + const result = await saveKomgaConfig({ + url: newConfig.serverUrl, + username: newConfig.username, + password: newConfig.password, }); - if (!response.ok) { - const data = await response.json(); - throw new Error(data.error || t("settings.komga.error.message")); + if (!result.success) { + throw new Error(result.message); } - const savedConfig = await response.json(); - setConfig(newConfig); setLocalInitialConfig({ url: newConfig.serverUrl, username: newConfig.username, - userId: savedConfig.userId, - authHeader: savedConfig.authHeader, + userId: result.data?.userId || 0, + authHeader: result.data?.authHeader || "", }); setIsEditingConfig(false);