You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Arquitetura modular excelente — checkout.js é um módulo bem isolado (~350 linhas), com responsabilidade clara e desacoplado do resto da aplicação.
Logs estruturados consistentes — Padrão [timestamp] [LEVEL] [Checkout] mensagem alinhado com o módulo de catálogo.
Validação robusta em todas as camadas:
userId obrigatório via header X-User-Id
productId e quantity validados antes de adicionar ao carrinho
Estoque verificado antes de adicionar item e antes do checkout
Carrinho vazio bloqueia checkout com mensagem clara
Fluxo de checkout realista:
Valida estoque de todos os itens atomicamente
Simula pagamento com 10% de chance de falha (HTTP 402)
Abate estoque dos produtos
Limpa carrinho após sucesso
Cria pedido com histórico de timestamps
Máquina de estados de pedido — pending → confirmed → preparing → shipped → delivered, com proteção contra transições inválidas (status final bloqueado).
Subtotais e total calculados corretamente — (price * quantity).toFixed(2) com parseFloat.
Carrinho por usuário — Escopo isolado por userId, escalável para múltiplos usuários simultâneos.
Incremento inteligente — Se o mesmo produto já existe no carrinho, a quantidade é incrementada em vez de duplicar o item.
setTimeout no checkout é fire-and-forget (linhas 274-276)
O setTimeout loga "pagamento confirmado" depois que a resposta HTTP já foi enviada (res.status(201).json(...)). O delay de 500ms-2s não tem efeito real do ponto de vista do cliente. Se a intenção é simular processamento, o res.json() deveria estar DENTRO do setTimeout:
PATCH /api/orders/:id/status — Escopo global de busca (linhas 318-327)
O endpoint itera sobre pedidos de todos os usuários para encontrar o pedido, ignorando o userId do header. Um usuário pode potencialmente avançar o status de pedidos de outro usuário. Para um laboratório de observabilidade é aceitável, mas documente essa limitação.
Útil se outros módulos precisarem referenciar os mesmos status.
Middleware de userId mais explícito
O middleware tenta extrair userId de req.body (linha 65), mas requests GET não têm body. Considere separar em middleware apenas para header:
Proteção para rotas admin
POST/PUT/DELETE de produtos e PATCH de status de pedidos não têm autenticação. Para um lab de observabilidade funciona, mas considere pelo menos um header X-Admin-Key para simular controle de acesso.
Veredito: ✅ Comentário (self-review) — Código de alta qualidade, sugestões não bloqueantes.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Resolve a issue #3. Depende da #2 (Catálogo de Produtos).
Alterações realizadas:
app/checkout.js— Novo módulo com:Carrinho (por userId via header X-User-Id)
GET /api/cart— Visualizar carrinho (subtotal por item + total)POST /api/cart/add— Adicionar item (valida estoque, incrementa se já existe)PUT /api/cart/update/:itemId— Atualizar quantidade (0 = remove)DELETE /api/cart/remove/:itemId— Remover itemCheckout
POST /api/checkout— Finalizar compra:Pedidos
GET /api/orders— Listar pedidos do usuárioGET /api/orders/:id— Detalhe do pedido (itens, total, status, datas)PATCH /api/orders/:id/status— Avançar status: pending → confirmed → preparing → shipped → deliveredapp/catalog.js— Incluído (mesmo da Sprint 1 · #2 — Implementar API de Catálogo de Produtos #2) como dependência para validação de estoqueapp/app.js— Montagem dos módulos catalog e checkout sob /api.gitignore— Ignora node_modules/