Documento de Requisitos — Criar fila para centralizar a gravação do histórico
Tarefa: #196020 Contexto: Sequência de implementação #2
Visão Geral
Criar a fila SQS FIFO AWS_SQS_CART_RECOMMENDATION_HISTORY_FIFO no Message BUS e o evento CartRecommendationsEvent para transportar eventos de histórico de upsell ao serviço de registro.
Papéis Envolvidos
| Papel | Responsabilidade |
|---|---|
| Desenvolvedor Back-end | Criar fila (QueueType + StructureStack) e evento no submódulo Message BUS |
Requisitos Funcionais
RF-01 — Constante da fila no QueueTypes
História de Usuário: Como sistema, quero uma constante nomeada para identificar a fila, seguindo a convenção do Message BUS.
Critérios de Aceitação:
- WHEN a constante for declarada THEN o sistema SHALL usar o nome
AWS_SQS_CART_RECOMMENDATION_HISTORY_FIFO_XXX - WHEN a constante for declarada THEN o sistema SHALL posicioná-la em
Coezzion.MessageBus.QueueTypes(submódulocoezzion-submodule-message-bus), após a constanteAWS_SQS_LOG_QUEUE_EVENTS_FIFO - IF o nome contiver
_FIFO_THEN o sistema SHALL tratar a fila como FIFO (criação com.fifoe validação noSendFifoAsync)
RF-02 — Entrada no StructureStack
História de Usuário: Como sistema, quero que a fila seja criada automaticamente pelo CreateEnvironmentScaffold em cada ambiente (DEV/QA/PRD), com configurações análogas ao AllLogs.
Critérios de Aceitação:
- WHEN o
CreateEnvironmentScaffoldprocessar oStructureStack.ListTHEN o sistema SHALL criar a fila comVisibilityTimeout = "600"segundos - WHEN a fila for criada THEN o sistema SHALL usar o valor default do SQS para retenção de mensagens (4 dias)
- WHEN a fila for criada THEN o sistema SHALL não associar DLQ (fora de escopo)
- WHEN a entrada for declarada THEN o sistema SHALL posicioná-la após a entrada
AWS_SQS_LOG_QUEUE_EVENTS_FIFO
RF-03 — Evento CartRecommendationsEvent
História de Usuário: Como producer (BFF + API Cart) e consumer (serviço de histórico), quero um contrato compartilhado para serialização e desserialização dos eventos de histórico.
Critérios de Aceitação:
- WHEN a classe for declarada THEN o sistema SHALL estender
TenancyEvent(herdaIdEvent,Timestamp,EventNamedeEventeSchemaNamedeTenancyEvent) - WHEN a classe for declarada THEN o sistema SHALL conter os campos:
RecommendationsId(Guid),EventType(string),CartId(int?),CustomerId(int),CodeStore(string),Url(string?),Request(string?),Response(string?),StatusCode(int?),DurationMs(long?),Message(string?) - WHEN a classe for declarada THEN o sistema SHALL não conter campo
createdAt— usarTimestampherdado deEvent - WHEN a classe for declarada THEN o sistema SHALL fornecer 5 factory methods estáticos:
RecommendationRequested(Guid recommendationsId, int customerId, string codeStore, ...)→EventType = "RecommendationRequested",CartId = nullRecommendationCartCreated(Guid recommendationsId, int cartId, int customerId, string codeStore, ...)→EventType = "RecommendationCartCreated"RecommendationProductAddedToOrder(Guid recommendationsId, int cartId, int customerId, string codeStore, ...)→EventType = "RecommendationProductAddedToOrder"RecommendationProductRemovedToOrder(Guid recommendationsId, int cartId, int customerId, string codeStore, ...)→EventType = "RecommendationProductRemovedToOrder"Create(Guid recommendationsId, string eventType, int? cartId, int customerId, string codeStore, ...)→EventTypelivre (para extensibilidade futura)
- WHEN a classe for declarada THEN o sistema SHALL usar
initaccessors (consistente comLogoutUserEvente demais eventos do submódulo) - WHEN a classe for declarada THEN o sistema SHALL residir em
Coezzion.MessageBus/Events/CartRecommendationsEvent.cs
RF-04 — Estratégia de ordenação e deduplicação
História de Usuário: Como sistema, quero que a fila replique o comportamento consolidado do AllLogs (AWS_SQS_LOG_QUEUE_EVENTS_FIFO).
Critérios de Aceitação:
- WHEN uma mensagem for publicada via
SendFifoAsyncTHEN o sistema SHALL usarMessageGroupId = Guid.NewGuid()por mensagem (padrão do submódulo, sem ordenação entre mensagens do mesmoRecommendationsId) - WHEN uma mensagem for publicada THEN o sistema SHALL não setar
MessageDeduplicationId— deduplicação fica na camada de aplicação do consumer - WHEN a fila for criada THEN o sistema SHALL não habilitar
ContentBasedDeduplication
Justificativa: O Timestamp do evento (populado no publish, via Event.Timestamp) garante a fidelidade temporal no registro. A tabela CartRecommendationsHistory é append-only e não possui dependências entre linhas que exijam processamento sequencial.
Requisitos Não-Funcionais
- Performance: Publicação fire-and-forget — falha no publish não deve impactar a resposta ao cliente
- Convenção: Seguir nomenclatura e padrões existentes do submódulo Message BUS (análogo ao
AWS_SQS_LOG_QUEUE_EVENTS_FIFO)
Fora de Escopo
- DLQ (Dead Letter Queue) — será tratado em task separada se necessário
- Monitoramento e alarmes
- Alterações em
IMessageBusServiceouMessageBusService— sem overloads novos - Enum
CartRecommendationsEventType—EventTypeéstringlivre
Dependências
| Dependência | Descrição | Status |
|---|---|---|
| Message BUS (submódulo) | Infraestrutura de mensageria coezzion-submodule-message-bus | Disponível |
| Task #196018 | Tabela CartRecommendationsHistory deve existir antes do consumo | Pendente |
Referências
| Artefato | Descrição |
|---|---|
| ADR-011 — Deduplicação e ordering | Decisão de arquitetura sobre estratégia de dedup/ordering |
| Pesquisa: padrão FIFO AllLogs | Análise do comportamento análogo no LogQueueConsumerService |
| Task #01 — Tabela de histórico | Schema da tabela e eventos suportados |
| Pre-refinamento | Definição original da fila e schema do evento |
Arquivos alterados
| Arquivo | Submódulo | Ação |
|---|---|---|
QueueType.cs | coezzion-submodule-message-bus | Adicionar constante AWS_SQS_CART_RECOMMENDATION_HISTORY_FIFO |
QueueType.cs | coezzion-submodule-message-bus | Adicionar Structure com visibilityTimeout = "600" |
CartRecommendationsEvent.cs | coezzion-submodule-message-bus | Novo arquivo — classe CartRecommendationsEvent : TenancyEvent |