Documento de Requisitos — Alterar POST api/cart
Tarefa: #196022 Contexto: Sequência de implementação #4
Visão Geral
Modificar o endpoint POST api/cart para aceitar o campo opcional RecommendationsId (Guid?)
e publicar o evento RecommendationCartCreated na fila SQS FIFO quando o campo estiver presente.
Papéis Envolvidos
| Papel | Responsabilidade |
|---|---|
| Desenvolvedor Back-end | Alterar DTO, adicionar handler no chain e estender repositório |
Requisitos Funcionais
RF-01 — Receber RecommendationsId no CreateCartCommand
História de Usuário: Como sistema, quero receber o RecommendationsId na criação do
carrinho para associar o evento de histórico ao fluxo de upsell.
Critérios de Aceitação:
- WHEN o
CreateCartCommandfor declarado THEN o sistema SHALL conter o campoRecommendationsId(Guid?) como propriedade opcional - WHEN
RecommendationsIdnão for enviado na requisição THEN o sistema SHALL tratá-lo comonulle seguir o fluxo normalmente sem associar recomendação - WHEN
RecommendationsIdfor enviado com formato inválido THEN o sistema SHALL rejeitar a requisição com HTTP 400 (validação nativa do model binding paraGuid?)
Localização: Cart.Domain/Commands/CreateCartCommand.cs
RF-02 — PublishRecommendationHistoryHandler
História de Usuário: Como sistema, quero publicar o evento RecommendationCartCreated
na fila de histórico após a persistência bem-sucedida do carrinho, sem impactar a resposta
ao cliente.
Critérios de Aceitação:
- WHEN o handler for executado E
Command.RecommendationsIdfornullTHEN o sistema SHALL retornar o context sem publicar nenhum evento - WHEN o handler for executado E
Command.RecommendationsIdnão fornullTHEN o sistema SHALL buscar oCodeStoreviaIStoreRepository.GetCodeStoreById(context.CartModel.StoreId) - WHEN
GetCodeStoreByIdretornarnullTHEN o sistema SHALL publicar o evento comCodeStore = string.Empty - WHEN o
CodeStorefor resolvido THEN o sistema SHALL publicarCartRecommendationsEvent.RecommendationCartCreated(recommendationsId, cartId, customerId, codeStore)viaIMessageBusService.SendFifoAsync - WHEN
SendFifoAsynclançar exceção THEN o sistema SHALL logar o erro e retornar o context sem adicionar erros (fire-and-forget — falha de observabilidade não deve impactar a criação do carrinho) - WHEN o carrinho já existia (re-execução por idempotency) THEN o sistema SHALL publicar o evento normalmente — duplicatas são intencionais para diagnóstico
- WHEN o handler for posicionado no chain THEN o sistema SHALL ser inserido imediatamente
após
SaveCartHandler
Localização: Cart.API/Application/Handlers/CreateCart/PublishRecommendationHistoryHandler.cs
Injeção de dependências (primary constructor):
IMessageBusService messageBusServiceIStoreRepository storeRepositoryILogger<PublishRecommendationHistoryHandler> logger
RF-03 — GetCodeStoreById no IStoreRepository
História de Usuário: Como sistema, quero buscar o CodeStore a partir do StoreId
inteiro para compor o evento de histórico.
Critérios de Aceitação:
- WHEN a interface for declarada THEN o sistema SHALL expor
Task<string?> GetCodeStoreById(int storeId) - WHEN a implementação em
StoreRepositoryfor criada THEN o sistema SHALL consultar_dbContextRead.Stores.AsNoTracking()filtrando porx.Id == storeIde retornarx.CodeStore - WHEN
CacheStoreRepositoryDecoratorfor atualizado THEN o sistema SHALL implementarGetCodeStoreByIdcom cache key"StoreModel-{schema}-StoreId-{storeId}"eSetAbsoluteExpiration(TimeSpan.FromHours(12)) - WHEN o resultado da query for
nullTHEN o sistema SHALL não escrever no cache
Localização:
- Interface:
Cart.Domain/Interfaces/Repositories/IStoreRepository.cs - Implementação:
Cart.Infrastructure/Data/Repositories/StoreRepository.cs - Decorator:
Cart.Infrastructure/Data/Repositories/Cached/CacheStoreRepositoryDecorator.cs
RF-04 — Registrar IMessageBusService no CartService
Critérios de Aceitação:
- WHEN o
CartServicefor instanciado THEN o sistema SHALL receberIMessageBusServicevia construtor e repassá-lo aoPublishRecommendationHistoryHandler - WHEN o chain de handlers for montado THEN o sistema SHALL inserir
PublishRecommendationHistoryHandlerimediatamente apósSaveCartHandler
Localização: Cart.API/Application/CartService.cs
Fora de Escopo
- Alterar outros endpoints do carrinho
- Alterar endpoints de recomendação (cobertos pelas tasks #196023–#196025)
- Retry ou DLQ para falhas de publicação na fila
Dependências
| Dependência | Descrição | Status |
|---|---|---|
| Task #196020 | CartRecommendationsEvent, QueueTypes.AWS_SQS_CART_RECOMMENDATION_HISTORY_FIFO | Pendente |
| Task #196021 | Serviço de histórico para consumir eventos | Pendente |
Arquivos alterados
| Arquivo | Projeto | Ação |
|---|---|---|
Commands/CreateCartCommand.cs | Cart.Domain | Adicionar Guid? RecommendationsId |
Interfaces/Repositories/IStoreRepository.cs | Cart.Domain | Adicionar GetCodeStoreById(int) |
Data/Repositories/StoreRepository.cs | Cart.Infrastructure | Implementar GetCodeStoreById |
Data/Repositories/Cached/CacheStoreRepositoryDecorator.cs | Cart.Infrastructure | Adicionar cache para GetCodeStoreById |
Handlers/CreateCart/PublishRecommendationHistoryHandler.cs | Cart.API | Novo |
Application/CartService.cs | Cart.API | Injetar IMessageBusService, adicionar handler no chain |