Files
stripstream/docs/server-actions-plan.md
Julien Froidefond eec51b7ef8 refactor: convert Komga test connection to Server Action
- Add testKomgaConnection to config.ts
- Update KomgaSettings to use Server Action
- Remove api/komga/test route
2026-02-28 11:09:48 +01:00

4.0 KiB

Plan de conversion API Routes → Server Actions

État des lieux

Converti

Ancienne Route Server Action Status
PATCH /api/komga/books/[bookId]/read-progress updateReadProgress() Done
DELETE /api/komga/books/[bookId]/read-progress deleteReadProgress() Done
POST /api/komga/favorites addToFavorites() Done
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
POST /api/komga/test testKomgaConnection() Done
PUT /api/user/password changePassword() Done
POST /api/auth/register registerUser() Done
PATCH /api/admin/users/[userId] updateUserRoles() Done
DELETE /api/admin/users/[userId] deleteUser() Done
PUT /api/admin/users/[userId]/password resetUserPassword() Done

À convertir (priorité haute)

1. Scan de bibliothèque

Route actuelle : api/komga/libraries/[libraryId]/scan/route.ts

// Action à créer : src/app/actions/library.ts
export async function scanLibrary(libraryId: string)

Appelants à migrer :

  • components/library/ScanButton.tsx (POST fetch)

À convertir (priorité moyenne)

2. Configuration Komga

Route actuelle : api/komga/config/route.ts

// Action à créer : src/app/actions/config.ts
export async function saveKomgaConfig(config: KomgaConfigData)
export async function getKomgaConfig()

3. Mot de passe utilisateur

Route actuelle : api/user/password/route.ts

// Action à créer : src/app/actions/password.ts
export async function changePassword(currentPassword: string, newPassword: string)

4. Inscription

Route actuelle : api/auth/register/route.ts

// Action à créer : src/app/actions/auth.ts
export async function registerUser(email: string, password: string)

À convertir (priorité basse - admin)

5. Gestion des utilisateurs (admin)

Routes :

  • api/admin/users/[userId]/route.ts (PATCH, DELETE)
  • api/admin/users/[userId]/password/route.ts (PUT)
// Actions à créer : src/app/actions/admin.ts
export async function updateUserRoles(userId: string, roles: string[])
export async function deleteUser(userId: string)
export async function resetUserPassword(userId: string, newPassword: string)

À garder en API Routes

Ces routes ne doivent PAS être converties :

Route Raison
api/komga/home GET - called from Server Components
api/komga/books/[bookId] GET - fetch données livre
api/komga/series/* GET - fetch séries
api/komga/libraries/* GET - fetch bibliothèques
api/komga/random-book GET - fetch aléatoire
api/komga/images/* GET - servir images (streaming)
api/auth/[...nextauth]/* NextAuth handler externe
api/admin/users GET - fetch liste users
api/admin/stats GET - fetch stats
api/user/profile GET - fetch profile

Pattern à suivre

// src/app/actions/[feature].ts
"use server";

import { revalidatePath, revalidateTag } from "next/cache";
import { Service } from "@/lib/services/service";

export async function actionName(params): Promise<{ success: boolean; message: string }> {
  try {
    await Service.doSomething(params);
    
    // Invalider le cache si nécessaire
    revalidateTag("cache-tag", "min");
    revalidatePath("/");
    
    return { success: true, message: "Succès" };
  } catch (error) {
    return { success: false, message: error.message };
  }
}
// src/components/feature/Component.tsx
"use client";

import { actionName } from "@/app/actions/feature";

const handleAction = async () => {
  const result = await actionName(params);
  if (!result.success) {
    // handle error
  }
};