Skip to main content

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)

ArquivoPapel
PublishRecommendationHistoryHandler.csPublica create na chain
LoadStoreModelHandler.csCarrega store cedo na chain
CreateCartContext.csStore no context
CartService.csAdd/remove com SendEvent + LastForCartId
CartRecommendationsEvent.csFactories dos 3 event types
MessageBusServiceCachedDecorator.csCache URL fila (3h)
CartRecommendationHistoryRepository.csLastForCartId + persist
CartRecommendationHistoryListenerService.csConsumer SQS
CartRecommendationHistoryService.csPersistência
Testes handlers create + add/remove commandsParcial

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 LogError em 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/WithSucesso duplicados em add e remove (4 blocos)
  • Lógica SQS dentro de funções locais do CartService
  • CartModel inteiro serializado no response do evento add

P1 — Testes não cobrem objetivo em add/remove

  • Mocks de message bus configurados mas Verify(SendFifoAsync) ausente
  • LastForCartId mockado mas comportamento de correlação não testado

O que está correto e deve ser mantido

ItemMotivo
Chain handler para createPadrão existente do Cart
LoadStoreModelHandler antes do createcontext.Store disponível sem query extra no publish
PublishRecommendationHistoryHandler após SaveCartHandlerRF-02 exige posição
MessageBusServiceCachedDecoratorPerformance — cache URL 3h
CartRecommendationHistoryListenerServiceConsumer já funcional
Skip publish quando RecommendationsId == null no createRF-02

Lacunas vs requisitos originais

RequisitoStatus
RF-02 fire-and-forget com log no createParcial — fire-and-forget sim, log não
GetCodeStoreById no IStoreRepositorySubstituído por LoadStoreModelHandler + context.Store (equivalente funcional)
Add/remove publicam históricoImplementado mas com LastForCartId
RecommendationsId persistido no cartNão implementado — premissa da refatoração