Pular para o conteúdo principal
Versão: Versão Cestas

Referência de API

Documentação das rotas e endpoints da plataforma Divino Cestas (commit 2b1881fafe).

📋 Visão Geral

A plataforma usa arquitetura MVC com Express.js. As rotas estão definidas em app/src/routes.js.

Base URL: http://localhost:13000 (desenvolvimento)

Autenticação: OpenID Connect (OAuth 2.0)

🏠 Rotas Principais

Dashboard

MétodoRotaControllerDescrição
GET/IndexController.showIndexDashboard principal
GET/callbackIndexController.showIndexCallback OAuth

🔄 Ciclos (Cycles)

Listar e Gerenciar

MétodoRotaControllerDescrição
GET/ciclo-indexCicloIndexController.showIndexLista todos os ciclos
GET/cicloCicloController.showIndexFormulário novo ciclo
POST/cicloCicloController.saveSalvar novo ciclo
GET/ciclo/:idCicloController.showIndexEditar ciclo
POST/ciclo/:idCicloController.saveAtualizar ciclo
POST/ciclo/delete/:idCicloController.deleteDeletar ciclo

Estrutura de Dados - Ciclo

{
nome: "Ciclo Primavera 2024",
dataOfertaInicio: "2024-09-01",
dataOfertaFim: "2024-09-15",
dataPedidoInicio: "2024-09-16",
dataPedidoFim: "2024-09-25",
dataRetiradaInicio: "2024-10-01",
dataRetiradaFim: "2024-10-05",
ativo: true,
// Relacionamentos
cicloEntregas: [...], // Datas de entrega
cicloCestas: [...], // Cestas do ciclo
cicloProdutos: [...] // Produtos extras
}

🧺 Cestas (Baskets)

MétodoRotaControllerDescrição
GET/cesta-indexCestaController.showIndexLista cestas
GET/cestaCestaController.showIndexFormulário nova cesta
POST/cestaCestaController.saveSalvar nova cesta
GET/cesta/:idCestaController.showIndexEditar cesta
POST/cesta/:idCestaController.saveAtualizar cesta
POST/cesta/delete/:idCestaController.deleteDeletar cesta

Estrutura de Dados - Cesta

{
nome: "Cesta Básica de Hortaliças",
descricao: "Cesta variada com hortaliças da estação",
valorReferencia: 45.00,
pesoAproximado: 5000, // gramas
ativo: true
}

🥬 Produtos (Products)

MétodoRotaControllerDescrição
GET/produto-indexProdutoController.showIndexLista produtos
GET/produtoProdutoController.showIndexFormulário novo produto
POST/produtoProdutoController.saveSalvar novo produto
GET/produto/:idProdutoController.showIndexEditar produto
POST/produto/:idProdutoController.saveAtualizar produto
POST/produto/delete/:idProdutoController.deleteDeletar produto

Estrutura de Dados - Produto

{
nome: "Alface Crespa",
unidade: "maço", // kg, unidade, litro, dúzia
pesoGramas: 200,
valorReferencia: 3.50,
descritivo: "Alface orgânica",
categoriaid: 2,
ativo: true
}

📦 Categorias

MétodoRotaControllerDescrição
GET/categoria-indexCategoriaController.showIndexLista categorias
GET/categoriaCategoriaController.showIndexFormulário nova categoria
POST/categoriaCategoriaController.saveSalvar categoria
GET/categoria/:idCategoriaController.showIndexEditar categoria
POST/categoria/:idCategoriaController.saveAtualizar categoria
POST/categoria/delete/:idCategoriaController.deleteDeletar categoria

📍 Pontos de Entrega (Delivery Points)

