Spaces:
Runtime error
Runtime error
ParaAIV3.0
Browse files- api/__init__.py +0 -7
- api/processors/__init__.py +0 -1
- api/processors/base.py +0 -32
- api/routers/processors.py +2 -2
- processors/processor_analise_contextual.py +1 -1
- processors/processor_arquivo_relacional.py +1 -1
- processors/processor_auditoria.py +1 -1
- processors/processor_decisao.py +1 -1
- processors/processor_fundamentacao.py +1 -1
- processors/processor_metadados.py +1 -1
- processors/processor_relatorio.py +1 -1
- processors/processor_segmentacao_sintatica.py +1 -1
- processors/processor_transcricao_3partite.py +1 -1
- scripts/docker-entrypoint.sh +0 -127
- scripts/init-postgres.sh +0 -140
- scripts/seed-data.sql +0 -83
api/__init__.py
DELETED
|
@@ -1,7 +0,0 @@
|
|
| 1 |
-
"""
|
| 2 |
-
API Package
|
| 3 |
-
FastAPI application for para.AI v2.0
|
| 4 |
-
"""
|
| 5 |
-
|
| 6 |
-
__version__ = "2.0.0"
|
| 7 |
-
__author__ = "para.AI Team"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
api/processors/__init__.py
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
"""Processors package - 9 Especialistas"""
|
|
|
|
|
|
api/processors/base.py
DELETED
|
@@ -1,32 +0,0 @@
|
|
| 1 |
-
"""Classe base abstrata para todos os processadores"""
|
| 2 |
-
from abc import ABC, abstractmethod
|
| 3 |
-
from typing import Dict, Any
|
| 4 |
-
from datetime import datetime
|
| 5 |
-
|
| 6 |
-
class ProcessorBase(ABC):
|
| 7 |
-
"""Classe base para processadores"""
|
| 8 |
-
|
| 9 |
-
def __init__(self, specialist_id: int, specialist_name: str):
|
| 10 |
-
self.specialist_id = specialist_id
|
| 11 |
-
self.specialist_name = specialist_name
|
| 12 |
-
self.confidence_score = 0
|
| 13 |
-
|
| 14 |
-
@abstractmethod
|
| 15 |
-
def process(self, acordao_data: Dict[str, Any]) -> Dict[str, Any]:
|
| 16 |
-
"""Processa acórdão"""
|
| 17 |
-
pass
|
| 18 |
-
|
| 19 |
-
@abstractmethod
|
| 20 |
-
def get_schema(self) -> Dict[str, Any]:
|
| 21 |
-
"""Retorna schema JSON"""
|
| 22 |
-
pass
|
| 23 |
-
|
| 24 |
-
def post_process(self, result: Dict[str, Any]) -> Dict[str, Any]:
|
| 25 |
-
"""Pós-processamento"""
|
| 26 |
-
return {
|
| 27 |
-
"specialist_id": self.specialist_id,
|
| 28 |
-
"specialist_name": self.specialist_name,
|
| 29 |
-
"result": result,
|
| 30 |
-
"confidence_score": self.confidence_score,
|
| 31 |
-
"timestamp": datetime.now().isoformat()
|
| 32 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
api/routers/processors.py
CHANGED
|
@@ -24,8 +24,8 @@ async def test_processor(request: ProcessorTestRequest):
|
|
| 24 |
|
| 25 |
processor_name = processor_map.get(request.processor_name, request.processor_name)
|
| 26 |
|
| 27 |
-
from processors import
|
| 28 |
-
processor =
|
| 29 |
|
| 30 |
# Processar
|
| 31 |
result = await processor.process(
|
|
|
|
| 24 |
|
| 25 |
processor_name = processor_map.get(request.processor_name, request.processor_name)
|
| 26 |
|
| 27 |
+
from processors import processor_base
|
| 28 |
+
processor = processor_base.get_processor(processor_name)
|
| 29 |
|
| 30 |
# Processar
|
| 31 |
result = await processor.process(
|
processors/processor_analise_contextual.py
CHANGED
|
@@ -4,7 +4,7 @@ Análise semântica, contextual e de relacionamentos
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any, List
|
| 6 |
import logging
|
| 7 |
-
from processors.
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
|
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any, List
|
| 6 |
import logging
|
| 7 |
+
from .processors.processor_base import ProcessorBase
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
processors/processor_arquivo_relacional.py
CHANGED
|
@@ -4,7 +4,7 @@ Arquivamento estruturado e indexação para recuperação
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any, List
|
| 6 |
import logging
|
| 7 |
-
from processors.
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
|
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any, List
|
| 6 |
import logging
|
| 7 |
+
from .processors.processor_base import ProcessorBase
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
processors/processor_auditoria.py
CHANGED
|
@@ -4,7 +4,7 @@ Verificação de integridade e conformidade do acórdão
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any, List
|
| 6 |
import logging
|
| 7 |
-
from processors.
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
|
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any, List
|
| 6 |
import logging
|
| 7 |
+
from .processors.processor_base import ProcessorBase
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
processors/processor_decisao.py
CHANGED
|
@@ -4,7 +4,7 @@ Análise do resultado/decisão e seus impactos
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any, List
|
| 6 |
import logging
|
| 7 |
-
from processors.
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
|
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any, List
|
| 6 |
import logging
|
| 7 |
+
from .processors.processor_base import ProcessorBase
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
processors/processor_fundamentacao.py
CHANGED
|
@@ -4,7 +4,7 @@ Análise de fundamentação legal e precedentes
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any, List
|
| 6 |
import logging
|
| 7 |
-
from processors.
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
|
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any, List
|
| 6 |
import logging
|
| 7 |
+
from .processors.processor_base import ProcessorBase
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
processors/processor_metadados.py
CHANGED
|
@@ -4,7 +4,7 @@ Extração de informações estruturais do acórdão
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any
|
| 6 |
import logging
|
| 7 |
-
from processors.
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
|
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any
|
| 6 |
import logging
|
| 7 |
+
from .processors.processor_base import ProcessorBase
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
processors/processor_relatorio.py
CHANGED
|
@@ -4,7 +4,7 @@ Análise estrutural e argumentativa do relatório
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any, List
|
| 6 |
import logging
|
| 7 |
-
from processors.
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
|
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any, List
|
| 6 |
import logging
|
| 7 |
+
from .processors.processor_base import ProcessorBase
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
processors/processor_segmentacao_sintatica.py
CHANGED
|
@@ -4,7 +4,7 @@ Análise sintática profunda e segmentação de unidades semânticas
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any, List
|
| 6 |
import logging
|
| 7 |
-
from processors.
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
|
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any, List
|
| 6 |
import logging
|
| 7 |
+
from .processors.processor_base import ProcessorBase
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
processors/processor_transcricao_3partite.py
CHANGED
|
@@ -4,7 +4,7 @@ Transcrição estruturada com mapeamento triplo (original → análise → resum
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any, List
|
| 6 |
import logging
|
| 7 |
-
from processors.
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
|
|
|
| 4 |
"""
|
| 5 |
from typing import Dict, Any, List
|
| 6 |
import logging
|
| 7 |
+
from .processors.processor_base import ProcessorBase
|
| 8 |
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
scripts/docker-entrypoint.sh
DELETED
|
@@ -1,127 +0,0 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
# ============================================================================
|
| 3 |
-
# Docker Entrypoint - para.AI API v3.0
|
| 4 |
-
# Inicializa PostgreSQL local + API FastAPI
|
| 5 |
-
# ============================================================================
|
| 6 |
-
|
| 7 |
-
set -e
|
| 8 |
-
|
| 9 |
-
echo ""
|
| 10 |
-
echo "╔══════════════════════════════════════════════════════════════╗"
|
| 11 |
-
echo "║ para.AI API v3.0 ║"
|
| 12 |
-
echo "║ Análise Jurisprudencial com IA ║"
|
| 13 |
-
echo "╚══════════════════════════════════════════════════════════════╝"
|
| 14 |
-
echo ""
|
| 15 |
-
|
| 16 |
-
# ============================================================================
|
| 17 |
-
# FASE 1: VERIFICAR AMBIENTE
|
| 18 |
-
# ============================================================================
|
| 19 |
-
echo "🔍 Verificando ambiente..."
|
| 20 |
-
|
| 21 |
-
# Mostrar informações do sistema
|
| 22 |
-
echo " Python: $(python --version)"
|
| 23 |
-
echo " PostgreSQL: $(su - postgres -c 'psql --version' | head -1)"
|
| 24 |
-
echo " Diretório: $(pwd)"
|
| 25 |
-
echo ""
|
| 26 |
-
|
| 27 |
-
# ============================================================================
|
| 28 |
-
# FASE 2: INICIALIZAR POSTGRESQL
|
| 29 |
-
# ============================================================================
|
| 30 |
-
echo "🐘 Inicializando PostgreSQL local..."
|
| 31 |
-
/init-postgres.sh
|
| 32 |
-
|
| 33 |
-
# Verificar se PostgreSQL está rodando
|
| 34 |
-
if ! pg_isready -h localhost -p 5432 &> /dev/null; then
|
| 35 |
-
echo "❌ PostgreSQL não está rodando!"
|
| 36 |
-
exit 1
|
| 37 |
-
fi
|
| 38 |
-
|
| 39 |
-
echo "✅ PostgreSQL OK"
|
| 40 |
-
echo ""
|
| 41 |
-
|
| 42 |
-
# ============================================================================
|
| 43 |
-
# FASE 3: CONFIGURAR VARIÁVEIS DE AMBIENTE
|
| 44 |
-
# ============================================================================
|
| 45 |
-
echo "⚙️ Configurando variáveis de ambiente..."
|
| 46 |
-
|
| 47 |
-
# Se DATABASE_URL não foi fornecida, usar a local
|
| 48 |
-
if [ -z "$DATABASE_URL" ] || [ "$DATABASE_URL" = "postgresql://para_ai:para_ai_temp@localhost:5432/para_ai" ]; then
|
| 49 |
-
export DATABASE_URL="postgresql://${POSTGRES_USER:-para_ai}:${POSTGRES_PASSWORD:-para_ai_temp}@localhost:5432/${POSTGRES_DB:-para_ai}"
|
| 50 |
-
echo " DATABASE_URL configurada para PostgreSQL local"
|
| 51 |
-
fi
|
| 52 |
-
|
| 53 |
-
# Configurações padrão para HF Spaces
|
| 54 |
-
export APP_ENV="${APP_ENV:-production}"
|
| 55 |
-
export DEBUG="${DEBUG:-false}"
|
| 56 |
-
export HOST="${HOST:-0.0.0.0}"
|
| 57 |
-
export PORT="${PORT:-7860}"
|
| 58 |
-
|
| 59 |
-
echo " APP_ENV: $APP_ENV"
|
| 60 |
-
echo " PORT: $PORT"
|
| 61 |
-
echo " DATABASE: PostgreSQL local"
|
| 62 |
-
echo ""
|
| 63 |
-
|
| 64 |
-
# ============================================================================
|
| 65 |
-
# FASE 4: TESTAR CONEXÃO COM BANCO
|
| 66 |
-
# ============================================================================
|
| 67 |
-
echo "🔗 Testando conexão com banco de dados..."
|
| 68 |
-
|
| 69 |
-
python3 << 'PYTHON_TEST'
|
| 70 |
-
import sys
|
| 71 |
-
from api.config import get_settings
|
| 72 |
-
|
| 73 |
-
try:
|
| 74 |
-
settings = get_settings()
|
| 75 |
-
print(f" ✅ Configurações carregadas")
|
| 76 |
-
print(f" ✅ Environment: {settings.APP_ENV}")
|
| 77 |
-
print(f" ✅ Database URL configurada")
|
| 78 |
-
except Exception as e:
|
| 79 |
-
print(f" ❌ Erro ao carregar configurações: {e}")
|
| 80 |
-
sys.exit(1)
|
| 81 |
-
|
| 82 |
-
# Testar conexão com DB
|
| 83 |
-
try:
|
| 84 |
-
from database.db_manager import get_db_manager
|
| 85 |
-
db = get_db_manager()
|
| 86 |
-
if db.health_check():
|
| 87 |
-
print(f" ✅ Conexão com PostgreSQL OK")
|
| 88 |
-
else:
|
| 89 |
-
print(f" ❌ Falha no health check do DB")
|
| 90 |
-
sys.exit(1)
|
| 91 |
-
except Exception as e:
|
| 92 |
-
print(f" ❌ Erro ao conectar com DB: {e}")
|
| 93 |
-
sys.exit(1)
|
| 94 |
-
PYTHON_TEST
|
| 95 |
-
|
| 96 |
-
if [ $? -ne 0 ]; then
|
| 97 |
-
echo "❌ Falha ao testar conexão com banco!"
|
| 98 |
-
exit 1
|
| 99 |
-
fi
|
| 100 |
-
|
| 101 |
-
echo ""
|
| 102 |
-
|
| 103 |
-
# ============================================================================
|
| 104 |
-
# FASE 5: INICIALIZAR API
|
| 105 |
-
# ============================================================================
|
| 106 |
-
echo "🚀 Iniciando API FastAPI..."
|
| 107 |
-
echo ""
|
| 108 |
-
echo "╔══════════════════════════════════════════════════════════════╗"
|
| 109 |
-
echo "║ API ONLINE ║"
|
| 110 |
-
echo "╚══════════════════════════════════════════════════════════════╝"
|
| 111 |
-
echo ""
|
| 112 |
-
echo "📍 Endpoints disponíveis:"
|
| 113 |
-
echo " • Documentação: http://localhost:$PORT/api/docs"
|
| 114 |
-
echo " • Health Check: http://localhost:$PORT/api/v1/health"
|
| 115 |
-
echo " • Upload: http://localhost:$PORT/api/v1/process/upload"
|
| 116 |
-
echo ""
|
| 117 |
-
echo "💡 PostgreSQL rodando localmente (temporário)"
|
| 118 |
-
echo "⚠️ ATENÇÃO: Dados são perdidos ao reiniciar o container!"
|
| 119 |
-
echo ""
|
| 120 |
-
echo "🔧 Para banco persistente, configure DATABASE_URL nas Secrets"
|
| 121 |
-
echo " Recomendado: Neon (https://neon.tech) ou Supabase"
|
| 122 |
-
echo ""
|
| 123 |
-
echo "=================================================="
|
| 124 |
-
echo ""
|
| 125 |
-
|
| 126 |
-
# Executar comando passado (geralmente uvicorn)
|
| 127 |
-
exec "$@"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scripts/init-postgres.sh
DELETED
|
@@ -1,140 +0,0 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
# ============================================================================
|
| 3 |
-
# Script de inicialização do PostgreSQL dentro do container Docker
|
| 4 |
-
# para.AI API v3.0 - Hugging Face Spaces
|
| 5 |
-
# ============================================================================
|
| 6 |
-
|
| 7 |
-
set -e
|
| 8 |
-
|
| 9 |
-
echo "=================================================="
|
| 10 |
-
echo "🐘 Inicializando PostgreSQL local..."
|
| 11 |
-
echo "=================================================="
|
| 12 |
-
|
| 13 |
-
# Variáveis
|
| 14 |
-
POSTGRES_USER="${POSTGRES_USER:-para_ai}"
|
| 15 |
-
POSTGRES_PASSWORD="${POSTGRES_PASSWORD:-para_ai_temp}"
|
| 16 |
-
POSTGRES_DB="${POSTGRES_DB:-para_ai}"
|
| 17 |
-
PGDATA="/var/lib/postgresql/data"
|
| 18 |
-
|
| 19 |
-
# Verificar se já foi inicializado
|
| 20 |
-
if [ -d "$PGDATA/base" ]; then
|
| 21 |
-
echo "✅ PostgreSQL já inicializado (dados existem)"
|
| 22 |
-
else
|
| 23 |
-
echo "📦 Inicializando cluster PostgreSQL..."
|
| 24 |
-
|
| 25 |
-
# Criar diretório de dados
|
| 26 |
-
mkdir -p "$PGDATA"
|
| 27 |
-
chown -R postgres:postgres "$PGDATA"
|
| 28 |
-
chmod 700 "$PGDATA"
|
| 29 |
-
|
| 30 |
-
# Inicializar cluster como usuário postgres
|
| 31 |
-
su - postgres -c "/usr/lib/postgresql/15/bin/initdb -D $PGDATA --encoding=UTF8 --locale=C"
|
| 32 |
-
|
| 33 |
-
echo "✅ Cluster criado"
|
| 34 |
-
fi
|
| 35 |
-
|
| 36 |
-
# Configurar pg_hba.conf para aceitar conexões locais
|
| 37 |
-
cat > "$PGDATA/pg_hba.conf" << EOF
|
| 38 |
-
# TYPE DATABASE USER ADDRESS METHOD
|
| 39 |
-
local all all trust
|
| 40 |
-
host all all 127.0.0.1/32 md5
|
| 41 |
-
host all all ::1/128 md5
|
| 42 |
-
host all all 0.0.0.0/0 md5
|
| 43 |
-
EOF
|
| 44 |
-
|
| 45 |
-
# Configurar postgresql.conf
|
| 46 |
-
cat >> "$PGDATA/postgresql.conf" << EOF
|
| 47 |
-
|
| 48 |
-
# Configurações para ambiente Docker/HF Spaces
|
| 49 |
-
listen_addresses = '*'
|
| 50 |
-
port = 5432
|
| 51 |
-
max_connections = 50
|
| 52 |
-
shared_buffers = 128MB
|
| 53 |
-
work_mem = 4MB
|
| 54 |
-
maintenance_work_mem = 64MB
|
| 55 |
-
effective_cache_size = 256MB
|
| 56 |
-
log_destination = 'stderr'
|
| 57 |
-
logging_collector = off
|
| 58 |
-
log_min_messages = warning
|
| 59 |
-
log_min_error_statement = error
|
| 60 |
-
EOF
|
| 61 |
-
|
| 62 |
-
echo "✅ Configurações aplicadas"
|
| 63 |
-
|
| 64 |
-
# Iniciar PostgreSQL em background
|
| 65 |
-
echo "🚀 Iniciando servidor PostgreSQL..."
|
| 66 |
-
su - postgres -c "/usr/lib/postgresql/15/bin/pg_ctl -D $PGDATA -l /var/log/postgresql/postgresql.log start"
|
| 67 |
-
|
| 68 |
-
# Aguardar PostgreSQL ficar pronto
|
| 69 |
-
echo "⏳ Aguardando PostgreSQL ficar pronto..."
|
| 70 |
-
for i in {1..30}; do
|
| 71 |
-
if su - postgres -c "psql -l" &> /dev/null; then
|
| 72 |
-
echo "✅ PostgreSQL está pronto!"
|
| 73 |
-
break
|
| 74 |
-
fi
|
| 75 |
-
echo " Tentativa $i/30..."
|
| 76 |
-
sleep 1
|
| 77 |
-
done
|
| 78 |
-
|
| 79 |
-
# Verificar se ficou pronto
|
| 80 |
-
if ! su - postgres -c "psql -l" &> /dev/null; then
|
| 81 |
-
echo "❌ PostgreSQL não iniciou corretamente!"
|
| 82 |
-
cat /var/log/postgresql/postgresql.log
|
| 83 |
-
exit 1
|
| 84 |
-
fi
|
| 85 |
-
|
| 86 |
-
# Criar usuário se não existir
|
| 87 |
-
echo "👤 Criando usuário $POSTGRES_USER..."
|
| 88 |
-
su - postgres -c "psql -tc \"SELECT 1 FROM pg_user WHERE usename = '$POSTGRES_USER'\" | grep -q 1" || su - postgres -c "psql -c \"CREATE USER $POSTGRES_USER WITH PASSWORD '$POSTGRES_PASSWORD';\"" && echo "✅ Usuário criado"
|
| 89 |
-
|
| 90 |
-
# Criar database se não existir
|
| 91 |
-
echo "🗄️ Criando database $POSTGRES_DB..."
|
| 92 |
-
su - postgres -c "psql -lqt | cut -d \| -f 1 | grep -qw $POSTGRES_DB" || su - postgres -c "psql -c \"CREATE DATABASE $POSTGRES_DB OWNER $POSTGRES_USER;\"" && echo "✅ Database criado"
|
| 93 |
-
|
| 94 |
-
# Dar permissões
|
| 95 |
-
su - postgres -c "psql -c \"GRANT ALL PRIVILEGES ON DATABASE $POSTGRES_DB TO $POSTGRES_USER;\""
|
| 96 |
-
|
| 97 |
-
# Executar DDL se arquivo existir
|
| 98 |
-
if [ -f "/app/database/init_db.sql" ]; then
|
| 99 |
-
echo "📜 Executando DDL..."
|
| 100 |
-
PGPASSWORD=$POSTGRES_PASSWORD psql -h localhost -U $POSTGRES_USER -d $POSTGRES_DB -f /app/database/init_db.sql
|
| 101 |
-
echo "✅ DDL executado"
|
| 102 |
-
else
|
| 103 |
-
echo "⚠️ Arquivo init_db.sql não encontrado"
|
| 104 |
-
fi
|
| 105 |
-
|
| 106 |
-
# Executar seed data se arquivo existir
|
| 107 |
-
if [ -f "/app/scripts/seed_data.sql" ]; then
|
| 108 |
-
echo "🌱 Inserindo dados de teste..."
|
| 109 |
-
PGPASSWORD=$POSTGRES_PASSWORD psql -h localhost -U $POSTGRES_USER -d $POSTGRES_DB -f /app/scripts/seed_data.sql
|
| 110 |
-
echo "✅ Seed data inserido"
|
| 111 |
-
fi
|
| 112 |
-
|
| 113 |
-
# Mostrar status
|
| 114 |
-
echo ""
|
| 115 |
-
echo "=================================================="
|
| 116 |
-
echo "✅ PostgreSQL inicializado com sucesso!"
|
| 117 |
-
echo "=================================================="
|
| 118 |
-
echo "📊 Informações:"
|
| 119 |
-
echo " Host: localhost"
|
| 120 |
-
echo " Port: 5432"
|
| 121 |
-
echo " Database: $POSTGRES_DB"
|
| 122 |
-
echo " User: $POSTGRES_USER"
|
| 123 |
-
echo ""
|
| 124 |
-
|
| 125 |
-
# Mostrar estatísticas
|
| 126 |
-
echo "📈 Estatísticas:"
|
| 127 |
-
PGPASSWORD=$POSTGRES_PASSWORD psql -h localhost -U $POSTGRES_USER -d $POSTGRES_DB -c "
|
| 128 |
-
SELECT
|
| 129 |
-
'Tribunais' as tabela, COUNT(*)::text as registros FROM tribunais
|
| 130 |
-
UNION ALL
|
| 131 |
-
SELECT 'Usuários', COUNT(*)::text FROM usuarios
|
| 132 |
-
UNION ALL
|
| 133 |
-
SELECT 'Acórdãos', COUNT(*)::text FROM acordaos
|
| 134 |
-
UNION ALL
|
| 135 |
-
SELECT 'Decisões', COUNT(*)::text FROM decisoes;
|
| 136 |
-
" 2>/dev/null || echo " (tabelas ainda não criadas)"
|
| 137 |
-
|
| 138 |
-
echo ""
|
| 139 |
-
echo "✅ Pronto para iniciar API!"
|
| 140 |
-
echo "=================================================="
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scripts/seed-data.sql
DELETED
|
@@ -1,83 +0,0 @@
|
|
| 1 |
-
-- ============================================================================
|
| 2 |
-
-- Seed Data para desenvolvimento local - para.AI
|
| 3 |
-
-- ============================================================================
|
| 4 |
-
-- Este script insere dados de teste para desenvolvimento
|
| 5 |
-
|
| 6 |
-
-- Inserir tribunal de teste
|
| 7 |
-
INSERT INTO tribunais (id, nome, sigla, uf, tipo, url_base, created_at, updated_at)
|
| 8 |
-
VALUES
|
| 9 |
-
(gen_random_uuid(), 'Tribunal de Justiça do Paraná', 'TJPR', 'PR', 'Estadual', 'https://www.tjpr.jus.br', NOW(), NOW()),
|
| 10 |
-
(gen_random_uuid(), 'Tribunal de Justiça de São Paulo', 'TJSP', 'SP', 'Estadual', 'https://www.tjsp.jus.br', NOW(), NOW()),
|
| 11 |
-
(gen_random_uuid(), 'Superior Tribunal de Justiça', 'STJ', 'DF', 'Superior', 'https://www.stj.jus.br', NOW(), NOW())
|
| 12 |
-
ON CONFLICT (sigla) DO NOTHING;
|
| 13 |
-
|
| 14 |
-
-- Inserir usuário de teste
|
| 15 |
-
INSERT INTO usuarios (id, email, nome, senha_hash, ativo, role, created_at, updated_at)
|
| 16 |
-
VALUES
|
| 17 |
-
(gen_random_uuid(), 'admin@para.ai', 'Administrador', '$2b$12$dummy_hash_for_development', TRUE, 'admin', NOW(), NOW()),
|
| 18 |
-
(gen_random_uuid(), 'dev@para.ai', 'Desenvolvedor', '$2b$12$dummy_hash_for_development', TRUE, 'user', NOW(), NOW())
|
| 19 |
-
ON CONFLICT (email) DO NOTHING;
|
| 20 |
-
|
| 21 |
-
-- Inserir acórdão de teste
|
| 22 |
-
DO $$
|
| 23 |
-
DECLARE
|
| 24 |
-
v_tribunal_id VARCHAR(36);
|
| 25 |
-
v_acordao_id VARCHAR(36);
|
| 26 |
-
BEGIN
|
| 27 |
-
-- Pegar ID do TJPR
|
| 28 |
-
SELECT id INTO v_tribunal_id FROM tribunais WHERE sigla = 'TJPR' LIMIT 1;
|
| 29 |
-
|
| 30 |
-
-- Inserir acórdão de teste
|
| 31 |
-
INSERT INTO acordaos (
|
| 32 |
-
id, tribunal_id, numero, ano, data_julgamento,
|
| 33 |
-
ementa, relator, orgao_julgador,
|
| 34 |
-
hash_conteudo, status_processamento,
|
| 35 |
-
created_at, updated_at
|
| 36 |
-
)
|
| 37 |
-
VALUES (
|
| 38 |
-
gen_random_uuid(),
|
| 39 |
-
v_tribunal_id,
|
| 40 |
-
'0000001-00.2025.8.16.0000',
|
| 41 |
-
2025,
|
| 42 |
-
'2025-01-15 14:30:00',
|
| 43 |
-
'APELAÇÃO CÍVEL. DIREITO DO CONSUMIDOR. RESPONSABILIDADE CIVIL. DANO MORAL. CDC ART. 14. RECURSO PROVIDO.',
|
| 44 |
-
'Des. Teste da Silva',
|
| 45 |
-
'1ª Câmara Cível',
|
| 46 |
-
encode(sha256('teste_acordao_1'::bytea), 'hex'),
|
| 47 |
-
'pendente',
|
| 48 |
-
NOW(),
|
| 49 |
-
NOW()
|
| 50 |
-
)
|
| 51 |
-
ON CONFLICT (hash_conteudo) DO NOTHING
|
| 52 |
-
RETURNING id INTO v_acordao_id;
|
| 53 |
-
|
| 54 |
-
-- Inserir palavras-chave de teste
|
| 55 |
-
INSERT INTO palavras_chave (id, termo, categoria, frequencia, ativo, created_at)
|
| 56 |
-
VALUES
|
| 57 |
-
(gen_random_uuid(), 'responsabilidade civil', 'direito_civil', 100, TRUE, NOW()),
|
| 58 |
-
(gen_random_uuid(), 'dano moral', 'direito_civil', 150, TRUE, NOW()),
|
| 59 |
-
(gen_random_uuid(), 'consumidor', 'direito_consumidor', 200, TRUE, NOW()),
|
| 60 |
-
(gen_random_uuid(), 'CDC', 'legislacao', 180, TRUE, NOW())
|
| 61 |
-
ON CONFLICT (termo) DO NOTHING;
|
| 62 |
-
|
| 63 |
-
END $$;
|
| 64 |
-
|
| 65 |
-
-- Criar índices adicionais úteis
|
| 66 |
-
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_acordao_ano_tribunal ON acordaos(ano, tribunal_id);
|
| 67 |
-
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_acordao_status_data ON acordaos(status_processamento, data_julgamento DESC);
|
| 68 |
-
|
| 69 |
-
-- Vacuum e analyze
|
| 70 |
-
VACUUM ANALYZE acordaos;
|
| 71 |
-
VACUUM ANALYZE tribunais;
|
| 72 |
-
VACUUM ANALYZE usuarios;
|
| 73 |
-
|
| 74 |
-
-- Mensagem de sucesso
|
| 75 |
-
DO $$
|
| 76 |
-
BEGIN
|
| 77 |
-
RAISE NOTICE '✅ Seed data inserido com sucesso!';
|
| 78 |
-
RAISE NOTICE '📊 Estatísticas:';
|
| 79 |
-
RAISE NOTICE ' - Tribunais: %', (SELECT COUNT(*) FROM tribunais);
|
| 80 |
-
RAISE NOTICE ' - Usuários: %', (SELECT COUNT(*) FROM usuarios);
|
| 81 |
-
RAISE NOTICE ' - Acórdãos: %', (SELECT COUNT(*) FROM acordaos);
|
| 82 |
-
RAISE NOTICE ' - Palavras-chave: %', (SELECT COUNT(*) FROM palavras_chave);
|
| 83 |
-
END $$;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|