diff --git a/app/api/process-document/route.ts b/app/api/process-document/route.ts index e4c03fd..54a392d 100644 --- a/app/api/process-document/route.ts +++ b/app/api/process-document/route.ts @@ -175,8 +175,8 @@ export async function POST(req: NextRequest) { // ✅ Définir l'URL AVANT de l'utiliser const presidioAnalyzerUrl = - // "http://analyzer.151.80.20.211.sslip.io/analyze"; - "http://localhost:5001/analyze"; + "http://analyzer.151.80.20.211.sslip.io/analyze"; + // "http://localhost:5001/analyze"; try { const analyzeResponse = await fetch(presidioAnalyzerUrl, { method: "POST", @@ -213,8 +213,8 @@ export async function POST(req: NextRequest) { console.log("🔍 Appel à Presidio Anonymizer..."); const presidioAnonymizerUrl = - // "http://analyzer.151.80.20.211.sslip.io/anonymize"; - "http://localhost:5001/anonymize"; + "http://analyzer.151.80.20.211.sslip.io/anonymize"; + // "http://localhost:5001/anonymize"; const anonymizeResponse = await fetch(presidioAnonymizerUrl, { method: "POST", @@ -253,36 +253,33 @@ export async function POST(req: NextRequest) { ) => { const replacementMap: Record = {}; - // Extraire tous les remplacements [XXX] du texte anonymisé - const replacementPattern = /\[[^\]]+\]/g; - const foundReplacements = - anonymizedText.match(replacementPattern) || []; - - console.log( - "🔍 Remplacements trouvés dans le texte anonymisé:", - foundReplacements - ); - // Trier les entités par position const sortedResults = [...analyzerResults].sort( (a, b) => a.start - b.start ); - // Associer chaque entité avec son remplacement correspondant - sortedResults.forEach((result, index) => { + // Pour chaque entité, trouver son remplacement dans le texte anonymisé + let searchOffset = 0; + + sortedResults.forEach((result) => { const originalValue = originalText.substring( result.start, result.end ); - if (index < foundReplacements.length) { - // Utiliser le remplacement correspondant par ordre d'apparition - replacementMap[originalValue] = foundReplacements[index]; + // Chercher le prochain remplacement [XXX] après la position courante + const replacementPattern = /\[[^\]]+\]/g; + replacementPattern.lastIndex = searchOffset; + const match = replacementPattern.exec(anonymizedText); + + if (match) { + replacementMap[originalValue] = match[0]; + searchOffset = match.index + match[0].length; console.log( - `✅ Mapping ordonné: "${originalValue}" -> "${foundReplacements[index]}"` + `✅ Mapping positionnel: "${originalValue}" -> "${match[0]}"` ); } else { - // Fallback si pas assez de remplacements trouvés + // Fallback const fallbackValue = `[${result.entity_type.toUpperCase()}]`; replacementMap[originalValue] = fallbackValue; console.log( diff --git a/app/components/AnonymizationInterface.tsx b/app/components/AnonymizationInterface.tsx index d288140..9d16e89 100644 --- a/app/components/AnonymizationInterface.tsx +++ b/app/components/AnonymizationInterface.tsx @@ -48,11 +48,8 @@ export const AnonymizationInterface = ({ anonymizedTypes.add("Adresses"); } - // FLEXIBLE_DATE ou DATE_TIME -> Dates - if ( - outputText.includes("") || - outputText.includes("") - ) { + // DATE -> Dates + if (outputText.includes("") || outputText.includes("")) { anonymizedTypes.add("Dates"); } diff --git a/app/components/AnonymizationLogic.tsx b/app/components/AnonymizationLogic.tsx index f6fd2f2..4c2e076 100644 --- a/app/components/AnonymizationLogic.tsx +++ b/app/components/AnonymizationLogic.tsx @@ -80,7 +80,7 @@ export const useAnonymization = ({ presidioResults: presidioResults, replacementValues: replacementValues, replacementValuesKeys: Object.keys(replacementValues), - replacementValuesEntries: Object.entries(replacementValues) + replacementValuesEntries: Object.entries(replacementValues), }); // ÉTAPE 2 : Passer le texte ORIGINAL à l'état de sortie. @@ -96,13 +96,13 @@ export const useAnonymization = ({ for (const result of sortedResults) { const { entity_type, start, end } = result; const detectedText = originalText.substring(start, end); - + // 🔍 CONSOLE.LOG POUR CHAQUE ENTITÉ console.log(`🔍 Entité détectée:`, { entity_type, detectedText, replacementFromMap: replacementValues[detectedText], - fallback: `[${entity_type}]` + fallback: `[${entity_type}]`, }); mappings.push({ @@ -110,12 +110,12 @@ export const useAnonymization = ({ start: start, end: end, text: detectedText, - replacementValue: replacementValues[detectedText] || `[${entity_type}]`, - displayName: replacementValues[detectedText], // CORRECTION: Supprimer le fallback + replacementValue: replacementValues[detectedText], + displayName: replacementValues[detectedText], customColor: undefined, }); } - + // 🔍 CONSOLE.LOG FINAL DES MAPPINGS console.log("📋 Mappings créés:", mappings); diff --git a/app/components/hooks/useTextParsing.ts b/app/components/hooks/useTextParsing.ts index fc1ba11..237ddd2 100644 --- a/app/components/hooks/useTextParsing.ts +++ b/app/components/hooks/useTextParsing.ts @@ -46,27 +46,22 @@ export const useTextParsing = ( }); } - // Utiliser displayName au lieu de entity_type - // Ligne 45 - Ajouter du debug - console.log("useTextParsing - mapping:", { - text: mapping.text, - displayName: mapping.displayName, - entity_type: mapping.entity_type, - }); + // Utiliser displayName directement SANS fallback + const anonymizedText = mapping.displayName; - const anonymizedText = - mapping.displayName || `[${mapping.entity_type.toUpperCase()}]`; - - segments.push({ - text: mapping.text, - displayText: anonymizedText, - start: mapping.start, - end: mapping.end, - isEntity: true, - entityType: mapping.entity_type, - entityIndex: mappingIndex, - mapping: mapping, - }); + // Ne créer le segment que si displayName existe + if (anonymizedText) { + segments.push({ + text: mapping.text, + displayText: anonymizedText, + start: mapping.start, + end: mapping.end, + isEntity: true, + entityType: mapping.entity_type, + entityIndex: mappingIndex, + mapping: mapping, + }); + } currentIndex = mapping.end; // CORRECTION: utiliser 'end' });