MétodoRotaControllerDescrição
GET/pontoentrega-indexPontoEntregaController.showIndexLista pontos
GET/pontoentregaPontoEntregaController.showIndexFormulário novo ponto
POST/pontoentregaPontoEntregaController.saveSalvar ponto
GET/pontoentrega/:idPontoEntregaController.showIndexEditar ponto
POST/pontoentrega/:idPontoEntregaController.saveAtualizar ponto
POST/pontoentrega/delete/:idPontoEntregaController.deleteDeletar ponto

Estrutura de Dados - Ponto de Entrega

{
nome: "Centro Comunitário da Vila",
endereco: "Rua das Flores, 123",
cidade: "São Paulo",
referencia: "Próximo ao mercado municipal",
responsavel: "Maria Silva",
telefone: "(11) 98765-4321",
ativo: true
}

👥 Usuários (Users)

MétodoRotaControllerDescrição
GET/usuario-indexUsuarioController.showIndexLista usuários
GET/usuarioUsuarioController.showIndexFormulário novo usuário
POST/usuarioUsuarioController.saveSalvar usuário
GET/usuario/:idUsuarioController.showIndexEditar usuário
POST/usuario/:idUsuarioController.saveAtualizar usuário
POST/usuario/delete/:idUsuarioController.deleteDeletar usuário
GET/usuarionovoUsuarioController.novoAuto-cadastro (primeiro login)
POST/usuarionovoUsuarioController.saveNovoSalvar auto-cadastro
POST/usuarionovo/:idUsuarioController.saveNovoAtualizar auto-cadastro

Estrutura de Dados - Usuário

{
nome: "João Silva",
email: "joao@exemplo.com",
perfil: ['fornecedor', 'consumidor'], // Array com perfis
nomeoficial: "João Silva - Sítio Boa Vista",
celular: "(11) 91234-5678",
descritivo: "Produtor de hortaliças orgânicas",
cientepolitica: true,
ativo: true
}

Perfis Disponíveis

perfil: DataTypes.ARRAY(DataTypes.ENUM(
'info', // Info-only
'master', // Super admin
'admin', // Administrator
'fornecedor', // Supplier
'consumidor' // Consumer
))

📊 Ofertas (Supplier Offers)

MétodoRotaControllerDescrição
GET/oferta-indexOfertaController.showIndexLista ofertas
GET/oferta/:idOfertaController.showIndexCriar/editar oferta (id = cicloId)
POST/ofertaOfertaController.saveSalvar parcial
POST/ofertasaveOfertaController.saveSalvar final
POST/ofertaapagarprodutoOfertaController.apagarProdutoRemover produto

Estrutura de Dados - Oferta

{
oferta: {
cicloid: 42,
usuarioid: 5, // Fornecedor
finalizada: true
},
produtos: [
{
produtoid: 15,
quantidade: 50,
valor: 3.50
}
]
}

🎨 Composição (Basket Composition)

MétodoRotaControllerDescrição
GET/composicao/:idComposicaoController.showIndexVer/editar composição (id = cicloCestaId)
POST/composicao/:idComposicaoController.saveAtualizar composição
POST/composicaosaveComposicaoController.saveSalvar composição

Estrutura de Dados - Composição

{
cicloCestaId: 123,
quantidadeCestas: 50,
produtos: [
{
ofertaProdutoId: 456,
quantidadePorCesta: 1.0, // 1 maço por cesta
unidade: "maço"
},
{
ofertaProdutoId: 457,
quantidadePorCesta: 0.3, // 300g por cesta
unidade: "kg"
}
]
}

🛒 Pedidos de Consumidores (Consumer Orders)

MétodoRotaControllerDescrição
GET/pedidoconsumidores/:idPedidoConsumidoresController.showIndexCriar/editar pedido (id = cicloId)
POST/pedidoconsumidoresPedidoConsumidoresController.saveSalvar pedido
GET/pedidoconsumidoresconfirmacao/:idPedidoConsumidoresController.confirmacaoPágina confirmação
POST/pedidoconsumidoresconfirmacaoPedidoConsumidoresController.finalizarFinalizar pedido
GET/pedidosconsumidorestodos/:idPedidoConsumidoresController.todosVer todos os pedidos (id = cicloId)

