4NK_IA_back/services/host_api/app_minimal.py
ncantu 1fd8ddf8b0 fix: Résolution des erreurs DNS et Broken Pipe
- Ajout endpoint manquant /api/notary/document/{id}/status
- Correction erreur BrokenPipeError dans le serveur web
- Création de ressources CSS/JS locales pour éviter les erreurs DNS
- Bootstrap CSS minimal local (bootstrap.min.css)
- Chart.js minimal local (chart.min.js)
- Font Awesome minimal local (fontawesome.min.css)
- Gestion d'erreurs de connexion fermée par le client
- Interface web fonctionnelle sans dépendances externes
- Aperçu PDF avec PDF.js fonctionnel
- Polling de statut des documents opérationnel
2025-09-09 07:45:15 +02:00

196 lines
5.6 KiB
Python

#!/usr/bin/env python3
"""
API minimale pour le système notarial
Version ultra-simplifiée pour test rapide
"""
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import uvicorn
import asyncio
from datetime import datetime
from typing import Dict, Any
# Configuration
app = FastAPI(
title="API Notariale Minimale",
description="API minimale pour l'analyse de documents notariaux",
version="1.0.0"
)
# CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Stockage en mémoire pour la démo
documents_db = {
"doc_001": {
"id": "doc_001",
"filename": "acte_vente_001.pdf",
"status": "completed",
"progress": 100,
"upload_time": "2024-01-15T10:30:00",
"results": {
"ocr_text": "ACTE DE VENTE - Appartement situé 123 Rue de la Paix, 75001 Paris...",
"document_type": "Acte de vente",
"entities": {
"persons": ["Jean Dupont", "Marie Martin"],
"addresses": ["123 Rue de la Paix, 75001 Paris"],
"properties": ["Appartement T3, 75m²"]
},
"verification_score": 0.85
}
},
"doc_002": {
"id": "doc_002",
"filename": "compromis_vente_002.pdf",
"status": "processing",
"progress": 60,
"upload_time": "2024-01-15T11:00:00",
"current_step": "Extraction d'entités"
}
}
@app.get("/")
async def root():
"""Page d'accueil"""
return {"message": "API Notariale Minimale - Version 1.0.0"}
@app.get("/api/health")
async def health_check():
"""Vérification de l'état de l'API"""
return {
"status": "healthy",
"timestamp": datetime.now().isoformat(),
"version": "1.0.0",
"services": {
"api": "OK",
"llm": "Simulé",
"external_apis": "Simulé"
}
}
@app.get("/api/notary/stats")
async def get_stats():
"""Statistiques des documents"""
total_docs = len(documents_db)
processed = len([d for d in documents_db.values() if d.get("status") == "completed"])
processing = len([d for d in documents_db.values() if d.get("status") == "processing"])
return {
"total_documents": total_docs,
"processed": processed,
"processing": processing,
"pending": total_docs - processed - processing
}
@app.get("/api/notary/documents")
async def get_documents():
"""Liste des documents"""
return {
"documents": list(documents_db.values()),
"total": len(documents_db)
}
@app.get("/api/notary/document/{document_id}/status")
async def get_document_status(document_id: str):
"""Récupérer le statut d'un document spécifique"""
if document_id not in documents_db:
return {"error": "Document non trouvé"}, 404
doc = documents_db[document_id]
return {
"document_id": document_id,
"status": doc.get("status", "unknown"),
"progress": doc.get("progress", 0),
"current_step": doc.get("current_step", "En attente"),
"upload_time": doc.get("upload_time"),
"completion_time": doc.get("completion_time")
}
@app.get("/api/notary/documents/{document_id}")
async def get_document(document_id: str):
"""Détails d'un document"""
if document_id not in documents_db:
return {"error": "Document non trouvé"}
return documents_db[document_id]
@app.post("/api/notary/upload")
async def upload_document():
"""Upload simulé d'un document"""
doc_id = f"doc_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
document_data = {
"id": doc_id,
"filename": f"document_{doc_id}.pdf",
"status": "uploaded",
"progress": 0,
"upload_time": datetime.now().isoformat()
}
documents_db[doc_id] = document_data
# Simuler le traitement
asyncio.create_task(process_document_simulated(doc_id))
return {
"message": "Document uploadé avec succès (simulé)",
"document_id": doc_id,
"status": "uploaded"
}
async def process_document_simulated(doc_id: str):
"""Simulation du traitement d'un document"""
if doc_id not in documents_db:
return
# Mise à jour du statut
documents_db[doc_id]["status"] = "processing"
documents_db[doc_id]["progress"] = 10
# Simuler les étapes de traitement
steps = [
("OCR", 30),
("Classification", 50),
("Extraction d'entités", 70),
("Vérification", 90),
("Finalisation", 100)
]
for step_name, progress in steps:
await asyncio.sleep(2) # Simuler le temps de traitement
documents_db[doc_id]["progress"] = progress
documents_db[doc_id]["current_step"] = step_name
# Résultats simulés
documents_db[doc_id].update({
"status": "completed",
"progress": 100,
"current_step": "Terminé",
"results": {
"ocr_text": "Texte extrait simulé du document...",
"document_type": "Acte de vente",
"entities": {
"persons": ["Jean Dupont", "Marie Martin"],
"addresses": ["123 Rue de la Paix, 75001 Paris"],
"properties": ["Appartement T3, 75m²"]
},
"verification_score": 0.85,
"external_checks": {
"cadastre": "OK",
"georisques": "OK",
"bodacc": "OK"
}
},
"completion_time": datetime.now().isoformat()
})
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)