Pesquisa — Estado atual da implementação (Cart API)
Data: 2026-07-01
Branch: QA/SP-2026-13 (mudanças locais não commitadas)
Fluxo implementado hoje
Arquivos alterados (escopo do review)
| Arquivo | Papel |
|---|---|
PublishRecommendationHistoryHandler.cs | Publica create na chain |
LoadStoreModelHandler.cs | Carrega store cedo na chain |
CreateCartContext.cs | Store no context |
CartService.cs | Add/remove com SendEvent + LastForCartId |
CartRecommendationsEvent.cs | Factories dos 3 event types |
MessageBusServiceCachedDecorator.cs | Cache URL fila (3h) |
CartRecommendationHistoryRepository.cs | LastForCartId + persist |
CartRecommendationHistoryListenerService.cs | Consumer SQS |
CartRecommendationHistoryService.cs | Persistência |
| Testes handlers create + add/remove commands | Parcial |
Problemas identificados (priorizados pelo objetivo)
P0 — Correlação
// CartService.cs:800-802 e 913-914
var recommendationsId = await _cartRecommendationHistoryRepository.LastForCartId(command.CartId);
recommendationsId ??= Guid.NewGuid();
- Race: create publica na SQS; listener persiste async. Add/remove pode ocorrer antes do registro existir em
CartRecommendationsHistory. - Fallback GUID: fragmenta sessão FIFO — eventos ficam em grupos diferentes.
- Custo: +1 query por add/remove.
Solução acordada: RecommendationsId em CartModel, populado no create.
P0 — Publicação sem observabilidade
_ = SendEvent(evt); // CartService
_ = messageBusService.SendFifoAsync(...); // PublishRecommendationHistoryHandler
- Sem
LogErrorem falha (requisito RF-02 pede log) _ =em método async — unobserved exception risk
Solução: padrão LogQueueService (Task.Run + try/catch + log).
P1 — Duplicação e acoplamento
WithError/WithSucessoduplicados em add e remove (4 blocos)- Lógica SQS dentro de funções locais do
CartService CartModelinteiro serializado no response do evento add
P1 — Testes não cobrem objetivo em add/remove
- Mocks de message bus configurados mas
Verify(SendFifoAsync)ausente LastForCartIdmockado mas comportamento de correlação não testado
O que está correto e deve ser mantido
| Item | Motivo |
|---|---|
| Chain handler para create | Padrão existente do Cart |
LoadStoreModelHandler antes do create | context.Store disponível sem query extra no publish |
PublishRecommendationHistoryHandler após SaveCartHandler | RF-02 exige posição |
MessageBusServiceCachedDecorator | Performance — cache URL 3h |
CartRecommendationHistoryListenerService | Consumer já funcional |
Skip publish quando RecommendationsId == null no create | RF-02 |
Lacunas vs requisitos originais
| Requisito | Status |
|---|---|
| RF-02 fire-and-forget com log no create | Parcial — fire-and-forget sim, log não |
GetCodeStoreById no IStoreRepository | Substituído por LoadStoreModelHandler + context.Store (equivalente funcional) |
| Add/remove publicam histórico | Implementado mas com LastForCartId |
RecommendationsId persistido no cart | Não implementado — premissa da refatoração |