Estrutura de Dados - Pedido

{
pedido: {
cicloid: 42,
usuarioid: 78, // Consumidor
pontoEntregaId: 3,
finalizado: true,
dataConfirmacao: "2024-09-20T10:30:00"
},
produtos: [
{
cicloCestaId: 1,
quantidade: 2, // 2 cestas
valor: 45.00
}
]
}

📄 Relatórios (Reports)

Pedidos de Fornecedores

MétodoRotaControllerDescrição
GET/pedidosfornecedoressobra/:idRelatorioController.sobraSobra de ofertas (id = cicloId)
GET/pedidosfornecedorestodos/:idRelatorioController.todosTodos os pedidos (id = cicloId)
GET/pedidosfornecedoresciclosRelatorioController.ciclosSelecionar ciclo
POST/pedidosfornecedoresciclosRelatorioController.ciclosExibir pedidos do ciclo

Pedidos de Consumidores

MétodoRotaControllerDescrição
GET/pedidosconsumidoresciclosRelatorioController.consumidoresSelecionar ciclo
POST/pedidosconsumidoresciclosRelatorioController.consumidoresExibir pedidos

Relatório de Produtos

MétodoRotaControllerDescrição
GET/relatorioprodutosciclosRelatorioController.produtosSelecionar ciclo
POST/relatorioprodutosciclosRelatorioController.produtosExibir relatório

Exportações

MétodoRotaControllerDescrição
GET/downloadpedidosfornecedoresciclosRelatorioController.downloadBaixar CSV
GET/entregaCicloPDF/:idRelatoriosController.entregaPDFPDF de entrega (id = cicloId)

💰 Movimentações (Financial Movements)

MétodoRotaControllerDescrição
GET/movimentacaotodosMovimentacaoController.showIndexVer todas movimentações

Estrutura de Dados - Movimentação

{
usuarioid: 5, // Fornecedor/Consumidor
tipoMovimentacaoId: 2,
valor: 450.00,
data: "2024-10-05",
descricao: "Pagamento Ciclo Primavera 2024",
arquivo: "comprovante.pdf", // Opcional
cicloid: 42
}

👤 Perfil (Profile)

MétodoRotaControllerDescrição
GET/profileProfileController.indexVer perfil
POST/profileProfileController.updateAtualizar perfil

🌞 Limite Solar

MétodoRotaControllerDescrição
GET/limitesolarLimiteSolarController.showIndexPágina limite solar

🔐 Autenticação

A autenticação é gerenciada pelo middleware express-openid-connect.

Fluxo OAuth

1. GET /
└─ Se não autenticado → Redireciona para issuerBaseURL/authorize

2. Usuário faz login no provider OAuth

3. Callback → GET /callback
└─ Valida token
└─ Cria sessão (req.oidc.user)

4. Verifica se usuário existe no banco
└─ Se não → Redireciona para /usuarionovo
└─ Se sim → Continua para dashboard

Dados do Usuário Autenticado

req.oidc.user = {
email: "joao@exemplo.com",
name: "João Silva",
picture: "https://...",
email_verified: true,
sub: "oauth2|..."
}

Verificar Autenticação

// Em qualquer rota
if (req.oidc.isAuthenticated()) {
const userEmail = req.oidc.user.email;
// Buscar usuário no banco pelo email
}

📊 Exemplos de Uso

Criar um Ciclo (cURL)

curl -X POST http://localhost:13000/ciclo \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "nome=Ciclo Primavera 2024" \
-d "dataOfertaInicio=2024-09-01" \
-d "dataOfertaFim=2024-09-15" \
-d "dataPedidoInicio=2024-09-16" \
-d "dataPedidoFim=2024-09-25" \
-d "dataRetiradaInicio=2024-10-01" \
-d "dataRetiradaFim=2024-10-05"

