API REST para gestão de rebanhos bubalinos. Cobre o ciclo completo de manejo: cadastro de animais, controle reprodutivo, produção leiteira, saúde, alimentação e alertas automáticos com classificação por IA.
- Arquitetura
- Stack
- Pré-requisitos
- Configuração
- Rodando localmente
- Rodando com Docker
- Variáveis de Ambiente
- Estrutura do Projeto
- Módulos
- Alertas e RabbitMQ
- Jobs Agendados
- Autenticação e Autorização
- Health Checks
- Testes
- Deploy
| Camada | Tecnologia | Versão |
|---|---|---|
| Runtime | Node.js | >= 20 |
| Framework | NestJS | 11.x |
| Linguagem | TypeScript | 5.x |
| Banco de Dados | PostgreSQL via Supabase | Hospedado + RLS |
| ORM | Drizzle ORM | + PostGIS |
| Autenticação | Supabase Auth | JWT + Passport |
| IA | Google Gemini 2.5 Flash | Classificação de alertas |
| Mensageria | RabbitMQ 3.13 | @nestjs/microservices |
| Documentação | Swagger / OpenAPI | @nestjs/swagger 11.x |
| Validação | class-validator + class-transformer | — |
| Cache | @nestjs/cache-manager |
In-memory |
| Segurança | Helmet + CORS + Throttler | Rate limiting por IP |
| Agendamento | @nestjs/schedule |
Cron jobs |
| ETL | buffs-etl-worker (Go) | Importação/exportação XLSX |
| Build | SWC | Compilação rápida |
| Containerização | Docker | Multi-stage, Node 20 Alpine |
- Node.js >= 20 e npm >= 10
- Docker e Docker Compose
- Conta no Supabase com projeto configurado
- Chave de API do Google Gemini
git clone https://github.com/AgroCore-co/buffs-api.git
cd buffs-apinpm installcp .env.example .envEdite o .env com suas credenciais. Consulte a seção Variáveis de Ambiente para detalhes.
O projeto precisa do RabbitMQ para o sistema de alertas assíncrono. Suba-o com Docker:
docker compose -f infra/docker-compose.yml up -d rabbitmqVerifique se está saudável:
docker compose -f infra/docker-compose.yml ps
# ou acesse: http://localhost:15672 (admin/admin)npm run start:devA API estará disponível em http://localhost:3001.
A documentação Swagger estará em http://localhost:3001/api.
# Build para produção
npm run build
# Executar o build compilado
npm run start:prod
# Modo debug
npm run start:debug
# Lint
npm run lint
# Formatar código
npm run formatO docker-compose.prod.yml sobe toda a stack: RabbitMQ, API, ETL Worker (Go) e serviço de IA (FastAPI).
# Na raiz do projeto
docker compose -f infra/docker-compose.prod.yml up -ddocker build -t buffs-api .
docker run -p 3001:3001 --env-file .env buffs-api# Ver status dos serviços
docker compose -f infra/docker-compose.yml ps
# Ver logs em tempo real
docker compose -f infra/docker-compose.yml logs -f
# Logs de um serviço específico
docker compose -f infra/docker-compose.yml logs -f rabbitmq
# Parar todos os serviços
docker compose -f infra/docker-compose.yml down
# Parar e remover volumes (apaga dados persistidos)
docker compose -f infra/docker-compose.yml down -vCopie o .env.example e preencha as variáveis obrigatórias:
| Variável | Obrigatória | Descrição |
|---|---|---|
SUPABASE_URL |
✅ | URL do projeto Supabase |
SUPABASE_KEY |
✅ | Chave anon do Supabase |
SUPABASE_SERVICE_ROLE_KEY |
✅ | Chave de service role do Supabase |
SUPABASE_JWT_SECRET |
✅ | JWT secret (Settings > API no Supabase) |
DATABASE_URL |
✅ | Connection string do PostgreSQL (pooler) |
DIRECT_URL |
✅ | Connection string direta (para migrações) |
GEMINI_API_KEY |
✅ | Chave da API Google Gemini |
RABBITMQ_URL |
✅ | URL AMQP — padrão: amqp://admin:admin@localhost:5672 |
ETL_BASE_URL |
✅ | URL do worker ETL Go — padrão: http://localhost:8081 |
ETL_INTERNAL_KEY |
✅ | Chave interna (X-Internal-Key) para o ETL |
IA_API_URL |
✅ | URL do serviço de predição (buffs-ia) |
PORT |
— | Porta da API — padrão: 3001 |
NODE_ENV |
— | development ou production |
CORS_ORIGIN |
— | Origens permitidas, separadas por vírgula |
buffs-api/
├── src/
│ ├── core/ # Infraestrutura compartilhada
│ │ ├── cache/ # Cache in-memory + constantes de TTL
│ │ ├── database/ # Drizzle ORM + pool de conexão
│ │ ├── decorators/ # Decoradores customizados (ToBoolean, etc.)
│ │ ├── dto/ # DTOs base (paginação)
│ │ ├── gemini/ # Cliente Google Gemini
│ │ ├── guards/ # Guards compartilhados (PropertyExists)
│ │ ├── interfaces/ # Interfaces transversais (ISoftDelete)
│ │ ├── logger/ # Logger customizado estruturado
│ │ ├── rabbitmq/ # ClientProxy + bootstrap de DLX/DLQ
│ │ ├── services/ # AuthHelperService, UserMappingService
│ │ ├── supabase/ # Cliente Supabase (normal + admin)
│ │ ├── utils/ # Paginação, datas, erros, similaridade
│ │ └── validators/ # Validadores de data, mensagens padronizadas
│ │
│ ├── database/ # Schema Drizzle + relations
│ │
│ ├── modules/ # Domínios de negócio
│ │ ├── alerta/ # Alertas + consumers RabbitMQ + schedulers
│ │ ├── alimentacao/ # Definições e registros de alimentação
│ │ ├── auth/ # Autenticação JWT + guards + facade de cadastro
│ │ ├── dashboard/ # Métricas e indicadores por propriedade
│ │ ├── data-ingestion/ # Importação/exportação XLSX via ETL Worker
│ │ ├── gestao-propriedade/ # Endereços, propriedades e lotes/piquetes
│ │ ├── producao/ # Lactação, ordenhas, estoque, retiradas e IA
│ │ ├── rebanho/ # Búfalos, raças, grupos e movimentação de lote
│ │ ├── reproducao/ # Coberturas, genealogia, material genético e simulação
│ │ ├── saude-zootecnia/ # Vacinação, dados sanitários, zootécnicos e medicamentos
│ │ ├── sync/ # Sincronização offline-first para mobile
│ │ └── usuario/ # Gestão de usuários e funcionários
│ │
│ ├── health/ # Health check endpoint
│ ├── app.module.ts
│ ├── app.consumer.module.ts # Módulo isolado do consumer RabbitMQ
│ └── main.ts # Bootstrap HTTP + microserviço RMQ (Hybrid App)
│
├── drizzle/ # Migrações SQL
├── infra/ # Docker Compose (local e produção)
├── test/ # Testes e2e
├── docs/specs/ # Software Design Document (SDD) por módulo
├── Dockerfile
└── .env.example
| Método | Rota | Descrição |
|---|---|---|
POST |
/auth/signup-proprietario |
Cadastro de proprietário |
POST |
/auth/signup-funcionario |
Cadastro de funcionário (PROPRIETARIO/GERENTE) |
POST |
/auth/signin |
Login |
POST |
/auth/refresh |
Renovar token |
POST |
/auth/signout |
Logout |
Búfalos (/bufalos) — CRUD com soft delete, filtros avançados (raça, sexo, status, maturidade, brinco), genealogia, movimentação em lote e atualização automática de maturidade via scheduler.
Raças (/racas), Grupos (/grupos), Movimentação de Lote (/mov-lote) — CRUD com soft delete e controle de ownership por propriedade.
Coberturas (/cobertura) — Registro com validações zootécnicas, parto, recomendações de cruzamento (IAR para fêmeas / IVR com ajuste bayesiano para machos).
Genealogia (/reproducao/genealogia) — Árvore genealógica recursiva, análise de consanguinidade e machos compatíveis via IA.
Material Genético (/material-genetico) — CRUD com validações cruzadas por origem (Coleta Própria / Compra).
Simulação (/reproducao/simulacao) — Predição de potencial genético via IA externa.
Lactação (/lactacao), Ordenhas (/ordenhas), Produção Diária (/producao-diaria), Retiradas (/retiradas), Laticínios (/laticinios) — Ciclo completo de produção leiteira com soft delete.
Predição (POST /producao/predicao) — Predição de produção individual via serviço de IA com timeout de 30s.
Vacinação (/vacinacao), Dados Zootécnicos (/dados-zootecnicos), Medicamentos (/medicamentos), Dados Sanitários (/dados-sanitarios) — CRUD com normalização automática de nomes de doenças e geração de alertas clínicos para diagnósticos graves.
Importação e exportação de planilhas XLSX via ETL Worker (Go), com rate limit de 10 req/hora por propriedade.
| Operação | Domínios disponíveis |
|---|---|
POST (importar) |
leite, pesagem, reproducao |
GET (exportar) |
leite, pesagem, reproducao |
GET /data-ingestion/jobs/:jobId |
Status de processamento assíncrono |
Estatísticas gerais, métricas de lactação, produção mensal e reprodução por propriedade, com cache de leitura.
Endpoints de sincronização offline-first para o app mobile, incluindo todos os domínios de negócio com payload padronizado (data + meta).
O sistema de alertas desacopla a criação (HTTP síncrono) da classificação por IA (processamento assíncrono).
AlertasService.create()
──────────────────────── Queue: buffs.alerts
1. Salva no banco ──► alerta_criado ──► AlertasConsumer
2. Emite evento 1. Classifica via Gemini (timeout 10s)
3. Retorna HTTP 201 2. Atualiza prioridade no banco
3. ack / nack → DLQ (buffs.alerts.dlq)
Configuração local do RabbitMQ:
# Subir
docker compose -f infra/docker-compose.yml up -d rabbitmq
# Management UI
open http://localhost:15672 # admin / admin
# Inspecionar filas
docker exec buffs-rabbitmq rabbitmqctl list_queues name messages consumers
# Inspecionar exchanges
docker exec buffs-rabbitmq rabbitmqctl list_exchanges name typeTodos os jobs rodam via @nestjs/schedule e iteram sobre todas as propriedades ativas.
| Horário | Job | Nicho |
|---|---|---|
00:00 |
Tratamentos com retorno agendado | SANITÁRIO |
00:00 |
Atualização de maturidade dos animais | — |
00:05 |
Nascimentos previstos (próximos 30 dias) | REPRODUÇÃO |
01:00 |
Limpeza de uploads temporários (temp/uploads/) |
— |
01:00 |
Coberturas sem diagnóstico há +90 dias | REPRODUÇÃO |
02:00 |
Fêmeas vazias há +180 dias | REPRODUÇÃO |
03:00 |
Vacinações agendadas | SANITÁRIO |
04:00 |
Queda de produção leiteira (≥20% em 7 dias) | PRODUÇÃO |
05:00 |
Secagem pendente em gestantes | MANEJO |
06:00 |
Sinais clínicos precoces (múltiplos tratamentos / ganho insuficiente) | CLÍNICO |
Autenticação via Supabase Auth (JWT). Todas as rotas — exceto /health, /api e os endpoints públicos de auth — são protegidas.
Authorization: Bearer <access_token>| Cargo | Criar propriedade | Gerenciar funcionários | Alterar cargos | Operações gerais |
|---|---|---|---|---|
PROPRIETARIO |
✅ | ✅ | ✅ | ✅ |
GERENTE |
— | ✅ | ✅ | ✅ |
FUNCIONARIO |
— | — | — | ✅ |
VETERINARIO |
— | — | — | ✅ (saúde) |
| Guard | Responsabilidade |
|---|---|
SupabaseAuthGuard |
Valida JWT via Passport |
RolesGuard |
Verifica cargo via metadata @Roles |
PropertyExistsGuard |
Valida existência da propriedade no banco |
OnboardingGuard |
Bloqueia proprietário sem propriedade cadastrada |
EmailVerifiedGuard |
Exige confirmação de e-mail para operações críticas |
{
"status": "ok",
"timestamp": "2025-01-01T00:00:00.000Z",
"service": "BUFFS API",
"version": "1.0.0",
"uptime": 3600,
"environment": "production",
"port": 3001
}Retorna status detalhado de todos os serviços dependentes: banco, Gemini e RabbitMQ, além de métricas de memória e informações do processo Node.
# Unitários
npm run test
# Watch mode
npm run test:watch
# End-to-end
npm run test:e2e
# Cobertura
npm run test:covO deploy é feito via GitHub Actions (.github/workflows/deploy.yml). A pipeline:
- Faz checkout de
buffs-api,buffs-etl-workerebuffs-ia - Builda as 3 imagens Docker
- Empacota e envia ao servidor via SCP
- Conecta via SSH, restaura o
.env, carrega as imagens e sobe a stack comdocker compose - Executa health check na API antes de finalizar
NODE_ENV=production
RABBITMQ_URL=amqp://admin:admin@rabbitmq:5672
ETL_BASE_URL=http://buffs-etl-worker:8081
IA_API_URL=http://buffs-ia:8000
CORS_ORIGIN=https://app.seudominio.com
NODE_OPTIONS=--max-old-space-size=256Os hostnames usam a rede interna do Docker Compose em produção.
- Email: buffsapp@gmail.com
- Issues: GitHub Issues
