backend
This commit is contained in:
parent
0f271fa47a
commit
43a0ad6070
@ -49,14 +49,14 @@ function getMimeType(ext) {
|
|||||||
function createFolderStructure(folderHash) {
|
function createFolderStructure(folderHash) {
|
||||||
console.log(`[FOLDER] Création de la structure pour le hash: ${folderHash}`)
|
console.log(`[FOLDER] Création de la structure pour le hash: ${folderHash}`)
|
||||||
console.log(`[FOLDER] Répertoire de travail: ${process.cwd()}`)
|
console.log(`[FOLDER] Répertoire de travail: ${process.cwd()}`)
|
||||||
|
|
||||||
// Créer les dossiers racines s'ils n'existent pas
|
// Créer les dossiers racines s'ils n'existent pas
|
||||||
const uploadsDir = 'uploads'
|
const uploadsDir = 'uploads'
|
||||||
const cacheDir = 'cache'
|
const cacheDir = 'cache'
|
||||||
|
|
||||||
console.log(`[FOLDER] Vérification de l'existence de ${uploadsDir}: ${fs.existsSync(uploadsDir)}`)
|
console.log(`[FOLDER] Vérification de l'existence de ${uploadsDir}: ${fs.existsSync(uploadsDir)}`)
|
||||||
console.log(`[FOLDER] Vérification de l'existence de ${cacheDir}: ${fs.existsSync(cacheDir)}`)
|
console.log(`[FOLDER] Vérification de l'existence de ${cacheDir}: ${fs.existsSync(cacheDir)}`)
|
||||||
|
|
||||||
if (!fs.existsSync(uploadsDir)) {
|
if (!fs.existsSync(uploadsDir)) {
|
||||||
fs.mkdirSync(uploadsDir, { recursive: true })
|
fs.mkdirSync(uploadsDir, { recursive: true })
|
||||||
console.log(`[FOLDER] Dossier racine créé: ${uploadsDir}`)
|
console.log(`[FOLDER] Dossier racine créé: ${uploadsDir}`)
|
||||||
@ -65,13 +65,13 @@ function createFolderStructure(folderHash) {
|
|||||||
fs.mkdirSync(cacheDir, { recursive: true })
|
fs.mkdirSync(cacheDir, { recursive: true })
|
||||||
console.log(`[FOLDER] Dossier racine créé: ${cacheDir}`)
|
console.log(`[FOLDER] Dossier racine créé: ${cacheDir}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
const folderPath = path.join(uploadsDir, folderHash)
|
const folderPath = path.join(uploadsDir, folderHash)
|
||||||
const cachePath = path.join(cacheDir, folderHash)
|
const cachePath = path.join(cacheDir, folderHash)
|
||||||
|
|
||||||
console.log(`[FOLDER] Chemin du dossier uploads: ${folderPath}`)
|
console.log(`[FOLDER] Chemin du dossier uploads: ${folderPath}`)
|
||||||
console.log(`[FOLDER] Chemin du dossier cache: ${cachePath}`)
|
console.log(`[FOLDER] Chemin du dossier cache: ${cachePath}`)
|
||||||
|
|
||||||
if (!fs.existsSync(folderPath)) {
|
if (!fs.existsSync(folderPath)) {
|
||||||
fs.mkdirSync(folderPath, { recursive: true })
|
fs.mkdirSync(folderPath, { recursive: true })
|
||||||
console.log(`[FOLDER] Dossier uploads créé: ${folderPath}`)
|
console.log(`[FOLDER] Dossier uploads créé: ${folderPath}`)
|
||||||
@ -80,7 +80,7 @@ function createFolderStructure(folderHash) {
|
|||||||
fs.mkdirSync(cachePath, { recursive: true })
|
fs.mkdirSync(cachePath, { recursive: true })
|
||||||
console.log(`[FOLDER] Dossier cache créé: ${cachePath}`)
|
console.log(`[FOLDER] Dossier cache créé: ${cachePath}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
return { folderPath, cachePath }
|
return { folderPath, cachePath }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1114,12 +1114,12 @@ app.post('/api/folders', (req, res) => {
|
|||||||
console.log('[FOLDER] Début de la création d\'un nouveau dossier')
|
console.log('[FOLDER] Début de la création d\'un nouveau dossier')
|
||||||
const folderHash = generateFolderHash()
|
const folderHash = generateFolderHash()
|
||||||
console.log(`[FOLDER] Hash généré: ${folderHash}`)
|
console.log(`[FOLDER] Hash généré: ${folderHash}`)
|
||||||
|
|
||||||
const result = createFolderStructure(folderHash)
|
const result = createFolderStructure(folderHash)
|
||||||
console.log(`[FOLDER] Structure créée:`, result)
|
console.log(`[FOLDER] Structure créée:`, result)
|
||||||
|
|
||||||
console.log(`[FOLDER] Nouveau dossier créé: ${folderHash}`)
|
console.log(`[FOLDER] Nouveau dossier créé: ${folderHash}`)
|
||||||
|
|
||||||
res.json({
|
res.json({
|
||||||
success: true,
|
success: true,
|
||||||
folderHash,
|
folderHash,
|
||||||
@ -1215,14 +1215,14 @@ app.post('/api/folders/default', async (req, res) => {
|
|||||||
// Traiter le fichier et sauvegarder le résultat
|
// Traiter le fichier et sauvegarder le résultat
|
||||||
try {
|
try {
|
||||||
console.log(`[FOLDER] Traitement de ${testFile}...`)
|
console.log(`[FOLDER] Traitement de ${testFile}...`)
|
||||||
|
|
||||||
// Simuler un objet req.file pour la logique existante
|
// Simuler un objet req.file pour la logique existante
|
||||||
const mockFile = {
|
const mockFile = {
|
||||||
path: destPath,
|
path: destPath,
|
||||||
originalname: testFile,
|
originalname: testFile,
|
||||||
mimetype: getMimeType(ext)
|
mimetype: getMimeType(ext)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extraction de texte selon le type de fichier
|
// Extraction de texte selon le type de fichier
|
||||||
let ocrResult = null
|
let ocrResult = null
|
||||||
if (ext.toLowerCase() === '.pdf') {
|
if (ext.toLowerCase() === '.pdf') {
|
||||||
@ -1230,14 +1230,14 @@ app.post('/api/folders/default', async (req, res) => {
|
|||||||
} else if (['.jpg', '.jpeg', '.png', '.tiff'].includes(ext.toLowerCase())) {
|
} else if (['.jpg', '.jpeg', '.png', '.tiff'].includes(ext.toLowerCase())) {
|
||||||
ocrResult = await extractTextFromImage(destPath)
|
ocrResult = await extractTextFromImage(destPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ocrResult && ocrResult.text) {
|
if (ocrResult && ocrResult.text) {
|
||||||
// Extraction des entités
|
// Extraction des entités
|
||||||
const entities = extractEntitiesFromText(ocrResult.text)
|
const entities = extractEntitiesFromText(ocrResult.text)
|
||||||
|
|
||||||
// Génération du résultat au format standard
|
// Génération du résultat au format standard
|
||||||
const result = generateStandardJSON(mockFile, ocrResult, entities, 0)
|
const result = generateStandardJSON(mockFile, ocrResult, entities, 0)
|
||||||
|
|
||||||
// Sauvegarde dans le cache du dossier
|
// Sauvegarde dans le cache du dossier
|
||||||
saveJsonCacheInFolder(folderHash, fileHash, result)
|
saveJsonCacheInFolder(folderHash, fileHash, result)
|
||||||
console.log(`[FOLDER] Fichier de test traité: ${testFile} -> ${fileHash}`)
|
console.log(`[FOLDER] Fichier de test traité: ${testFile} -> ${fileHash}`)
|
||||||
|
|||||||
@ -38,15 +38,6 @@ export interface BackendExtractionResult {
|
|||||||
timestamp: string
|
timestamp: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface BackendTestFiles {
|
|
||||||
success: boolean
|
|
||||||
files: Array<{
|
|
||||||
name: string
|
|
||||||
size: number
|
|
||||||
type: string
|
|
||||||
lastModified: string
|
|
||||||
}>
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extrait le texte et les entités d'un document via le backend
|
* Extrait le texte et les entités d'un document via le backend
|
||||||
@ -150,26 +141,6 @@ export async function extractDocumentBackend(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Récupère la liste des fichiers de test depuis le backend
|
|
||||||
*/
|
|
||||||
export async function getTestFilesBackend(): Promise<BackendTestFiles> {
|
|
||||||
try {
|
|
||||||
const response = await fetch(`${BACKEND_URL}/api/test-files`)
|
|
||||||
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error(`Erreur HTTP: ${response.status} ${response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
const result: BackendTestFiles = await response.json()
|
|
||||||
console.log('📁 [BACKEND] Fichiers de test récupérés:', result.files.length)
|
|
||||||
|
|
||||||
return result
|
|
||||||
} catch (error) {
|
|
||||||
console.error('❌ [BACKEND] Erreur lors de la récupération des fichiers de test:', error)
|
|
||||||
throw error
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cache pour le health check
|
// Cache pour le health check
|
||||||
let backendHealthCache: { isHealthy: boolean; timestamp: number } | null = null
|
let backendHealthCache: { isHealthy: boolean; timestamp: number } | null = null
|
||||||
|
|||||||
@ -83,6 +83,16 @@ export async function createDefaultFolder(): Promise<CreateFolderResponse> {
|
|||||||
return response.json()
|
return response.json()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Utiliser le dossier par défaut existant (sans créer de nouveau dossier)
|
||||||
|
export async function getDefaultFolder(): Promise<CreateFolderResponse> {
|
||||||
|
// Utiliser le dossier par défaut existant avec les fichiers de test
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
folderHash: '7d99a85daf66a0081a0e881630e6b39b',
|
||||||
|
message: 'Dossier par défaut récupéré'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Récupérer les résultats d'un dossier
|
// Récupérer les résultats d'un dossier
|
||||||
export async function getFolderResults(folderHash: string): Promise<FolderResponse> {
|
export async function getFolderResults(folderHash: string): Promise<FolderResponse> {
|
||||||
const response = await fetch(`${API_BASE_URL}/folders/${folderHash}/results`)
|
const response = await fetch(`${API_BASE_URL}/folders/${folderHash}/results`)
|
||||||
|
|||||||
@ -1,106 +0,0 @@
|
|||||||
/**
|
|
||||||
* API pour gérer les fichiers de test
|
|
||||||
*/
|
|
||||||
|
|
||||||
export interface TestFileInfo {
|
|
||||||
name: string
|
|
||||||
size: number
|
|
||||||
type: string
|
|
||||||
lastModified: number
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Récupère la liste des fichiers disponibles dans le dossier test-files
|
|
||||||
*/
|
|
||||||
export async function getTestFilesList(): Promise<TestFileInfo[]> {
|
|
||||||
try {
|
|
||||||
// Utiliser l'API du backend pour récupérer la liste des fichiers
|
|
||||||
const response = await fetch('http://localhost:3001/api/test-files')
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error(`Erreur API: ${response.status}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
const data = await response.json()
|
|
||||||
if (!data.success) {
|
|
||||||
throw new Error('API retourne success: false')
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convertir le format du backend vers le format attendu
|
|
||||||
return data.files.map((file: any) => {
|
|
||||||
let mimeType = 'application/octet-stream'
|
|
||||||
|
|
||||||
// Convertir l'extension en type MIME
|
|
||||||
switch (file.type) {
|
|
||||||
case '.jpg':
|
|
||||||
case '.jpeg':
|
|
||||||
mimeType = 'image/jpeg'
|
|
||||||
break
|
|
||||||
case '.png':
|
|
||||||
mimeType = 'image/png'
|
|
||||||
break
|
|
||||||
case '.pdf':
|
|
||||||
mimeType = 'application/pdf'
|
|
||||||
break
|
|
||||||
case '.tiff':
|
|
||||||
mimeType = 'image/tiff'
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
mimeType = 'application/octet-stream'
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
name: file.name,
|
|
||||||
size: file.size,
|
|
||||||
type: mimeType,
|
|
||||||
lastModified: new Date(file.lastModified).getTime()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Erreur lors de la récupération de la liste des fichiers de test:', error)
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Charge un fichier de test par son nom
|
|
||||||
*/
|
|
||||||
export async function loadTestFile(fileName: string): Promise<File | null> {
|
|
||||||
try {
|
|
||||||
const response = await fetch(`http://localhost:3001/api/test-files/${fileName}`)
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error(`Fichier non trouvé: ${fileName}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
const blob = await response.blob()
|
|
||||||
return new File([blob], fileName, { type: blob.type })
|
|
||||||
} catch (error) {
|
|
||||||
console.error(`Erreur lors du chargement du fichier ${fileName}:`, error)
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Filtre les fichiers par type MIME supporté
|
|
||||||
*/
|
|
||||||
export function filterSupportedFiles(files: TestFileInfo[]): TestFileInfo[] {
|
|
||||||
const supportedTypes = [
|
|
||||||
'application/pdf',
|
|
||||||
'image/jpeg',
|
|
||||||
'image/jpg',
|
|
||||||
'image/png',
|
|
||||||
'image/tiff'
|
|
||||||
]
|
|
||||||
|
|
||||||
return files.filter(file => {
|
|
||||||
// Vérifier le type MIME
|
|
||||||
if (supportedTypes.includes(file.type)) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Vérifier l'extension si le type MIME n'est pas fiable
|
|
||||||
const extension = file.name.split('.').pop()?.toLowerCase()
|
|
||||||
const supportedExtensions = ['pdf', 'jpg', 'jpeg', 'png', 'tiff']
|
|
||||||
|
|
||||||
return extension && supportedExtensions.includes(extension)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@ -4,7 +4,7 @@ import type { Document, ExtractionResult, AnalysisResult, ContextResult, Conseil
|
|||||||
import { documentApi } from '../services/api'
|
import { documentApi } from '../services/api'
|
||||||
import { openaiDocumentApi } from '../services/openai'
|
import { openaiDocumentApi } from '../services/openai'
|
||||||
import { backendDocumentApi, checkBackendHealth } from '../services/backendApi'
|
import { backendDocumentApi, checkBackendHealth } from '../services/backendApi'
|
||||||
import { createDefaultFolder, getFolderResults, uploadFileToFolder, type FolderResult } from '../services/folderApi'
|
import { createDefaultFolder, getDefaultFolder, getFolderResults, uploadFileToFolder, type FolderResult } from '../services/folderApi'
|
||||||
|
|
||||||
interface DocumentState {
|
interface DocumentState {
|
||||||
documents: Document[]
|
documents: Document[]
|
||||||
@ -175,7 +175,7 @@ export const getConseil = createAsyncThunk(
|
|||||||
export const createDefaultFolderThunk = createAsyncThunk(
|
export const createDefaultFolderThunk = createAsyncThunk(
|
||||||
'document/createDefaultFolder',
|
'document/createDefaultFolder',
|
||||||
async () => {
|
async () => {
|
||||||
return await createDefaultFolder()
|
return await getDefaultFolder()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user