Task #194882 — Criar endpoint para Remover um item recomendado no pedido
Task pai: #194882 — [Back] 04 - Remover item recomendado Contexto: US 194871 — MVP Upsell (Pedido)
Status do refinamento: concluido Requisitos EARS: task-194882-remove-item-recomendado-requisitos.md Pesquisa tecnica: pesquisa-remove-recommended-item.md ADRs: ADR-005 · ADR-007 · ADR-008 · ADR-009
Resumo
Criar endpoint DELETE api/payment/v2/{id}/remove-recommended-item para permitir que a cliente, via zzlink, remova um item recomendado previamente adicionado ao pedido.
O handler orquestra: lock distribuído, validacao de status do payment (Created/CreateTransactionFail), validacao do payment e cart (store only, SaleEcommerce == false), validacao do item (existe no cart, FromRecommendation == true), chamada a Cart API para remover o item, atualizacao sincrona do Payment.Total, montagem do ResponseDTO e auditoria via alllogs.
Criar endpoint para Remover um item recomendado no pedido
Endpoint
DELETE api/payment/v2/{id}/remove-recommended-item
Authorization: Bearer {token PaymentsScheme}
O endpoint deve receber (path + body):
{id}— GUID do link de pagamento (path)cartItemId— ID do CartItem a remover (body)
Saida:
- 200 —
RemoveRecommendedItemResponseDTO:values— totais recalculadosproducts— lista atualizada deProduct(sem o item removido, cada item comcartItemIdefromRecommendation)paymentMethods— formas de pagamento com parcelas recalculadas para o novo totalrecommendations—RecommendationsInfoDTO?(wrapper comhoursToExpire+itemsfiltrados porCartItemId == null)
- 429:
- Pagamento em processamento (lock nao adquirido)
- 400:
- Payment nao encontrado
- Pagamento nao possui carrinho associado
- Status do payment invalido (nao
Created/CreateTransactionFail) - Operacao nao disponivel para este tipo de pedido (SaleEcommerce)
- Item nao encontrado no carrinho
- Item nao removivel (nao originado de recomendacao)
- Erro da Cart API (propagado) ou erro ao persistir Payment.Total
Fluxo do handler RemoveRecommendedItem
- Adquire lock distribuído (
rec-item:{PaymentGuid}, TTL 10s)- Lock não adquirido → 429
"Pagamento em processamento."
- Lock não adquirido → 429
- Busca payment pelo GUID
- Valida existencia → 400
"Payment não encontrado" - Valida
CartId > 0→ 400"Pagamento não possui carrinho associado" - Valida status (
Created/CreateTransactionFail) → log[Invalido]+ 400
- Valida existencia → 400
- Busca cart via
GetCartInfoAsync(cartId)- Valida
SaleEcommerce == false→ 400"Operação não disponível para este tipo de pedido"(defesa em profundidade com Cart API)
- Valida
- Localiza
CartItempelocartItemIdna coleçãocart.Items- Valida existencia → 400
"Item não encontrado no carrinho" - Valida
FromRecommendation == true→ 400"Item não removível"
- Valida existencia → 400
- Registra tentativa na alllogs (
Handle-RemoveRecommendedItem) - Chama Cart API —
DELETE api/cart/{cartId}/items/{cartItemId}viaCartIntegrationService.RemoveRecommendedItemAsync- Erros propagados via
ReturnErrors(cartResult.Errors)+ log detalhado - Cart API é idempotente (200 silencioso se cart/item nao existe); checkout ja validou existencia
- Erros propagados via
- Busca cart atualizado via
GetCartInfoAsynce atualizaPayment.Totalsincronamente- Log
"Valor do pedido mudou: {last} -> {new}"se diferente - Catch: log erro truncado 512 + 400
"Erro interno ao atualizar o pagamento"
- Log
- Monta e retorna
RemoveRecommendedItemResponseDTO:Values(updatedCart),products,paymentMethods,recommendations(viaBuildAvailableRecommendations)
- Libera lock no
finally
Dependencia — Cart API
O endpoint DELETE api/cart/{cartId}/items/{cartItemId} ja foi implementado na Task 194883:
- Auth:
[AllowAnonymous] + [UseApiKey("internal")] + [AddSchema] - Idempotente: cart/item nao encontrado → 200 silencioso
- Valida
SaleEcommerceeFromRecommendation(defesa em profundidade) - Aplica soft-delete via
RevertRecommendedItem(desvincula recomendacao + recalcula totais)
Dependencia — Flag FromRecommendation
A propriedade CartItemsModel.FromRecommendation ja existe na tabela CartItems (coluna "FromRecommendation"). Nao depende de US separada.
Arquivos desta pasta
| Arquivo | Descricao |
|---|---|
task-194882-remove-item-recomendado.md | Este arquivo — sumario, indice da task e fluxo do handler |
task-194882-remove-item-recomendado-requisitos.md | Documento de requisitos EARS (pt-BR): RFs, contrato do endpoint, dependencias |