import { NextRequest, NextResponse } from "next/server"; import { revalidatePath } from "next/cache"; import { transactionService } from "@/services/transaction.service"; import { bankingService } from "@/services/banking.service"; import { requireAuth } from "@/lib/auth-utils"; import type { Transaction } from "@/lib/types"; export async function GET(request: NextRequest) { const authError = await requireAuth(); if (authError) return authError; try { const { searchParams } = new URL(request.url); // Parse pagination params const limit = parseInt(searchParams.get("limit") || "50", 10); const offset = parseInt(searchParams.get("offset") || "0", 10); // Parse filter params const startDate = searchParams.get("startDate") || undefined; const endDate = searchParams.get("endDate") || undefined; const accountIds = searchParams.get("accountIds") ? searchParams.get("accountIds")!.split(",") : undefined; const categoryIds = searchParams.get("categoryIds") ? searchParams.get("categoryIds")!.split(",") : undefined; const includeUncategorized = searchParams.get("includeUncategorized") === "true"; const search = searchParams.get("search") || undefined; const isReconciledParam = searchParams.get("isReconciled"); const isReconciled: boolean | "all" = isReconciledParam === "true" ? true : isReconciledParam === "false" ? false : "all"; const sortField = (searchParams.get("sortField") as "date" | "amount" | "description") || "date"; const sortOrder = (searchParams.get("sortOrder") as "asc" | "desc") || "desc"; const params = { limit, offset, startDate, endDate, accountIds, categoryIds, includeUncategorized, search, isReconciled, sortField, sortOrder, }; // Pas de cache serveur pour garantir des données toujours à jour // Le cache client React Query gère déjà la mise en cache côté client const result = await bankingService.getTransactionsPaginated(params); return NextResponse.json(result); } catch (error) { console.error("Error fetching transactions:", error); return NextResponse.json( { error: "Failed to fetch transactions" }, { status: 500 }, ); } } export async function POST(request: Request) { const authError = await requireAuth(); if (authError) return authError; try { const transactions: Transaction[] = await request.json(); const result = await transactionService.createMany(transactions); // Revalider le cache des pages revalidatePath("/transactions", "page"); revalidatePath("/statistics", "page"); revalidatePath("/dashboard", "page"); return NextResponse.json(result, { headers: { "Cache-Control": "no-store", }, }); } catch (error) { console.error("Error creating transactions:", error); return NextResponse.json( { error: "Failed to create transactions" }, { status: 500 }, ); } } export async function PUT(request: Request) { const authError = await requireAuth(); if (authError) return authError; try { const transaction: Transaction = await request.json(); const updated = await transactionService.update( transaction.id, transaction, ); // Revalider le cache des pages revalidatePath("/transactions", "page"); revalidatePath("/statistics", "page"); revalidatePath("/dashboard", "page"); return NextResponse.json(updated, { headers: { "Cache-Control": "no-store", }, }); } catch (error) { console.error("Error updating transaction:", error); return NextResponse.json( { error: "Failed to update transaction" }, { status: 500 }, ); } } export async function DELETE(request: Request) { const authError = await requireAuth(); if (authError) return authError; try { const { searchParams } = new URL(request.url); const id = searchParams.get("id"); if (!id) { return NextResponse.json( { error: "Transaction ID is required" }, { status: 400 }, ); } await transactionService.delete(id); // Revalider le cache des pages revalidatePath("/transactions", "page"); revalidatePath("/statistics", "page"); revalidatePath("/dashboard", "page"); return NextResponse.json( { success: true }, { headers: { "Cache-Control": "no-store", }, }, ); } catch (error) { console.error("Error deleting transaction:", error); const errorMessage = error instanceof Error ? error.message : "Failed to delete transaction"; return NextResponse.json({ error: errorMessage }, { status: 500 }); } }