Criar uma Oferta (JavaScript)

// Frontend - Submeter formulário de oferta
const ofertaData = {
cicloid: 42,
produtos: [
{ produtoid: 15, quantidade: 50, valor: 3.50 },
{ produtoid: 23, quantidade: 30, valor: 8.00 }
]
};

fetch('/ofertasave', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(ofertaData)
})
.then(response => response.json())
.then(data => console.log('Oferta salva:', data));

Fazer um Pedido (JavaScript)

// Frontend - Submeter pedido de consumidor
const pedidoData = {
cicloid: 42,
pontoEntregaId: 3,
produtos: [
{ cicloCestaId: 1, quantidade: 2 }, // 2 cestas básicas
{ cicloCestaId: 2, quantidade: 1 } // 1 cesta premium
]
};

fetch('/pedidoconsumidores', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(pedidoData)
})
.then(response => response.json())
.then(data => {
window.location.href = `/pedidoconsumidoresconfirmacao/${data.pedidoId}`;
});

🗃️ Banco de Dados

Configuração

// config/config.js
{
development: {
dialect: "postgres",
host: "db.dev",
database: "divinoalimento",
username: process.env.DB_USER,
password: process.env.DB_PASS
},
test: {
dialect: "sqlite",
storage: ":memory:"
},
production: {
use_env_variable: "DATABASE_URL",
dialect: "postgres",
dialectOptions: { ssl: { require: true } }
}
}

Principais Tabelas

TabelaDescrição
usuarioUsuários do sistema
cicloCiclos de entrega
cicloentregasDatas de entrega por ciclo
ciclocestasCestas associadas a ciclos
cestaTipos de cestas
produtoCatálogo de produtos
categoriaprodutosCategorias
pontoentregaPontos de entrega
ofertaOfertas de fornecedores
ofertaprodutosProdutos por oferta
composicoesComposições de cestas
composicaoofertaprodutosProdutos por composição
pedidoconsumidoresPedidos de consumidores
pedidoconsumidoresprodutosProdutos por pedido
movimentacaoMovimentações financeiras

🔧 Variáveis de Ambiente

# .env

# Aplicação
APP_PORT=13000
BASE_URL_APP=http://localhost:${APP_PORT}
NOT_USE_SSL=true

# Autenticação OAuth
BASE_URL_AUTH=localhost
AUTH_PORT=18080
issuerBaseURL=http://${BASE_URL_AUTH}:${AUTH_PORT}
clientID=your_client_id
secret=your_secret_key

# Banco de Dados (Desenvolvimento)
DB_HOST=db.dev
DB_NAME=divinoalimento
DB_USER=divino
DB_PASS=senha_segura

# Banco de Dados (Produção)
DATABASE_URL=postgresql://user:pass@host:5432/dbname

📝 Notas Importantes

Validações

  • Datas: Devem estar em formato ISO YYYY-MM-DD
  • Valores: Decimais com ponto (ex: 45.00)
  • Perfis: Array de strings (ex: ['fornecedor', 'consumidor'])

Tratamento de Erros

A maioria dos endpoints retorna:

// Sucesso
{
success: true,
data: {...},
message: "Operação realizada com sucesso"
}

// Erro
{
success: false,
error: "Mensagem do erro",
details: {...} // Opcional
}

Headers Recomendados

Content-Type: application/json
Accept: application/json
Cookie: appSession=... (gerenciado automaticamente pelo OAuth)

🔗 Referências de Código

ComponenteArquivo
Definição de Rotasapp/src/routes.js:1
Controllersapp/src/controllers/
Models (Business Logic)app/src/model/
Models (ORM)app/models/
Database Queriesapp/src/db/
Serverapp/src/server.js:1

🔗 Próximos Passos


Dúvidas sobre a API? Consulte o código fonte ou abra uma issue no GitHub.