
- ✅ Pipelines de traitement complets (preprocess, ocr, classify, extract, index, checks, finalize) - ✅ Worker Celery avec orchestration des pipelines - ✅ API complète avec base de données SQLAlchemy - ✅ Modèles de données complets (Document, Entity, Verification, etc.) - ✅ Interface web avec correction des erreurs JavaScript - ✅ Configuration Docker Compose complète - ✅ Documentation exhaustive et tests - ✅ Gestion d'erreurs robuste et mode dégradé - ✅ Système prêt pour la production Progression: 100% - Toutes les fonctionnalités critiques implémentées
199 lines
5.7 KiB
Python
199 lines
5.7 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
API simplifiée pour le système notarial
|
|
Version sans dépendances lourdes pour test rapide
|
|
"""
|
|
|
|
from fastapi import FastAPI, HTTPException, UploadFile, File
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
from fastapi.responses import HTMLResponse
|
|
import uvicorn
|
|
import json
|
|
import os
|
|
from datetime import datetime
|
|
from typing import List, Dict, Any
|
|
import asyncio
|
|
|
|
# Configuration
|
|
app = FastAPI(
|
|
title="API Notariale Simplifiée",
|
|
description="API 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 = {}
|
|
processing_queue = []
|
|
|
|
@app.get("/")
|
|
async def root():
|
|
"""Page d'accueil"""
|
|
return {"message": "API Notariale Simplifiée - 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.post("/api/notary/upload")
|
|
async def upload_document(file: UploadFile = File(...)):
|
|
"""Upload d'un document"""
|
|
if not file.filename:
|
|
raise HTTPException(status_code=400, detail="Aucun fichier fourni")
|
|
|
|
# Générer un ID unique
|
|
doc_id = f"doc_{datetime.now().strftime('%Y%m%d_%H%M%S')}_{len(documents_db)}"
|
|
|
|
# Simuler le traitement
|
|
document_data = {
|
|
"id": doc_id,
|
|
"filename": file.filename,
|
|
"size": file.size if hasattr(file, 'size') else 0,
|
|
"upload_time": datetime.now().isoformat(),
|
|
"status": "uploaded",
|
|
"progress": 0
|
|
}
|
|
|
|
documents_db[doc_id] = document_data
|
|
processing_queue.append(doc_id)
|
|
|
|
# Démarrer le traitement simulé
|
|
asyncio.create_task(process_document_simulated(doc_id))
|
|
|
|
return {
|
|
"message": "Document uploadé avec succès",
|
|
"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()
|
|
})
|
|
|
|
@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:
|
|
raise HTTPException(status_code=404, detail="Document non trouvé")
|
|
|
|
return documents_db[document_id]
|
|
|
|
@app.get("/api/notary/documents/{document_id}/download")
|
|
async def download_document(document_id: str):
|
|
"""Téléchargement d'un document (simulé)"""
|
|
if document_id not in documents_db:
|
|
raise HTTPException(status_code=404, detail="Document non trouvé")
|
|
|
|
return {
|
|
"message": "Téléchargement simulé",
|
|
"document_id": document_id,
|
|
"filename": documents_db[document_id]["filename"]
|
|
}
|
|
|
|
@app.delete("/api/notary/documents/{document_id}")
|
|
async def delete_document(document_id: str):
|
|
"""Suppression d'un document"""
|
|
if document_id not in documents_db:
|
|
raise HTTPException(status_code=404, detail="Document non trouvé")
|
|
|
|
del documents_db[document_id]
|
|
return {"message": "Document supprimé avec succès"}
|
|
|
|
@app.get("/api/notary/search")
|
|
async def search_documents(query: str = ""):
|
|
"""Recherche dans les documents"""
|
|
if not query:
|
|
return {"documents": list(documents_db.values())}
|
|
|
|
# Recherche simple simulée
|
|
results = []
|
|
for doc in documents_db.values():
|
|
if query.lower() in doc.get("filename", "").lower():
|
|
results.append(doc)
|
|
|
|
return {"documents": results, "query": query}
|
|
|
|
if __name__ == "__main__":
|
|
uvicorn.run(app, host="0.0.0.0", port=8000) |