API REST e bot WhatsApp para gerenciamento de alimentos e informações nutricionais, construída com Bun e Elysia, seguindo os princípios de Clean Architecture e Clean Code.
Sistema completo de análise nutricional que permite:
- Cadastro e consulta de alimentos com informações nutricionais detalhadas
- Bot WhatsApp para análise de refeições via texto ou imagem
- Integração com Google Gemini para processamento de linguagem natural e análise de imagens
- Tabela PACO (Tabela Brasileira de Composição de Alimentos) para dados nutricionais
- Rastreamento de refeições diárias
- Geração de resumos diários e relatórios semanais com gráficos
Este projeto serve como exemplo de implementação de arquitetura limpa, com separação clara de responsabilidades e boas práticas de desenvolvimento.
Para começar rapidamente, você precisa:
- Clonar e iniciar a API TACO (obrigatório):
git clone https://github.com/raulfdm/taco-api.git
cd taco-api
bun install
bun run dev # Roda na porta 4000- Clonar este projeto:
git clone <repository-url>
cd bot-nutri
bun install- Configurar variáveis de ambiente (criar
.env):
MONGODB_URI=mongodb://admin:admin123@localhost:27017/?authSource=admin
MONGODB_DB_NAME=bot-nutri
USE_TACO_API=true
TACO_API_URL=http://localhost:4000/graphql
GEMINI_API_KEY=your_key_here- Iniciar MongoDB e o projeto:
bun run docker:dev # MongoDB
bun run dev # Bot NutriPara instruções detalhadas, veja a seção Como Iniciar o Projeto.
- Runtime: Bun - Runtime JavaScript/TypeScript de alta performance
- Framework: Elysia - Framework web minimalista e rápido
- Banco de Dados: MongoDB - Banco de dados NoSQL
- API TACO: taco-api - API GraphQL da Tabela Brasileira de Composição de Alimentos (obrigatória)
- WhatsApp: Baileys - Biblioteca para integração com WhatsApp
- IA: Google Gemini - API para processamento de linguagem natural e análise de imagens
- Gráficos: Chart.js Node Canvas - Geração de gráficos em servidor
- Linguagem: TypeScript - Tipagem estática
- Validação: TypeBox - Validação de schemas
- Documentação: Swagger/OpenAPI - Documentação automática da API
- Logging: Pino - Logger estruturado e performático
O projeto segue os princípios de Clean Architecture com 4 camadas bem definidas:
- Entidades de negócio (
Food,PacoItem,Meal,Message) - Interfaces de repositórios
- Regras de negócio puras
- Casos de uso (Create, Read, Update, Delete, Analyze, Report)
- DTOs (Data Transfer Objects)
- Mappers para conversão de entidades
- Implementação de repositórios (MongoDB)
- Conexão com banco de dados
- Integração com WhatsApp (Baileys)
- Integração com Gemini API
- Serviços de geração de gráficos
- Factories para injeção de dependências
- Controllers (framework-agnostic)
- Rotas HTTP
- Handlers de mensagens WhatsApp
- Adapters para Elysia
- Middlewares
src/
├── domain/ # Camada de Domínio
│ ├── entities/ # Entidades de negócio
│ └── repositories/ # Interfaces de repositórios
│
├── application/ # Camada de Aplicação
│ ├── dtos/ # Data Transfer Objects
│ ├── mappers/ # Conversores de entidades
│ └── use-cases/ # Casos de uso
│
├── infrastructure/ # Camada de Infraestrutura
│ ├── database/ # Conexão e schemas MongoDB
│ ├── repositories/ # Implementações de repositórios
│ ├── services/ # Serviços externos (Gemini, Chart)
│ ├── whatsapp/ # Integração WhatsApp
│ ├── gemini/ # Integração Gemini
│ └── factories/ # Factories para DI
│
├── presentation/ # Camada de Apresentação
│ ├── adapters/ # Adapters para frameworks
│ ├── controllers/ # Controllers
│ ├── handlers/ # Handlers de mensagens
│ ├── middlewares/ # Middlewares
│ └── routes/ # Definição de rotas
│
└── shared/ # Código Compartilhado
├── constants/ # Constantes do sistema
├── errors/ # Classes de erro
├── logger/ # Logger centralizado
├── types/ # Tipos compartilhados
└── utils/ # Utilitários
- CRUD completo de alimentos
- CRUD completo de itens PACO
- Validação de dados com TypeBox
- Tratamento de erros centralizado
- Documentação automática com Swagger
- Health check endpoint
- Desacoplamento total de framework (controllers independentes)
- Recebimento de mensagens de texto e imagens
- Análise nutricional de refeições descritas em texto
- Análise nutricional de imagens de pratos
- Detecção automática de tipo de refeição (café da manhã, almoço, jantar, lanche)
- Salvamento automático de refeições
- Comandos disponíveis:
- Envio de descrição de refeição para análise
- Envio de imagem de prato para análise
- "resumo" ou "hoje" - Resumo nutricional do dia
- "relatório semanal" ou "semana" - Relatório semanal com gráfico
- "ajuda" ou "help" - Lista de comandos disponíveis
- Integração com Google Gemini para processamento de linguagem natural
- Extração automática de alimentos e quantidades de texto
- Análise de imagens de pratos usando Gemini Vision
- Mapeamento automático com tabela PACO
- Cálculo de valores nutricionais (calorias, proteínas, carboidratos, lipídios)
- Resumo diário de refeições e valores nutricionais
- Relatório semanal com:
- Resumo detalhado por dia
- Totais da semana
- Médias diárias
- Gráfico visual (calorias, proteínas, carboidratos)
- Bun instalado (versão 1.0 ou superior)
- MongoDB rodando (local ou remoto)
- API TACO rodando localmente (obrigatório - veja instruções abaixo)
- Conta Google com acesso à API Gemini (opcional, mas recomendado para análise de imagens)
- Node.js 18+ (se não usar Bun)
git clone <repository-url>
cd bot-nutribun installCrie um arquivo .env na raiz do projeto com as seguintes variáveis:
# MongoDB Configuration
MONGODB_URI=mongodb://admin:admin123@localhost:27017/?authSource=admin
MONGODB_DB_NAME=bot-nutri
# Server Configuration
PORT=3000
NODE_ENV=development
# Logger Configuration
LOG_LEVEL=debug
# Gemini Configuration (opcional, mas recomendado)
GEMINI_API_KEY=your_gemini_api_key_here
# TACO API Configuration (obrigatório - veja instruções abaixo)
USE_TACO_API=true
TACO_API_URL=http://localhost:4000/graphqlOnde obter a chave do Gemini:
- Acesse Google AI Studio
- Crie uma nova API key
- Cole a chave no arquivo
.env
A API TACO é obrigatória para o funcionamento do projeto. Ela fornece os dados nutricionais da Tabela Brasileira de Composição de Alimentos.
4.1. Clone o repositório da API TACO:
# Clone o repositório em um diretório separado
cd ..
git clone https://github.com/raulfdm/taco-api.git
cd taco-api4.2. Instale as dependências:
bun install4.3. Inicie a API TACO:
# A API TACO rodará na porta 4000 por padrão
bun run dev4.4. Verifique se está funcionando:
# Em outro terminal, teste a API
curl http://localhost:4000/graphql \
-X POST \
-H "Content-Type: application/json" \
-d '{"query":"{ getAllFood(limit: 1) { id name } }"}'Se retornar dados JSON, a API está funcionando corretamente.
4.5. Mantenha a API TACO rodando:
- Deixe o terminal com a API TACO aberto e rodando
- A API deve estar acessível em
http://localhost:4000/graphql - Volte para o diretório do projeto:
cd bot-nutri
Documentação da API TACO:
- Site oficial: https://taco-api.netlify.app/
- Repositório: https://github.com/raulfdm/taco-api
Opção A: Usando Docker (recomendado)
# Iniciar MongoDB em modo desenvolvimento
bun run docker:dev
# Ou iniciar em modo produção
bun run docker:upOpção B: MongoDB local Certifique-se de que o MongoDB está rodando na porta 27017 com as credenciais configuradas.
No arquivo .env, certifique-se de que as seguintes variáveis estão configuradas:
# TACO API Configuration (obrigatório)
USE_TACO_API=true
TACO_API_URL=http://localhost:4000/graphql# Modo desenvolvimento (com hot reload)
bun run dev
# Modo produção
bun run start- Ao iniciar o projeto, um QR Code será exibido no terminal
- Abra o WhatsApp no seu celular
- Vá em Configurações > Aparelhos conectados > Conectar um aparelho
- Escaneie o QR Code exibido no terminal
- Após escanear, o bot estará conectado permanentemente
- As credenciais são salvas em
auth_info_baileys/(não commite esta pasta)
Após iniciar o servidor, acesse:
- Swagger UI: http://localhost:3000/swagger
- Health Check: http://localhost:3000/health
- API Info: http://localhost:3000/
A Tabela Brasileira de Composição de Alimentos (PACO) é uma base de dados oficial que contém informações nutricionais detalhadas de alimentos brasileiros. O sistema utiliza essa tabela para calcular valores nutricionais precisos durante a análise de refeições.
O projeto utiliza a API TACO como fonte principal de dados nutricionais. A API TACO é uma API GraphQL que fornece acesso completo à tabela PACO.
Repositório: https://github.com/raulfdm/taco-api
Documentação: https://taco-api.netlify.app/
Vantagens:
- ✅ Dados sempre atualizados
- ✅ Não ocupa espaço no banco local
- ✅ Acesso a todos os alimentos da tabela PACO
- ✅ Busca otimizada e rápida
- ✅ API GraphQL moderna e eficiente
Como configurar:
- Clone e inicie a API TACO (veja seção "Como Iniciar o Projeto" acima)
- Configure no
.env:
USE_TACO_API=true
TACO_API_URL=http://localhost:4000/graphql- Certifique-se de que a API TACO está rodando antes de iniciar o bot-nutri
Verificar se está funcionando:
# Testar integração
bun run validate:taco
# Verificar health check
curl http://localhost:3000/health/tacoComo usar (apenas se necessário):
- Configure no
.env:
USE_TACO_API=false- Popule o banco com dados:
bun run seed:paco- Reinicie o servidor
Limitações:
- ❌ Dados podem estar desatualizados
- ❌ Requer espaço no banco de dados
- ❌ Necessita manutenção manual dos dados
| Método | Endpoint | Descrição |
|---|---|---|
POST |
/paco |
Criar um novo item PACO (apenas MongoDB) |
GET |
/paco |
Listar todos os itens PACO |
GET |
/paco/search?q={termo} |
Buscar itens PACO por nome |
GET |
/paco/:id |
Buscar item PACO por ID |
Buscar itens PACO:
# Buscar por termo
curl "http://localhost:3000/paco/search?q=frango"
# Listar todos
curl "http://localhost:3000/paco"
# Buscar por ID
curl "http://localhost:3000/paco/123"Criar item PACO (apenas MongoDB):
curl -X POST http://localhost:3000/paco \
-H "Content-Type: application/json" \
-d '{
"nome": "Peito de frango grelhado",
"energiaKcal": 165,
"proteinaG": 31,
"carboidratoG": 0,
"lipidioG": 3.6
}'O sistema escolhe automaticamente qual repositório usar baseado nas variáveis de ambiente:
USE_TACO_API=true ou TACO_API_URL definido?
├─ SIM → Usa TacoApiPacoRepository (API TACO local)
└─ NÃO → Usa MongoDBPacoRepository (banco local - fallback)
Importante:
- A API TACO é obrigatória para o funcionamento correto do projeto
- Quando usando a API TACO, operações de escrita (
POST /paco) não são suportadas, pois a API é somente leitura - Certifique-se de que a API TACO está rodando antes de iniciar o bot-nutri
| Método | Endpoint | Descrição |
|---|---|---|
POST |
/foods |
Criar um novo alimento |
GET |
/foods |
Listar todos os alimentos |
GET |
/foods/:id |
Buscar alimento por ID |
PUT |
/foods/:id |
Atualizar alimento |
DELETE |
/foods/:id |
Deletar alimento |
| Método | Endpoint | Descrição | Observação |
|---|---|---|---|
POST |
/paco |
Criar um novo item PACO | Apenas MongoDB (não funciona com TACO API) |
GET |
/paco |
Listar todos os itens PACO | Funciona com ambos |
GET |
/paco/search?q={termo} |
Buscar itens PACO por nome | Funciona com ambos |
GET |
/paco/:id |
Buscar item PACO por ID | Funciona com ambos |
Nota: Quando usando a API TACO (USE_TACO_API=true), o endpoint POST /paco não está disponível, pois a API TACO é somente leitura.
| Método | Endpoint | Descrição |
|---|---|---|
GET |
/ |
Informações da API |
GET |
/health |
Health check geral |
GET |
/health/taco |
Health check da API TACO |
GET |
/swagger |
Documentação Swagger (UI) |
GET |
/swagger/json |
Documentação OpenAPI (JSON) |
curl -X POST http://localhost:3000/foods \
-H "Content-Type: application/json" \
-d '{
"name": "Frango Grelhado",
"calories": 165,
"protein": 31,
"carbs": 0,
"fat": 3.6
}'curl -X POST http://localhost:3000/paco \
-H "Content-Type: application/json" \
-d '{
"nome": "Peito de frango grelhado",
"energiaKcal": 165,
"proteinaG": 31,
"carboidratoG": 0,
"lipidioG": 3.6
}'curl "http://localhost:3000/paco/search?q=frango"-
Envie uma mensagem de texto descrevendo sua refeição:
- "2 peitos de frango grelhado, 200g de arroz e salada"
- O bot analisará e retornará os valores nutricionais
-
Envie uma imagem de um prato:
- O bot analisará a imagem e identificará os alimentos
-
Solicite resumo do dia:
- Envie "resumo" ou "hoje"
- O bot retornará o resumo nutricional do dia
-
Solicite relatório semanal:
- Envie "relatório semanal" ou "semana"
- O bot retornará relatório detalhado e gráfico
- Separação clara de responsabilidades em camadas
- Dependências apontam para dentro (domínio no centro)
- Independência de frameworks e tecnologias
- Testabilidade facilitada
- Nomes descritivos e significativos
- Funções pequenas e com responsabilidade única
- Código auto-documentado
- Proibição de magic strings e magic numbers
- Constantes extraídas e organizadas
- Single Responsibility Principle
- Open/Closed Principle
- Liskov Substitution Principle
- Interface Segregation Principle
- Dependency Inversion Principle
- Uso de Result<T, E> para tratamento de erros
- Evita exceções em casos de uso
- Código mais previsível e testável
Repository → Use Case → Controller → Elysia (via Adapter)
O sistema de factories gerencia todo o fluxo:
- Cria repositórios
- Injeta repositórios nos use cases
- Injeta use cases nos controllers
- Conecta controllers ao Elysia via adapter
# Desenvolvimento
bun run dev # Iniciar em modo desenvolvimento
bun run start # Iniciar em modo produção
# Testes e Qualidade
bun test # Executar testes
bun run lint # Verificar código com ESLint
bun run type-check # Verificar tipos TypeScript
# Banco de Dados
bun run seed:paco # Popular tabela PACO com dados locais
bun run reset:db # Resetar banco de dados (limpar todas as coleções)
bun run check:paco # Verificar repositório PACO
# Integração TACO
bun run validate:taco # Validar integração com API TACO
# Docker
bun run docker:up # Iniciar containers (produção)
bun run docker:down # Parar containers
bun run docker:dev # Iniciar containers (desenvolvimento)
bun run docker:logs # Ver logs dos containers
bun run docker:build # Build dos containersA documentação completa da API está disponível em:
- Swagger UI: http://localhost:3000/swagger
- OpenAPI JSON: http://localhost:3000/swagger/json
Armazena informações sobre refeições consumidas:
- ID do usuário (número do WhatsApp)
- Itens da refeição (nome, quantidade, peso, nutrientes)
- Totais nutricionais
- Tipo de refeição (breakfast, lunch, dinner, snack, other)
- Data e hora
Armazena dados da Tabela Brasileira de Composição de Alimentos:
- Nome do alimento
- Valores nutricionais por 100g
- Nome alternativo (opcional)
O sistema utiliza Pino para logging estruturado:
- Desenvolvimento: logs formatados e coloridos (pino-pretty)
- Produção: logs em formato JSON
- Níveis configuráveis via LOG_LEVEL
- Uso de Result Pattern em casos de uso
- Mensagens de erro centralizadas em constantes
- Logging estruturado de erros
- Middleware de tratamento de erros global
- Faça um fork do projeto
- Crie uma branch para sua feature (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abra um Pull Request
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Desenvolvido seguindo princípios de Clean Architecture e Clean Code.
Desenvolvido usando Bun + Elysia
