import { Prisma } from "@prisma/client"; import { NextResponse } from "next/server"; import { ZodError } from "zod"; export class AppError extends Error { status: number; details?: unknown; constructor(message: string, status = 400, details?: unknown) { super(message); this.name = "AppError"; this.status = status; this.details = details; } } export function isPrismaUniqueConstraintError( error: unknown, field?: string, ): boolean { if (!(error instanceof Prisma.PrismaClientKnownRequestError)) { return false; } if (error.code !== "P2002") { return false; } if (!field) { return true; } const target = error.meta?.target; return Array.isArray(target) ? target.includes(field) : false; } export function createRouteErrorResponse( error: unknown, fallbackMessage = "حصل خطأ، حاول تاني بعد شوية.", ) { if (error instanceof ZodError) { return NextResponse.json( { message: "البيانات اللي دخلتها محتاجة مراجعة.", errors: error.flatten(), }, { status: 400 }, ); } if (error instanceof AppError) { return NextResponse.json( { message: error.message, details: error.details, }, { status: error.status }, ); } console.error(error); return NextResponse.json({ message: fallbackMessage }, { status: 500 }); }