Documento de Requisitos — Criar tabela para armazenar histórico
Tarefa: #196018 Contexto: Sequência de implementação #1
Visão Geral
Criar a tabela CartRecommendationsHistory no banco DbCoreOrg para servir como repositório central do histórico de eventos de upsell, correlacionados por RecommendationsId.
Papéis Envolvidos
| Papel | Responsabilidade |
|---|---|
| Desenvolvedor Back-end | Criar Model, Mapping, Migration e schema da tabela |
Requisitos Funcionais
RF-01 — Estrutura da tabela CartRecommendationsHistory
História de Usuário: Como desenvolvedor, quero uma tabela para persistir os eventos do fluxo de upsell para que possam ser consultados e correlacionados posteriormente.
Critérios de Aceitação:
- WHEN a migration for aplicada THEN o sistema SHALL criar a tabela
CartRecommendationsHistoryno DbCoreOrg - WHEN a migration for revertida (down) THEN o sistema SHALL remover a tabela
- WHEN um registro for inserido THEN o sistema SHALL persistir todas as colunas do schema
Model e Mapping:
- Localização:
Core.OrgDB/Entities/CartRecommendationsHistoryModel.cseCore.OrgDB/Data/Mappings/CartRecommendationsHistoryMapping.cs - Deve herdar de
BaseEntitye implementarIAggregateRoot
Schema:
| Coluna | Tipo | Null | Descrição |
|---|---|---|---|
Id | int PK IDENTITY | NOT NULL | Herdado de BaseEntity |
DateCreated | DateTime | NOT NULL | Herdado de BaseEntity |
DateDeleted | DateTime? | NULL | Herdado de BaseEntity |
DateUpdated | DateTime? | NULL | Herdado de BaseEntity |
RecommendationsId | uniqueidentifier | NOT NULL | UUID gerado pelo BFF; correlaciona todos os eventos de uma mesma venda |
EventType | nvarchar(100) | NOT NULL | Tipo de evento que gerou o registro |
CartId | int | NULL | Id do carrinho/zzlink. Nulo no evento RecommendationRequested |
CustomerId | int | NOT NULL | Id do cliente |
CodeStore | string | NOT NULL | Código da loja |
Url | string | NULL | Endpoint da integração externa chamada, se houver |
Request | json | NULL | Payload usado na integração |
Response | json | NULL | Payload retornado pela integração |
StatusCode | int? | NULL | HTTP Status Code retornado pela integração externa |
DurationMs | long? | NULL | Tempo total do request em milissegundos |
Message | string | NULL | Observação opcional |
Eventos (escopo desta entrega):
| Evento | Descrição |
|---|---|
RecommendationRequested | Requisição de recomendação recebida pelo BFF |
RecommendationCartCreated | Carrinho criado a partir de recomendação |
RecommendationProductAddedToOrder | Produto recomendado adicionado ao pedido |
RecommendationProductRemovedToOrder | Produto recomendado removido do pedido |
Casos de Borda:
CartIdé nulo apenas paraRecommendationRequested— o cart ainda não foi criado neste momentoStatusCode,UrleDurationMssão nulos para eventos sem chamada a integração externa- Colunas de
BaseEntitymantidas no schema por padrão;DateDeletedeDateUpdatednão são populadas por se tratar de tabela append-only
RF-02 — Indexação
Critérios de Aceitação:
- WHEN a migration for aplicada THEN o sistema SHALL criar índice em
RecommendationsId - WHEN a migration for aplicada THEN o sistema SHALL criar índice em
CartId
RF-03 — Criação do Model e Mapping
Critérios de Aceitação:
- WHEN o Model for criado THEN o sistema SHALL herdar de
BaseEntitycom construtor vazio para EF - WHEN o Model for criado THEN o sistema SHALL implementar
IAggregateRoot - WHEN o Mapping for criado THEN o sistema SHALL registrar a tabela como
CartRecommendationsHistory
Fora de Escopo
- Indexação em
CustomerId,EventType,DateCreatedou outros campos - Limpeza/expurgo de dados antigos
- Constraints de FK para
CartId - Evento
RecommendationPDPViewed(será tratado em entrega futura)
Dependências
| Dependência | Descrição | Status |
|---|---|---|
| DbCoreOrg | Banco de dados existente | Disponível |
Coezzion.Common NuGet | BaseEntity, IAggregateRoot | Disponível |