fix: Correction du problème des fichiers non traités après vidage du cache

- Modification de listFolderResults pour inclure les fichiers en uploads
- Création de résultats minimaux pour les fichiers non traités
- Fonction getMimeTypeFromExtension pour détecter le type MIME
- Les fichiers non traités apparaissent maintenant avec status 'Non traité'
- Résolution du problème où les documents ne remontaient pas après vidage

Fixes: Fichiers dans uploads non visibles après vidage du cache
Fixes: listFolderResults ne regardait que le cache, pas les uploads
This commit is contained in:
Nicolas Cantu 2025-09-16 06:04:53 +02:00
parent e0a3f06f97
commit 736637c5cd

View File

@ -205,19 +205,35 @@ function getJsonCacheFromFolder(folderHash, fileHash) {
return null return null
} }
// Fonction pour obtenir le type MIME à partir de l'extension
function getMimeTypeFromExtension(extension) {
const mimeTypes = {
'.pdf': 'application/pdf',
'.jpg': 'image/jpeg',
'.jpeg': 'image/jpeg',
'.png': 'image/png',
'.gif': 'image/gif',
'.bmp': 'image/bmp',
'.tiff': 'image/tiff',
'.webp': 'image/webp'
}
return mimeTypes[extension.toLowerCase()] || 'application/octet-stream'
}
// Fonction pour lister tous les résultats d'un dossier // Fonction pour lister tous les résultats d'un dossier
function listFolderResults(folderHash) { function listFolderResults(folderHash) {
const cachePath = path.join('cache', folderHash) const cachePath = path.join('cache', folderHash)
if (!fs.existsSync(cachePath)) { const uploadsPath = path.join('uploads', folderHash)
return { results: [], pending: [], hasPending: false }
}
const files = fs.readdirSync(cachePath)
const results = [] const results = []
const pending = [] const pending = []
let hasPending = false let hasPending = false
for (const file of files) { // Traiter les fichiers en cache (avec résultats d'extraction)
if (fs.existsSync(cachePath)) {
const cacheFiles = fs.readdirSync(cachePath)
for (const file of cacheFiles) {
if (file.endsWith('.json')) { if (file.endsWith('.json')) {
const fileHash = path.basename(file, '.json') const fileHash = path.basename(file, '.json')
const result = getJsonCacheFromFolder(folderHash, fileHash) const result = getJsonCacheFromFolder(folderHash, fileHash)
@ -239,6 +255,96 @@ function listFolderResults(folderHash) {
} }
} }
} }
}
// Traiter les fichiers en uploads (sans résultats d'extraction)
if (fs.existsSync(uploadsPath)) {
const uploadFiles = fs.readdirSync(uploadsPath)
for (const file of uploadFiles) {
// Extraire le hash du nom de fichier (format: hash.extension)
const fileHash = path.basename(file, path.extname(file))
// Vérifier si ce fichier n'a pas déjà un résultat en cache
const hasCacheResult = results.some(result => result.fileHash === fileHash)
if (!hasCacheResult) {
// Créer un résultat minimal pour les fichiers non traités
const filePath = path.join(uploadsPath, file)
const stats = fs.statSync(filePath)
results.push({
fileHash,
document: {
id: `doc-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
fileName: file,
mimeType: getMimeTypeFromExtension(path.extname(file)),
fileSize: stats.size,
uploadTimestamp: stats.mtime.toISOString()
},
classification: {
documentType: 'Document',
confidence: 0.0,
subType: 'Non traité',
language: 'fr',
pageCount: 1
},
extraction: {
text: {
raw: '',
processed: '',
wordCount: 0,
characterCount: 0,
confidence: 0.0
},
entities: {
persons: [],
companies: [],
addresses: [],
financial: {
amounts: [],
totals: {},
payment: {}
},
dates: [],
contractual: {
clauses: [],
signatures: []
},
references: []
}
},
metadata: {
processing: {
engine: '4NK_IA_Backend',
version: '1.0.0',
processingTime: '0ms',
ocrEngine: 'none',
nerEngine: 'none',
preprocessing: {
applied: false,
reason: 'Fichier non traité'
}
},
quality: {
globalConfidence: 0.0,
textExtractionConfidence: 0.0,
entityExtractionConfidence: 0.0,
classificationConfidence: 0.0
}
},
status: {
success: false,
errors: ['Fichier non traité'],
warnings: ['Aucune extraction effectuée'],
timestamp: stats.mtime.toISOString()
}
})
console.log(`[FOLDER] Fichier non traité ajouté: ${file}`)
}
}
}
return { results, pending, hasPending } return { results, pending, hasPending }
} }