Repository Public
1// Auteur : Simon-Pierre Boucher — contact@spboucher.ai2// KA ID v2 — « Pas pour moi » (serveur-à-serveur).3// Masquer une annonce l'exclut des résultats de la plateforme ET nourrit le4// signal négatif du moteur de préférences.5// POST { client_id, ka_id, ts, sig, item_id, on: true|false, features? }6import { NextRequest, NextResponse } from "next/server";7import { findUserByKaId } from "@/lib/db";8import { verifyClientSig } from "@/lib/sso";9import { setHidden, ingestEvents } from "@/lib/kaid-data";1011export async function POST(req: NextRequest) {12 const body = (await req.json().catch(() => ({}))) as Record<string, unknown>;13 const clientId = String(body.client_id ?? "").slice(0, 30);14 const kaId = String(body.ka_id ?? "").slice(0, 20);15 if (!verifyClientSig(clientId, kaId, String(body.ts ?? ""), String(body.sig ?? "")))16 return NextResponse.json({ error: "signature invalide" }, { status: 401 });17 const user = findUserByKaId(kaId);18 if (!user)19 return NextResponse.json({ error: "membre introuvable" }, { status: 404 });2021 const itemId = String(body.item_id ?? "").trim();22 if (!itemId)23 return NextResponse.json({ error: "item_id requis" }, { status: 400 });24 const on = body.on !== false;25 setHidden(user.id, clientId, itemId, on);26 ingestEvents(user.id, clientId, [{27 type: on ? "hide" : "unhide",28 entity_id: itemId,29 features: body.features,30 }]);31 return NextResponse.json({ ok: true, hidden: on });32}33