- Ajout d'un système de recherche avec bouton "Rechercher" - Support de la validation par touche Entrée - Recherche côté serveur avec filtres MongoDB sur nom et email - Réinitialisation automatique de la page lors d'une nouvelle recherche - Suppression du debounce automatique pour un contrôle utilisateur total 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
109 lines
2.7 KiB
TypeScript
109 lines
2.7 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { getDatabase } from "@/lib/db/mongodb";
|
|
import { ObjectId } from "mongodb";
|
|
|
|
const ALLOWED_COLLECTIONS = [
|
|
"accessroles",
|
|
"aclentries",
|
|
"actions",
|
|
"agentcategories",
|
|
"agents",
|
|
"assistants",
|
|
"balances",
|
|
"banners",
|
|
"conversations",
|
|
"conversationtags",
|
|
"files",
|
|
"groups",
|
|
"keys",
|
|
"memoryentries",
|
|
"messages",
|
|
"pluginauths",
|
|
"presets",
|
|
"projects",
|
|
"promptgroups",
|
|
"prompts",
|
|
"roles",
|
|
"sessions",
|
|
"sharedlinks",
|
|
"tokens",
|
|
"toolcalls",
|
|
"transactions",
|
|
"users",
|
|
];
|
|
|
|
export async function GET(
|
|
request: NextRequest,
|
|
{ params }: { params: Promise<{ collection: string }> }
|
|
) {
|
|
const { collection } = await params;
|
|
|
|
try {
|
|
if (!ALLOWED_COLLECTIONS.includes(collection)) {
|
|
return NextResponse.json(
|
|
{ error: "Collection non autorisée" },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
const { searchParams } = new URL(request.url);
|
|
const page = parseInt(searchParams.get("page") || "1");
|
|
const limit = parseInt(searchParams.get("limit") || "20");
|
|
const filter = JSON.parse(searchParams.get("filter") || "{}");
|
|
|
|
// Gestion spéciale pour la collection users avec recherche par email ou id
|
|
if (collection === "users") {
|
|
const email = searchParams.get("email");
|
|
const id = searchParams.get("id");
|
|
const search = searchParams.get("search"); // ✅ AJOUTER cette ligne
|
|
|
|
if (email) {
|
|
filter.email = email.toLowerCase();
|
|
} else if (id) {
|
|
// Vérifier si l'ID est un ObjectId valide
|
|
if (ObjectId.isValid(id)) {
|
|
filter._id = new ObjectId(id);
|
|
} else {
|
|
// Si l'ID n'est pas valide, retourner une erreur
|
|
return NextResponse.json(
|
|
{ error: "ID utilisateur invalide" },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
} else if (search) {
|
|
// ✅ AJOUTER ce bloc
|
|
// Recherche partielle sur nom et email
|
|
filter.$or = [
|
|
{ name: { $regex: search, $options: "i" } },
|
|
{ email: { $regex: search, $options: "i" } },
|
|
];
|
|
}
|
|
}
|
|
|
|
const db = await getDatabase();
|
|
const skip = (page - 1) * limit;
|
|
|
|
const [data, total] = await Promise.all([
|
|
db
|
|
.collection(collection)
|
|
.find(filter)
|
|
.skip(skip)
|
|
.limit(limit)
|
|
.sort({ createdAt: -1 })
|
|
.toArray(),
|
|
db.collection(collection).countDocuments(filter),
|
|
]);
|
|
|
|
return NextResponse.json({
|
|
data,
|
|
total,
|
|
page,
|
|
limit,
|
|
totalPages: Math.ceil(total / limit),
|
|
});
|
|
} catch (error) {
|
|
console.error(`Erreur lors de la récupération de ${collection}:`, error);
|
|
return NextResponse.json({ error: "Erreur serveur" }, { status: 500 });
|
|
}
|
|
}
|