import { NextRequest, NextResponse } from "next/server"; import { getDatabase } from "@/lib/db/mongodb"; import bcrypt from "bcryptjs"; import { ObjectId } from "mongodb"; export async function POST(request: NextRequest) { try { const { name, email, password, role = "USER" } = await request.json(); // Validation des données if (!name || !email || !password) { return NextResponse.json( { error: "Nom, email et mot de passe sont requis" }, { status: 400 } ); } // Validation de l'email const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { return NextResponse.json( { error: "Format d'email invalide" }, { status: 400 } ); } // Validation du mot de passe (minimum 8 caractères) if (password.length < 8) { return NextResponse.json( { error: "Le mot de passe doit contenir au moins 8 caractères" }, { status: 400 } ); } // Validation du rôle if (!["USER", "ADMIN"].includes(role)) { return NextResponse.json( { error: "Rôle invalide. Doit être USER ou ADMIN" }, { status: 400 } ); } const db = await getDatabase(); // Vérifier si l'utilisateur existe déjà const existingUser = await db.collection("users").findOne({ email }); if (existingUser) { return NextResponse.json( { error: "Un utilisateur avec cet email existe déjà" }, { status: 409 } ); } // Hasher le mot de passe const saltRounds = 12; const hashedPassword = await bcrypt.hash(password, saltRounds); // Créer le nouvel utilisateur const newUser = { name, username: email.split("@")[0], // Utiliser la partie avant @ comme username email, emailVerified: false, password: hashedPassword, avatar: null, provider: "local", role, plugins: [], twoFactorEnabled: false, termsAccepted: true, personalization: { memories: false, _id: new ObjectId(), }, backupCodes: [], refreshToken: [], createdAt: new Date(), updatedAt: new Date(), __v: 0, }; // Insérer l'utilisateur dans la base de données const result = await db.collection("users").insertOne(newUser); if (!result.insertedId) { return NextResponse.json( { error: "Erreur lors de la création de l'utilisateur" }, { status: 500 } ); } // Créer une balance initiale pour l'utilisateur const initialBalance = { user: result.insertedId, tokenCredits: 3000000, // 3 millions de tokens par défaut autoRefillEnabled: false, lastRefill: new Date(), refillAmount: 0, refillIntervalUnit: "month", refillIntervalValue: 1, __v: 0, }; await db.collection("balances").insertOne(initialBalance); console.log(`✅ Nouvel utilisateur créé: ${email} (${role})`); return NextResponse.json({ success: true, message: `Utilisateur ${name} créé avec succès`, user: { id: result.insertedId, name, email, role, createdAt: newUser.createdAt, }, }); } catch (error) { console.error("Erreur lors de la création de l'utilisateur:", error); return NextResponse.json( { error: "Erreur serveur lors de la création de l'utilisateur" }, { status: 500 } ); } }