Especificação da API REST
API Node.js para alimentar todos os componentes do Dashboard React
1. Endpoints por Seção
Visão Geral (Overview)
/api/v1/dashboard/overviewRetorna KPIs consolidados, gráficos de vendas, top produtos
/api/v1/dashboard/kpisRetorna apenas os 4 KPIs principais (faturamento, margem, ticket, pedidos)
/api/v1/dashboard/sales-chartDados para gráfico de vendas por período (diário, semanal, mensal)
/api/v1/dashboard/top-productsTop 5 produtos mais vendidos com quantidade e percentual
Análise de Vendas
/api/v1/sales/analyticsAnálise completa de vendas com comparativos e tendências
/api/v1/sales/by-channelVendas por canal (delivery, balcão, salão)
/api/v1/sales/by-storePerformance de vendas por loja (apenas para gestores de rede)
/api/v1/sales/comparisonComparação entre períodos (dia anterior, semana anterior, mês anterior)
Hierarquia de Produtos
/api/v1/products/groupsLista de grupos de produtos com métricas agregadas
/api/v1/products/types/:groupIdTipos de produtos dentro de um grupo específico
/api/v1/products/sizes/:typeIdTamanhos disponíveis para um tipo de produto
/api/v1/products/items/:sizeIdProdutos individuais de um tamanho específico
/api/v1/products/hierarchyHierarquia completa em estrutura aninhada (para drill-down)
Delivery
/api/v1/delivery/metricsMétricas consolidadas de delivery (tempo médio, taxa de sucesso)
/api/v1/delivery/by-regionEntregas por região geográfica
/api/v1/delivery/peak-hoursHorários de pico de entregas
/api/v1/delivery/driversPerformance dos entregadores
Financeiro
/api/v1/financial/dashboardDashboard financeiro completo (receita, margem, CMV, custos)
/api/v1/financial/payment-methodsDistribuição por forma de pagamento
/api/v1/financial/cash-flowFluxo de caixa por período
/api/v1/financial/costsCustos operacionais detalhados
Insights de IA
/api/v1/ai/insightsLista de insights gerados pela IA
/api/v1/ai/insights/:idDetalhes de um insight específico
/api/v1/ai/insights/:id/feedbackEnviar feedback sobre um insight (útil, parcial, não útil)
2. Filtros Suportados
Query Parameters Padrão
startDateData inicial do período (formato: YYYY-MM-DD)
Exemplo: ?startDate=2024-01-01
endDateData final do período (formato: YYYY-MM-DD)
Exemplo: ?endDate=2024-01-31
storeIdID da loja (obrigatório para gestores de loja)
Exemplo: ?storeId=123
groupIdFiltrar por grupo de produtos
Exemplo: ?groupId=5
typeIdFiltrar por tipo de produto
Exemplo: ?typeId=12
sizeIdFiltrar por tamanho de produto
Exemplo: ?sizeId=3
channelFiltrar por canal de venda (delivery, balcao, salao)
Exemplo: ?channel=delivery
periodPeríodo pré-definido (today, yesterday, week, month, year)
Exemplo: ?period=week
Exemplo de Requisição Completa
3. Payloads de Resposta (JSON)
Estrutura Padrão de Resposta
{
"success": true,
"data": { /* dados específicos do endpoint */ },
"meta": {
"timestamp": "2024-01-15T10:30:00Z",
"requestId": "req_abc123",
"executionTime": 145
}
}Exemplo: KPIs Principais
{
"success": true,
"data": {
"kpis": [
{
"key": "revenue",
"label": "Faturamento Total",
"value": 125847.50,
"formatted": "R$ 125.847,50",
"change": 12.5,
"changeType": "increase",
"icon": "ri-money-dollar-circle-line",
"gradient": "from-emerald-500 to-teal-600"
},
{
"key": "margin",
"label": "Margem de Contribuição",
"value": 42.3,
"formatted": "42,3%",
"change": 2.1,
"changeType": "increase",
"icon": "ri-percent-line",
"gradient": "from-teal-500 to-cyan-600"
},
{
"key": "avgTicket",
"label": "Ticket Médio",
"value": 67.85,
"formatted": "R$ 67,85",
"change": -3.2,
"changeType": "decrease",
"icon": "ri-shopping-cart-line",
"gradient": "from-cyan-500 to-blue-600"
},
{
"key": "orders",
"label": "Total de Pedidos",
"value": 1854,
"formatted": "1.854",
"change": 8.7,
"changeType": "increase",
"icon": "ri-file-list-3-line",
"gradient": "from-blue-500 to-indigo-600"
}
]
},
"meta": {
"timestamp": "2024-01-15T10:30:00Z",
"requestId": "req_abc123",
"executionTime": 145
}
}Exemplo: Hierarquia de Produtos
{
"success": true,
"data": {
"groups": [
{
"id": 1,
"name": "Pizzas",
"revenue": 85420.00,
"quantity": 1247,
"margin": 45.2,
"percentOfTotal": 67.8,
"types": [
{
"id": 5,
"name": "Salgadas",
"revenue": 72350.00,
"quantity": 1089,
"margin": 46.1,
"sizes": [
{
"id": 12,
"name": "Grande",
"revenue": 45200.00,
"quantity": 567,
"margin": 47.5,
"products": [
{
"id": 234,
"name": "Pizza Margherita Grande",
"revenue": 15680.00,
"quantity": 196,
"margin": 48.2,
"avgPrice": 80.00
}
]
}
]
}
]
}
]
},
"meta": {
"timestamp": "2024-01-15T10:30:00Z",
"requestId": "req_def456",
"executionTime": 287
}
}Exemplo: Insights de IA
{
"success": true,
"data": {
"insights": [
{
"id": "ins_789",
"type": "opportunity",
"priority": "high",
"title": "Oportunidade de Cross-sell",
"description": "Clientes que compram Pizza Margherita têm 67% de chance de comprar Refrigerante 2L",
"impact": "Potencial aumento de 15% no ticket médio",
"confidence": 87,
"action": "Criar combo promocional Pizza + Refrigerante",
"category": "Vendas",
"createdAt": "2024-01-15T08:00:00Z",
"status": "active",
"feedback": null
},
{
"id": "ins_790",
"type": "anomaly",
"priority": "critical",
"title": "Queda Abrupta em Vendas",
"description": "Vendas de Pizza Calabresa caíram 34% nos últimos 3 dias",
"impact": "Perda estimada de R$ 4.500 em receita",
"confidence": 95,
"action": "Verificar estoque de ingredientes e qualidade do produto",
"category": "Operacional",
"createdAt": "2024-01-15T09:15:00Z",
"status": "active",
"feedback": null
}
]
},
"meta": {
"timestamp": "2024-01-15T10:30:00Z",
"requestId": "req_ghi789",
"executionTime": 98
}
}4. Paginação
Parâmetros de Paginação
pageNúmero da página (padrão: 1)
limitItens por página (padrão: 20, máximo: 100)
sortByCampo para ordenação (ex: revenue, quantity, name)
sortOrderOrdem de classificação (asc ou desc)
Estrutura de Resposta Paginada
{
"success": true,
"data": {
"items": [ /* array de itens */ ],
"pagination": {
"page": 1,
"limit": 20,
"total": 156,
"totalPages": 8,
"hasNext": true,
"hasPrev": false
}
},
"meta": {
"timestamp": "2024-01-15T10:30:00Z",
"requestId": "req_jkl012",
"executionTime": 67
}
}Exemplo de Requisição Paginada
5. Padrão de Erros
Estrutura de Resposta de Erro
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Parâmetros inválidos",
"details": [
{
"field": "startDate",
"message": "Data inicial é obrigatória"
},
{
"field": "endDate",
"message": "Data final deve ser posterior à data inicial"
}
]
},
"meta": {
"timestamp": "2024-01-15T10:30:00Z",
"requestId": "req_error123"
}
}Códigos de Erro HTTP
OK
Requisição bem-sucedida
Bad Request
Parâmetros inválidos ou ausentes
Unauthorized
Token JWT ausente ou inválido
Forbidden
Usuário não tem permissão para acessar o recurso
Not Found
Recurso não encontrado
Internal Server Error
Erro interno do servidor
Service Unavailable
Serviço temporariamente indisponível
Códigos de Erro Customizados
VALIDATION_ERRORErro de validação de parâmetrosAUTH_ERRORErro de autenticaçãoPERMISSION_DENIEDPermissão negadaRESOURCE_NOT_FOUNDRecurso não encontradoDATABASE_ERRORErro ao acessar banco de dadosRATE_LIMIT_EXCEEDEDLimite de requisições excedido6. Performance Esperada
Endpoints Rápidos
< 200ms
- • /api/v1/dashboard/kpis
- • /api/v1/sales/by-channel
- • /api/v1/financial/payment-methods
Endpoints Médios
200ms - 500ms
- • /api/v1/dashboard/overview
- • /api/v1/sales/analytics
- • /api/v1/delivery/metrics
Endpoints Complexos
500ms - 1s
- • /api/v1/products/hierarchy
- • /api/v1/financial/dashboard
- • /api/v1/sales/comparison
Endpoints IA
1s - 3s
- • /api/v1/ai/insights
- • /api/v1/ai/generate (sob demanda)
Estratégias de Otimização
Cache Redis
TTL de 5-15 minutos para dados consolidados
Índices Otimizados
Índices compostos em data + loja + grupo
Pré-agregação
KPIs calculados em background (EOD)
Connection Pool
Pool de conexões otimizado (min: 5, max: 20)
7. Segurança (JWT + RBAC)
Autenticação JWT
Header Authorization
Todas requisições devem incluir token JWT no header
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...Expiração
Access Token: 1 hora | Refresh Token: 7 dias
Renovação Automática
Frontend renova token automaticamente antes da expiração
Payload do Token JWT
{
"userId": 123,
"email": "gestor@loja.com",
"role": "store_manager",
"storeId": 456,
"networkId": 789,
"permissions": [
"dashboard:read",
"sales:read",
"products:read",
"delivery:read"
],
"iat": 1705315200,
"exp": 1705318800
}Controle de Acesso (RBAC)
Gestor de Rede (network_admin)
Gestor de Loja (store_manager)
Analista (analyst)
Validação de Permissões
Middleware de Autenticação: Valida token JWT em todas requisições
Middleware de Autorização: Verifica permissões específicas por endpoint
Filtro Automático: Gestores de loja só recebem dados da própria loja
Rate Limiting: 100 requisições por minuto por usuário
Auditoria: Todas requisições são logadas com userId e timestamp