Repository Public
1// Auteur : Simon-Pierre Boucher — contact@spboucher.ai2// /api/admin/password — changement de SON propre mot de passe (tout admin).3// Exige le mot de passe actuel ; invalide toutes les autres sessions puis4// réémet un cookie frais pour celle-ci.5import { NextRequest, NextResponse } from "next/server";6import { cookies } from "next/headers";7import {8 findAdminById,9 setAdminPassword,10 verifyAdminPassword,11} from "@/lib/comms/db";12import {13 getAdminSession,14 mintAdminToken,15 adminCookieOptions,16 ADMIN_COOKIE,17} from "@/lib/comms/admin-auth";1819export async function POST(req: NextRequest) {20 const session = await getAdminSession();21 if (!session)22 return NextResponse.json({ error: "Non autorisé." }, { status: 401 });23 const body = (await req.json().catch(() => null)) as {24 current?: string;25 next?: string;26 } | null;27 const current = body?.current ?? "";28 const next = body?.next ?? "";29 const row = findAdminById(session.id);30 if (!row || !verifyAdminPassword(current, row.password_hash))31 return NextResponse.json({ error: "Mot de passe actuel invalide." }, { status: 403 });32 if (next.length < 8)33 return NextResponse.json(34 { error: "Nouveau mot de passe trop court (8 caractères minimum)." },35 { status: 422 },36 );37 setAdminPassword(session.id, next);38 // Réémettre un jeton valide pour la session courante.39 const fresh = findAdminById(session.id)!;40 const token = await mintAdminToken(fresh);41 const jar = await cookies();42 jar.set(ADMIN_COOKIE, token, adminCookieOptions);43 return NextResponse.json({ ok: true });44}45