This commit is contained in:
nBiqoz
2025-06-24 00:30:05 +02:00
parent bdbc126b11
commit 65fa45d8f3
2 changed files with 74 additions and 206 deletions

View File

@@ -8,37 +8,29 @@ export async function POST(req: NextRequest) {
try {
const formData = await req.formData();
const file = formData.get("file") as File | null;
console.log("📁 Fichier reçu:", file?.name, file?.type);
if (!file) {
console.log("❌ Aucun fichier reçu");
return NextResponse.json(
{ error: "Aucun fichier reçu." },
{ status: 400 }
);
}
console.log("📁 Fichier reçu:", file.name, "| Type:", file.type);
let fileContent = "";
const fileType = file.type;
console.log("🔍 Type de fichier:", fileType);
// --- LOGIQUE D'EXTRACTION DE TEXTE (INCHANGÉE) ---
if (fileType === "application/pdf") {
console.log("📄 Traitement PDF en cours...");
try {
const buffer = Buffer.from(await file.arrayBuffer());
console.log("📊 Taille du buffer:", buffer.length);
const data = await pdf(buffer);
fileContent = data.text;
console.log(
"✅ Extraction PDF réussie, longueur du texte:",
fileContent.length
);
console.log("✅ Extraction PDF réussie, longueur:", fileContent.length);
} catch (pdfError) {
console.error("❌ Erreur PDF:", pdfError);
return NextResponse.json(
{
error: `Erreur lors du traitement du PDF: ${
error: `Erreur traitement PDF: ${
pdfError instanceof Error ? pdfError.message : "Erreur inconnue"
}`,
},
@@ -55,14 +47,13 @@ export async function POST(req: NextRequest) {
const result = await mammoth.extractRawText({ arrayBuffer });
fileContent = result.value;
console.log(
"✅ Extraction Word réussie, longueur du texte:",
"✅ Extraction Word réussie, longueur:",
fileContent.length
);
} catch (wordError) {
console.error("❌ Erreur Word:", wordError);
return NextResponse.json(
{
error: `Erreur lors du traitement du document Word: ${
error: `Erreur traitement Word: ${
wordError instanceof Error ? wordError.message : "Erreur inconnue"
}`,
},
@@ -78,10 +69,9 @@ export async function POST(req: NextRequest) {
fileContent.length
);
} catch (textError) {
console.error("❌ Erreur texte:", textError);
return NextResponse.json(
{
error: `Erreur lors de la lecture du fichier texte: ${
error: `Erreur lecture texte: ${
textError instanceof Error ? textError.message : "Erreur inconnue"
}`,
},
@@ -90,7 +80,6 @@ export async function POST(req: NextRequest) {
}
}
// Vérification du contenu extrait
if (!fileContent || fileContent.trim().length === 0) {
console.log("⚠️ Contenu vide détecté");
return NextResponse.json(
@@ -99,83 +88,20 @@ export async function POST(req: NextRequest) {
);
}
console.log("🔍 Contenu extrait, longueur:", fileContent.length);
// =========================================================================
// CONFIGURATION PRESIDIO ANALYZER (SIMPLIFIÉE)
// =========================================================================
// Toute la configuration (recognizers, allow_list, etc.) est maintenant dans le default.yaml du service.
// L'API a juste besoin d'envoyer le texte et la langue.
const analyzerConfig = {
text: fileContent,
language: "fr",
ad_hoc_recognizers: [
{
name: "BelgianNRNRecognizer",
supported_entity: "BE_NATIONAL_REGISTER_NUMBER",
supported_language: "fr",
patterns: [
{
name: "NRN_Pattern",
regex:
"\\b(?:[0-9]{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12][0-9]|3[01]))-?\\d{3}\\.?\\d{2}\\b",
score: 1.0,
},
],
context: ["registre national", "nrn", "niss"],
},
{
name: "BelgianEnterpriseRecognizer",
supported_entity: "BE_ENTERPRISE_NUMBER",
supported_language: "fr",
patterns: [
{
name: "BTW_Pattern",
regex: "\\bBE\\s?0\\d{3}\\.\\d{3}\\.\\d{3}\\b",
score: 0.95,
},
],
context: ["entreprise", "btw", "tva"],
},
{
name: "IBANRecognizer",
supported_entity: "IBAN",
supported_language: "fr",
patterns: [
{
name: "IBAN_Pattern",
regex: "\\b[A-Z]{2}\\d{2}\\s?(?:\\d{4}\\s?){4,7}\\d{1,4}\\b",
score: 0.95,
},
],
context: ["iban", "compte", "bancaire"],
},
{
name: "PhoneRecognizer",
supported_entity: "PHONE_NUMBER",
supported_language: "fr",
patterns: [
{
name: "Phone_Pattern",
regex:
"\\b(?:(?:\\+|00)(?:32|33|352)|0)\\s?[1-9](?:[\\s.-]?\\d{2}){3,4}\\b",
score: 0.8,
},
],
context: ["téléphone", "tel", "mobile", "gsm"],
},
{
name: "EmailRecognizer",
supported_entity: "EMAIL_ADDRESS",
supported_language: "fr",
patterns: [
{
name: "Email_Pattern",
regex: "\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b",
score: 1.0,
},
],
context: ["email", "courriel", "adresse électronique"],
},
],
// Plus de ad_hoc_recognizers ici !
};
console.log("🔍 Appel à Presidio Analyzer...");
// Mettez votre URL externe ici, ou utilisez le nom de service Docker si approprié
const presidioAnalyzerUrl =
"http://ocs00s000ssow8kssossocco.51.68.233.212.sslip.io/analyze";
@@ -189,29 +115,28 @@ export async function POST(req: NextRequest) {
});
console.log("📊 Statut Analyzer:", analyzeResponse.status);
if (!analyzeResponse.ok) {
const errorBody = await analyzeResponse.text();
console.error("❌ Erreur Analyzer:", errorBody);
return NextResponse.json(
{
error: `Erreur de l'analyseur Presidio (${analyzeResponse.status}): ${errorBody}`,
},
{ error: `Erreur Analyzer: ${errorBody}` },
{ status: 500 }
);
}
let analyzerResults;
try {
analyzerResults = await analyzeResponse.json();
console.log("✅ Analyzer réussi, résultats:", analyzerResults.length);
} catch (jsonError) {
console.error("❌ Erreur parsing JSON Analyzer:", jsonError);
return NextResponse.json(
{ error: "Erreur lors du parsing de la réponse de l'analyseur" },
{ status: 500 }
);
}
const analyzerResults = await analyzeResponse.json();
console.log("✅ Analyzer a trouvé", analyzerResults.length, "entités.");
// =========================================================================
// CONFIGURATION PRESIDIO ANONYMIZER
// =========================================================================
// L'Anonymizer lira la config d'anonymisation du default.yaml de l'Analyzer
// ou vous pouvez définir des transformations spécifiques ici si besoin.
// Pour commencer, on envoie juste les résultats de l'analyse.
const anonymizerConfig = {
text: fileContent,
analyzer_results: analyzerResults,
};
console.log("🔍 Appel à Presidio Anonymizer...");
const presidioAnonymizerUrl =
@@ -223,64 +148,34 @@ export async function POST(req: NextRequest) {
"Content-Type": "application/json",
Accept: "application/json",
},
body: JSON.stringify({
text: fileContent,
analyzer_results: analyzerResults,
}),
body: JSON.stringify(anonymizerConfig),
});
console.log("📊 Statut Anonymizer:", anonymizeResponse.status);
if (!anonymizeResponse.ok) {
const errorBody = await anonymizeResponse.text();
console.error("❌ Erreur Anonymizer:", errorBody);
return NextResponse.json(
{
error: `Erreur de l'anonymiseur Presidio (${anonymizeResponse.status}): ${errorBody}`,
},
{ error: `Erreur Anonymizer: ${errorBody}` },
{ status: 500 }
);
}
let anonymizerResult;
try {
anonymizerResult = await anonymizeResponse.json();
console.log("✅ Anonymizer réussi");
} catch (jsonError) {
console.error("❌ Erreur parsing JSON Anonymizer:", jsonError);
return NextResponse.json(
{ error: "Erreur lors du parsing de la réponse de l'anonymiseur" },
{ status: 500 }
);
}
const anonymizerResult = await anonymizeResponse.json();
console.log("✅ Anonymisation réussie.");
const result = {
anonymizedText: anonymizerResult.text,
piiCount: analyzerResults.length,
};
console.log("✅ Traitement terminé avec succès");
return NextResponse.json(result, {
status: 200,
headers: {
"Content-Type": "application/json",
},
});
return NextResponse.json(result, { status: 200 });
} catch (err: unknown) {
console.error("❌ Erreur générale:", err);
const errorMessage =
err instanceof Error
? err.message
: "Une erreur inconnue est survenue sur le serveur.";
return NextResponse.json(
{ error: errorMessage },
{
status: 500,
headers: {
"Content-Type": "application/json",
},
}
error: err instanceof Error ? err.message : "Erreur serveur inconnue.",
},
{ status: 500 }
);
}
}