-
Leia esse documento com atenção antes de iniciar as atividades.
-
Você terá:
- 2 dias para entregar o plano de trabalho (item 1).
- Até 7 dias corridos para concluir as atividades solicitadas.
- Caso não consiga concluir todas as atividades, entregue o que tiver feito até a data.
- Importante: qualidade e clareza serão mais valorizadas do que quantidade de funcionalidades.
-
Crie um repositório público no Github para seu projeto.
-
Ao concluir, envie um e-mail com o assunto:
[DESAFIO IPAG] - SEU NOME COMPLETOpara: vagas@ipag.com.br, incluindo o link do repositório. -
Você pode utilizar tecnologias, libs ou técnicas adicionais, desde que documente em seu relatório final os motivos.
-
A aplicação deve rodar com instruções claras de execução (README).
-
Obrigatório: utilização de Docker Compose para montagem do ambiente (MySQL, RabbitMQ, aplicação).
-
Não utilize frameworks prontos (ex.: Laravel, Nest, Adonis, Django).
- Permitido uso de micro frameworks para endpoints (Express, Flask, Slim, etc.).
- O objetivo é avaliar sua capacidade de estruturar soluções do zero.
-
Documente bem o seu projeto (README explicativo, arquitetura, decisões técnicas).
-
Boa sorte!
O desafio consiste em desenvolver uma API REST para gerenciar pedidos de venda e um Worker para processamento assíncrono de notificações. O sistema deve incluir funcionalidades de cadastro, consulta, atualização de status e geração de logs de notificação via RabbitMQ.
- API REST: Gerencia pedidos (CRUD + status)
- Worker/Consumer: Processa mensagens da fila e gera logs
- Banco de Dados: Armazena pedidos, clientes e itens
- RabbitMQ: Mensageria para comunicação assíncrona
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ API REST │────│ RabbitMQ │────│ Worker │
│ │ │ │ │ │
│ - Orders │ │ Queue: │ │ - Consume │
│ - Status │ │ order_status │ │ - Log │
│ - Summary │ │ │ │ - Notify │
└─────────────┘ └──────────────┘ └─────────────┘
│ │
└─────────────┐ ┌─────────┘
│ │
┌──────▼───────────────▼──────┐
│ MySQL Database │
│ │
│ Tables: │
│ • customers │
│ • orders │
│ • order_items │
│ • notification_logs │
└─────────────────────────────┘
- Liste as atividades como tarefas.
- Estime as horas de cada atividade.
- Estrutura limpa, organizada, com boas práticas de programação.
- Utilize padrões de projeto (MVC, Repository, etc.).
- Modele e implemente as tabelas necessárias.
- Crie migrations para criação das tabelas.
- Sugestão de estrutura mínima:
customers: id, name, document, email, phone, created_at orders: id, customer_id, order_number, total_value, status, created_at, updated_at order_items: id, order_id, product_name, quantity, unit_value notification_logs: id, order_id, old_status, new_status, message, created_at
- Fila:
order_status_updates - Publisher: API publica mensagem quando status muda
- Consumer: Worker processa mensagens e gera logs
- Formato da mensagem:
{ "order_id": "ORD-12345", "old_status": "PENDING", "new_status": "PAID", "timestamp": "2025-08-21T10:30:00Z", "user_id": "system" }
- POST /orders: Cria um novo pedido
- GET /orders/{order_id}: Consulta pedido específico
- PUT /orders/{order_id}/status: Atualiza status do pedido
- GET /orders: Lista pedidos (com filtros opcionais)
- GET /orders/summary: Resumo estatístico dos pedidos
{
"customer": {
"id": 1,
"name": "Fulano de Tal",
"document": "12345678900",
"email": "fulano@email.com",
"phone": "11999999999"
},
"order": {
"total_value": 150.00,
"items": [
{
"product_name": "Produto 1",
"quantity": 2,
"unit_value": 50.00
},
{
"product_name": "Produto 2",
"quantity": 1,
"unit_value": 50.00
}
]
}
}{
"order_id": "ORD-12345",
"order_number": "ORD-12345",
"status": "PENDING",
"total_value": 150.00,
"customer": {
"id": 1,
"name": "Fulano de Tal",
"document": "12345678900",
"email": "fulano@email.com",
"phone": "11999999999"
},
"items": [
{
"product_name": "Produto 1",
"quantity": 2,
"unit_value": 50.00,
"total_value": 100.00
},
{
"product_name": "Produto 2",
"quantity": 1,
"unit_value": 50.00,
"total_value": 50.00
}
],
"created_at": "2025-08-21T10:30:00Z"
}{
"status": "PAID",
"notes": "Pagamento confirmado via PIX"
}- PENDING: Pedido criado, aguardando pagamento
- WAITING_PAYMENT: Aguardando confirmação de pagamento
- PAID: Pagamento confirmado
- PROCESSING: Pedido em processamento
- SHIPPED: Pedido enviado
- DELIVERED: Pedido entregue ao cliente
- CANCELED: Pedido cancelado
PENDING → WAITING_PAYMENT → PAID → PROCESSING → SHIPPED → DELIVERED
↓ ↓ ↓ ↓
CANCELED CANCELED CANCELED CANCELED
- Não é possível cancelar pedidos já entregues
- Status só pode avançar sequencialmente (exceto cancelamento)
- Toda mudança de status deve gerar notificação na fila
- Consumir mensagens da fila
order_status_updates - Validar dados da mensagem
- Registrar log no banco de dados (tabela
notification_logs) - Simular envio de notificação (log estruturado)
[2025-08-21 10:30:00] INFO: Order ORD-12345 status changed from PENDING to PAID
[2025-08-21 10:30:00] INFO: Notification sent to customer fulano@email.com
- Qualidade do código (organização, padrões, clean code)
- Modelagem do banco (clareza, normalização, migrations)
- Uso correto de filas (publisher/consumer, tratamento de erros)
- Boas práticas de arquitetura (separação de responsabilidades)
- Documentação clara (README, setup, endpoints, decisões)
- Validação de dados de entrada
- Tratamento de erros e logs estruturados
- Transições de status válidas
- Código limpo e bem comentado
- Facilidade de execução (Docker Compose funcional)
- Validação robusta de dados de entrada
- Logs estruturados em formato JSON
- README detalhado com exemplos de uso
- Testes automatizados (unitários e integração)
- API documentation (Swagger/OpenAPI)
- Health checks para API e Worker
- Rate limiting básico nos endpoints
- Dead Letter Queue para mensagens com falha
- Metrics/Monitoring básico (contadores, timers)
- Graceful shutdown dos serviços
- Environment-based configuration
- Database connection pooling
- Código fonte completo no repositório GitHub
- README.md detalhado com:
- Instruções de setup e execução
- Documentação dos endpoints
- Estrutura do projeto
- Decisões técnicas tomadas
- Plano de trabalho (tasks e estimativas)
- Docker Compose funcional
- Migrations do banco de dados
- Collection do Postman/Insomnia para testes (opcional)
- Comece simples: implemente primeiro a API básica, depois adicione o worker
- Teste incrementalmente: cada endpoint deve funcionar antes de prosseguir
- Use logs: facilita debug e demonstra profissionalismo
- Documente decisões: explique por que escolheu determinada abordagem
- Valide entradas: sempre valide dados recebidos pela API
- Pense em falhas: como o sistema se comporta quando algo dá errado?
Tempo estimado: 20-35 horas (dependendo do nível e diferenciais implementados)
Boa sorte! 🚀