193 lines
4.2 KiB
Markdown
193 lines
4.2 KiB
Markdown
# DuOrigin v2 - Prisma Database Layer
|
|
|
|
Este diretório contém o schema Prisma e scripts de seed para o DuOrigin v2.
|
|
|
|
## 📁 Estrutura
|
|
|
|
```
|
|
prisma/
|
|
├── schema.prisma # Schema do banco de dados
|
|
├── seed.ts # Script de seed com dados demo
|
|
└── README.md # Esta documentação
|
|
```
|
|
|
|
## 🗄️ Modelos de Dados
|
|
|
|
| Modelo | Descrição | Tabela |
|
|
|--------|-----------|--------|
|
|
| `User` | Usuários do sistema (autenticação) | `users` |
|
|
| `Company` | Empresas/operadores EUDR | `companies` |
|
|
| `Producer` | Produtores rurais | `producers` |
|
|
| `Area` | Propriedades/glebas com geolocalização | `areas` |
|
|
| `Product` | Commodities EUDR (soja, café, etc.) | `products` |
|
|
| `Lot` | Lotes de produto para rastreabilidade | `lots` |
|
|
| `DdsStatement` | Declarações de Due Diligence | `dds_statements` |
|
|
| `AuditLog` | Trilha de auditoria | `audit_logs` |
|
|
|
|
## 🔗 Relacionamentos
|
|
|
|
```
|
|
Company
|
|
└── Producer (1:N)
|
|
├── Area (1:N)
|
|
│ └── Lot (1:N)
|
|
└── Lot (1:N)
|
|
|
|
Product
|
|
└── Lot (1:N)
|
|
|
|
Company
|
|
└── DdsStatement (1:N)
|
|
└── lot_ids (JSON array)
|
|
|
|
User
|
|
└── AuditLog (1:N)
|
|
```
|
|
|
|
## 🚀 Setup
|
|
|
|
### 1. Configurar Variável de Ambiente
|
|
|
|
Crie ou edite `.env` na raiz do projeto:
|
|
|
|
```env
|
|
# Via túnel SSH (recomendado para dev local)
|
|
DATABASE_URL="postgresql://duorigin:DuOrigin2026!@localhost:5433/duorigin"
|
|
|
|
# Conexão direta (se PostgreSQL aceitar conexões externas)
|
|
# DATABASE_URL="postgresql://duorigin:DuOrigin2026!@198.199.84.130:5432/duorigin"
|
|
```
|
|
|
|
### 1.1 Criar Túnel SSH (se necessário)
|
|
|
|
Se o PostgreSQL não aceita conexões externas, crie um túnel SSH:
|
|
|
|
```bash
|
|
# Criar túnel (porta local 5433 -> servidor 5432)
|
|
ssh -i ~/.ssh/digitalocean_jarvis -L 5433:localhost:5432 -fN root@198.199.84.130
|
|
|
|
# Verificar se túnel está ativo
|
|
ss -tlnp | grep 5433
|
|
|
|
# Matar túnel quando terminar
|
|
pkill -f "ssh.*5433.*5432"
|
|
```
|
|
|
|
### 2. Gerar Prisma Client
|
|
|
|
```bash
|
|
npx prisma generate
|
|
```
|
|
|
|
### 3. Aplicar Schema (se banco novo)
|
|
|
|
```bash
|
|
# Criar migration inicial
|
|
npx prisma migrate dev --name init
|
|
|
|
# Ou sincronizar sem migration (dev)
|
|
npx prisma db push
|
|
```
|
|
|
|
### 4. Popular com Dados Demo
|
|
|
|
```bash
|
|
npx prisma db seed
|
|
```
|
|
|
|
## 📊 Dados de Demonstração
|
|
|
|
O seed cria os seguintes dados:
|
|
|
|
### Usuários
|
|
| Email | Senha | Role |
|
|
|-------|-------|------|
|
|
| demo@duorigin.com | DuoDemo2026 | admin |
|
|
| operador@duorigin.com | DuoDemo2026 | operator |
|
|
|
|
### Empresas (3)
|
|
- AgroCerrado Exportações Ltda (GO)
|
|
- Fazendas Unidas do Brasil S.A. (MT)
|
|
- Cooperativa Agrícola Planalto Central (MG)
|
|
|
|
### Produtores (5)
|
|
Produtores rurais vinculados às empresas, com CAR válido.
|
|
|
|
### Áreas (5)
|
|
Propriedades rurais no Cerrado com coordenadas reais:
|
|
- 3 áreas com risco baixo (sem desmatamento)
|
|
- 1 área com risco médio (alerta)
|
|
- 1 área com risco alto (desmatamento confirmado)
|
|
|
|
### Lotes (10)
|
|
Lotes de soja e café em diferentes status:
|
|
- 4 aprovados
|
|
- 2 em revisão
|
|
- 2 rejeitados
|
|
- 2 pendentes
|
|
|
|
### Declarações DDS (5)
|
|
Due Diligence Statements em vários status:
|
|
- 2 aprovadas (com EU reference)
|
|
- 1 submetida (aguardando)
|
|
- 1 rejeitada
|
|
- 1 rascunho
|
|
|
|
## 🛠️ Comandos Úteis
|
|
|
|
```bash
|
|
# Abrir Prisma Studio (GUI)
|
|
npx prisma studio
|
|
|
|
# Resetar banco e re-seed
|
|
npx prisma migrate reset
|
|
|
|
# Verificar schema
|
|
npx prisma validate
|
|
|
|
# Formatar schema
|
|
npx prisma format
|
|
|
|
# Gerar diagrama ERD
|
|
npx prisma-erd-generator
|
|
```
|
|
|
|
## 📦 Uso no Código
|
|
|
|
```typescript
|
|
import { prisma } from '@/lib/prisma';
|
|
|
|
// Buscar todos os lotes com risco alto
|
|
const highRiskLots = await prisma.lot.findMany({
|
|
where: { risk_score: { gte: 70 } },
|
|
include: {
|
|
area: true,
|
|
producer: true,
|
|
product: true,
|
|
},
|
|
});
|
|
|
|
// Buscar empresa com produtores e áreas
|
|
const company = await prisma.company.findUnique({
|
|
where: { id: 1 },
|
|
include: {
|
|
producers: {
|
|
include: { areas: true },
|
|
},
|
|
},
|
|
});
|
|
```
|
|
|
|
## 🔒 Segurança
|
|
|
|
- Nunca commitar `.env` com credenciais reais
|
|
- Em produção, usar SSL: `?sslmode=require`
|
|
- Sempre usar prepared statements (Prisma faz isso automaticamente)
|
|
|
|
## 📝 Notas
|
|
|
|
- O campo `lot_ids` em `DdsStatement` é um JSON array de IDs
|
|
- O campo `geojson` em `Area` armazena polígonos GeoJSON
|
|
- Timestamps são `DateTime?` para compatibilidade com banco existente
|
|
- Passwords são hasheados com bcrypt (salt rounds: 10)
|