This commit is contained in:
nBiqoz
2025-09-12 16:54:40 +02:00
parent d7d3a3c7e9
commit 130929b756
4 changed files with 41 additions and 52 deletions

View File

@@ -175,8 +175,8 @@ export async function POST(req: NextRequest) {
// ✅ Définir l'URL AVANT de l'utiliser // ✅ Définir l'URL AVANT de l'utiliser
const presidioAnalyzerUrl = const presidioAnalyzerUrl =
// "http://analyzer.151.80.20.211.sslip.io/analyze"; "http://analyzer.151.80.20.211.sslip.io/analyze";
"http://localhost:5001/analyze"; // "http://localhost:5001/analyze";
try { try {
const analyzeResponse = await fetch(presidioAnalyzerUrl, { const analyzeResponse = await fetch(presidioAnalyzerUrl, {
method: "POST", method: "POST",
@@ -213,8 +213,8 @@ export async function POST(req: NextRequest) {
console.log("🔍 Appel à Presidio Anonymizer..."); console.log("🔍 Appel à Presidio Anonymizer...");
const presidioAnonymizerUrl = const presidioAnonymizerUrl =
// "http://analyzer.151.80.20.211.sslip.io/anonymize"; "http://analyzer.151.80.20.211.sslip.io/anonymize";
"http://localhost:5001/anonymize"; // "http://localhost:5001/anonymize";
const anonymizeResponse = await fetch(presidioAnonymizerUrl, { const anonymizeResponse = await fetch(presidioAnonymizerUrl, {
method: "POST", method: "POST",
@@ -253,36 +253,33 @@ export async function POST(req: NextRequest) {
) => { ) => {
const replacementMap: Record<string, string> = {}; const replacementMap: Record<string, string> = {};
// 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 // Trier les entités par position
const sortedResults = [...analyzerResults].sort( const sortedResults = [...analyzerResults].sort(
(a, b) => a.start - b.start (a, b) => a.start - b.start
); );
// Associer chaque entité avec son remplacement correspondant // Pour chaque entité, trouver son remplacement dans le texte anonymisé
sortedResults.forEach((result, index) => { let searchOffset = 0;
sortedResults.forEach((result) => {
const originalValue = originalText.substring( const originalValue = originalText.substring(
result.start, result.start,
result.end result.end
); );
if (index < foundReplacements.length) { // Chercher le prochain remplacement [XXX] après la position courante
// Utiliser le remplacement correspondant par ordre d'apparition const replacementPattern = /\[[^\]]+\]/g;
replacementMap[originalValue] = foundReplacements[index]; replacementPattern.lastIndex = searchOffset;
const match = replacementPattern.exec(anonymizedText);
if (match) {
replacementMap[originalValue] = match[0];
searchOffset = match.index + match[0].length;
console.log( console.log(
`✅ Mapping ordonné: "${originalValue}" -> "${foundReplacements[index]}"` `✅ Mapping positionnel: "${originalValue}" -> "${match[0]}"`
); );
} else { } else {
// Fallback si pas assez de remplacements trouvés // Fallback
const fallbackValue = `[${result.entity_type.toUpperCase()}]`; const fallbackValue = `[${result.entity_type.toUpperCase()}]`;
replacementMap[originalValue] = fallbackValue; replacementMap[originalValue] = fallbackValue;
console.log( console.log(

View File

@@ -48,11 +48,8 @@ export const AnonymizationInterface = ({
anonymizedTypes.add("Adresses"); anonymizedTypes.add("Adresses");
} }
// FLEXIBLE_DATE ou DATE_TIME -> Dates // DATE -> Dates
if ( if (outputText.includes("<DATE>") || outputText.includes("<DATE>")) {
outputText.includes("<FLEXIBLE_DATE>") ||
outputText.includes("<DATE_TIME>")
) {
anonymizedTypes.add("Dates"); anonymizedTypes.add("Dates");
} }

View File

@@ -80,7 +80,7 @@ export const useAnonymization = ({
presidioResults: presidioResults, presidioResults: presidioResults,
replacementValues: replacementValues, replacementValues: replacementValues,
replacementValuesKeys: Object.keys(replacementValues), replacementValuesKeys: Object.keys(replacementValues),
replacementValuesEntries: Object.entries(replacementValues) replacementValuesEntries: Object.entries(replacementValues),
}); });
// ÉTAPE 2 : Passer le texte ORIGINAL à l'état de sortie. // ÉTAPE 2 : Passer le texte ORIGINAL à l'état de sortie.
@@ -102,7 +102,7 @@ export const useAnonymization = ({
entity_type, entity_type,
detectedText, detectedText,
replacementFromMap: replacementValues[detectedText], replacementFromMap: replacementValues[detectedText],
fallback: `[${entity_type}]` fallback: `[${entity_type}]`,
}); });
mappings.push({ mappings.push({
@@ -110,8 +110,8 @@ export const useAnonymization = ({
start: start, start: start,
end: end, end: end,
text: detectedText, text: detectedText,
replacementValue: replacementValues[detectedText] || `[${entity_type}]`, replacementValue: replacementValues[detectedText],
displayName: replacementValues[detectedText], // CORRECTION: Supprimer le fallback displayName: replacementValues[detectedText],
customColor: undefined, customColor: undefined,
}); });
} }

View File

@@ -46,27 +46,22 @@ export const useTextParsing = (
}); });
} }
// Utiliser displayName au lieu de entity_type // Utiliser displayName directement SANS fallback
// Ligne 45 - Ajouter du debug const anonymizedText = mapping.displayName;
console.log("useTextParsing - mapping:", {
text: mapping.text,
displayName: mapping.displayName,
entity_type: mapping.entity_type,
});
const anonymizedText = // Ne créer le segment que si displayName existe
mapping.displayName || `[${mapping.entity_type.toUpperCase()}]`; if (anonymizedText) {
segments.push({
segments.push({ text: mapping.text,
text: mapping.text, displayText: anonymizedText,
displayText: anonymizedText, start: mapping.start,
start: mapping.start, end: mapping.end,
end: mapping.end, isEntity: true,
isEntity: true, entityType: mapping.entity_type,
entityType: mapping.entity_type, entityIndex: mappingIndex,
entityIndex: mappingIndex, mapping: mapping,
mapping: mapping, });
}); }
currentIndex = mapping.end; // CORRECTION: utiliser 'end' currentIndex = mapping.end; // CORRECTION: utiliser 'end'
}); });