Skip to main content

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:

  • 200RemoveRecommendedItemResponseDTO:
    • values — totais recalculados
    • products — lista atualizada de Product (sem o item removido, cada item com cartItemId e fromRecommendation)
    • paymentMethods — formas de pagamento com parcelas recalculadas para o novo total
    • recommendationsRecommendationsInfoDTO? (wrapper com hoursToExpire + items filtrados por CartItemId == 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

  1. Adquire lock distribuído (rec-item:{PaymentGuid}, TTL 10s)
    • Lock não adquirido → 429 "Pagamento em processamento."
  2. 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
  3. 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)
  4. Localiza CartItem pelo cartItemId na coleção cart.Items
    • Valida existencia → 400 "Item não encontrado no carrinho"
    • Valida FromRecommendation == true → 400 "Item não removível"
  5. Registra tentativa na alllogs (Handle-RemoveRecommendedItem)
  6. Chama Cart API — DELETE api/cart/{cartId}/items/{cartItemId} via CartIntegrationService.RemoveRecommendedItemAsync
    • Erros propagados via ReturnErrors(cartResult.Errors) + log detalhado
    • Cart API é idempotente (200 silencioso se cart/item nao existe); checkout ja validou existencia
  7. Busca cart atualizado via GetCartInfoAsync e atualiza Payment.Total sincronamente
    • Log "Valor do pedido mudou: {last} -> {new}" se diferente
    • Catch: log erro truncado 512 + 400 "Erro interno ao atualizar o pagamento"
  8. Monta e retorna RemoveRecommendedItemResponseDTO:
    • Values(updatedCart), products, paymentMethods, recommendations (via BuildAvailableRecommendations)
  9. 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 SaleEcommerce e FromRecommendation (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

ArquivoDescricao
task-194882-remove-item-recomendado.mdEste arquivo — sumario, indice da task e fluxo do handler
task-194882-remove-item-recomendado-requisitos.mdDocumento de requisitos EARS (pt-BR): RFs, contrato do endpoint, dependencias