Unir carrinhos e comprar de novo
Passa o carrinho do visitante para a conta depois do login e copia os itens de um pedido antigo para o carrinho.
Estas duas rotas só funcionam para cliente logado e movem itens para o carrinho da conta. A primeira resolve o caso do visitante que montou um carrinho e depois entrou; a segunda é o botão "Comprar de novo" da tela de pedidos.
Unir o carrinho do visitante ao da conta
Quando alguém monta um carrinho sem estar logado e depois faz login ou cria a conta, existem dois carrinhos: o do visitante (X-Session-ID) e o da conta. Chame esta rota logo depois do login, uma vez, para juntá-los. O carrinho do visitante é apagado no fim.
Regras da união:
- Linhas iguais (mesmo produto, variação, opções, observação e origem de estoque) têm as quantidades somadas.
- A quantidade somada respeita o estoque. Uma linha do visitante sem estoque disponível é descartada, sem erro.
- Os cupons do carrinho da conta são mantidos; se a conta não tem cupom, entram os do visitante.
- Se o visitante não tem carrinho (ou ele está vazio), a rota só devolve o carrinho da conta.
/api/v1/storefront/cart/mergeClienteMescla o carrinho do visitante ao carrinho da conta
Cabeçalhos
AuthorizationstringobrigatórioBearer <token> do cliente logado.X-Session-IDstringobrigatórioguest_session_id. É a prova de que quem chama possui o carrinho de visitante: sem o cabeçalho igual ao corpo, a resposta é 404 guest cart not found.Corpo da requisição
guest_session_idstringobrigatórioX-Session-ID que o visitante usava antes do login.Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/storefront/cart/merge" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Session-ID: $SESSION_ID" \
-H "Content-Type: application/json" \
-d '{
"guest_session_id": "6f1c3c0e-8f5b-4c3e-9d6a-2b7d0e0f1a11"
}'Resposta
{
"id": "5a3f7b0e-1c2d-4e8f-9a6b-7d1c0e2f3a44",
"user_id": "f12f30a9-cbec-40ba-98f1-b7fa8f2e8e10",
"items": [
{
"line_id": "64ddde83-28ce-4bba-86e5-ba9ebf1ba500",
"product_id": "c3f92551-9dda-4fc7-b518-353d1c4e4035",
"name": "Notebook Slim Rosa 02373",
"unit_price": 11500,
"quantity": 3,
"total": 34500
}
],
"subtotal": 34500,
"total": 34500,
"currency": "BRL"
}A resposta é o carrinho da conta, no mesmo formato de Ler o carrinho.
Comprar de novo um pedido
Copia para o carrinho da conta os itens de um pedido anterior do mesmo cliente. Cada item é validado como se fosse adicionado agora: o preço é o de hoje, não o que foi pago na época, e itens que saíram de linha ou estão sem estoque não entram. A resposta separa o que entrou do que ficou de fora.
/api/v1/storefront/cart/reorder/{orderId}ClienteCopia os itens de um pedido anterior para o carrinho
Parâmetros de caminho
orderIduuidobrigatórioCabeçalhos
AuthorizationstringobrigatórioBearer <token> do cliente logado.curl -X POST "$BASE_URL/api/v1/storefront/cart/reorder/a8a3c7a3-5f15-45a8-a385-4f20fbf8b722" \
-H "Authorization: Bearer $TOKEN"{
"added": [
{
"line_id": "e0a45a70-6e1c-4a2b-8f55-1f6a7d3c9b22",
"product_id": "2a6541bf-d5b0-4a2e-ad7b-1183af189d42",
"name": "Cafeteira Moderno Branco 01426",
"unit_price": 80990,
"quantity": 1,
"total": 80990
}
],
"failed": [
{
"product_id": "00000000-0000-0000-0000-000000000000",
"reason": "product not found or inactive: 00000000-0000-0000-0000-000000000000"
}
],
"cart": { "id": "5a3f7b0e-1c2d-4e8f-9a6b-7d1c0e2f3a44", "subtotal": 80990, "total": 80990 }
}O formato é o de POST /cart/bulk, descrito em Adicionar itens: added, failed (cada um com product_id e reason) e cart.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | guest_session_id ausente (merge) | {"error":"guest_session_id is required"} |
| 400 | Corpo que não é JSON (merge) | {"error":"invalid request body"} |
| 400 | orderId que não é UUID (reorder) | {"error":"invalid orderId","detail":"orderId must be a valid UUID"} |
| 401 | Sem token | {"error":"missing authorization header"} |
| 401 | Token inválido ou expirado | {"error":"invalid or expired token"} |
| 403 | Chave de API sem o escopo customer:write (um token de login não passa por essa checagem) | {"error":"missing_scope","required":"customer:write"} |
| 404 | O X-Session-ID está ausente ou é diferente de guest_session_id (merge) | {"error":"guest cart not found"} |
| 404 | O pedido não existe (reorder) | {"error":"order not found","detail":"order not found: ..."} |
| 500 | Falha ao unir carrinhos, ou pedido que pertence a outro cliente (reorder) | {"error":"failed to reorder","detail":"order does not belong to user"} |