PARA.AI / api /routers /database.py
Carlex22's picture
Revert "ParaAIV3.1"
1f24745
"""
Router de testes de database
Endpoints para verificar conexão e estatísticas do banco
"""
from fastapi import APIRouter, HTTPException
from api.models.responses import DatabaseStatsResponse, MessageResponse
from api.utils.logger import setup_logger
router = APIRouter()
logger = setup_logger(__name__)
@router.get("/health")
async def database_health():
"""
**Verifica saúde da conexão com banco de dados.**
Retorna status da conexão e informações básicas.
"""
try:
from database.db_manager import get_db_manager
db = get_db_manager()
is_healthy = db.health_check()
if is_healthy:
return {
"status": "healthy",
"message": "Database connection OK",
"database_url": db.get_connection_info()
}
else:
return {
"status": "unhealthy",
"message": "Database connection failed"
}
except Exception as e:
logger.error(f"Database health check error: {e}")
return {
"status": "error",
"message": str(e)
}
@router.get("/stats", response_model=DatabaseStatsResponse)
async def database_stats():
"""
**Estatísticas do banco de dados.**
Retorna contagem de registros nas principais tabelas.
"""
try:
from database.db_manager import get_db_manager
db = get_db_manager()
stats = {
"total_acordaos": db.count_records("acordaos"),
"total_tribunais": db.count_records("tribunais"),
"total_usuarios": db.count_records("usuarios"),
"total_decisoes": db.count_records("decisoes"),
}
# Tentar pegar tamanho do banco
try:
size_mb = db.get_database_size_mb()
stats["database_size_mb"] = size_mb
except:
stats["database_size_mb"] = None
return DatabaseStatsResponse(**stats)
except Exception as e:
logger.error(f"Error getting database stats: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.get("/tables")
async def list_tables():
"""
**Lista todas as tabelas do banco.**
Útil para verificar se DDL foi executado corretamente.
"""
try:
from database.db_manager import get_db_manager
db = get_db_manager()
tables = db.list_tables()
return {
"tables": tables,
"total": len(tables)
}
except Exception as e:
logger.error(f"Error listing tables: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.post("/test-insert")
async def test_insert():
"""
**Testa inserção no banco de dados.**
Insere um registro de teste e depois remove.
Útil para verificar permissões de escrita.
"""
try:
from database.db_manager import get_db_manager
import uuid
db = get_db_manager()
# Tentar inserir um tribunal de teste
test_id = str(uuid.uuid4())
success = db.execute_query(
"""
INSERT INTO tribunais (id, nome, sigla, uf, tipo, created_at, updated_at)
VALUES (%s, %s, %s, %s, %s, NOW(), NOW())
""",
(test_id, "Tribunal Teste", "TEST", "DF", "Teste")
)
if success:
# Remover registro de teste
db.execute_query(
"DELETE FROM tribunais WHERE id = %s",
(test_id,)
)
return MessageResponse(
message="Test insert/delete successful",
details={"test_id": test_id}
)
else:
raise Exception("Insert failed")
except Exception as e:
logger.error(f"Test insert error: {e}")
raise HTTPException(status_code=500, detail=str(e))