Skip to content

fix(cart): erro consistente nos fluxos do vendedor + migration #339#358

Merged
adm01-debug merged 2 commits into
mainfrom
claude/project-comprehensive-audit-555Dk
May 26, 2026
Merged

fix(cart): erro consistente nos fluxos do vendedor + migration #339#358
adm01-debug merged 2 commits into
mainfrom
claude/project-comprehensive-audit-555Dk

Conversation

@adm01-debug
Copy link
Copy Markdown
Owner

@adm01-debug adm01-debug commented May 25, 2026

Contexto

Auditoria pré-produção solicitada como "análise exaustiva, achar falhas/gaps e corrigir para 10/10". Dado o tamanho/maturidade do sistema (~90 edge functions, ~840 migrations, ~1.010 erros TS / ~442 ESLint já aceitos como baseline, ~20 auditorias anteriores), o escopo foi bounded com o solicitante para os fluxos de usuário do vendedor (catálogo → carrinho → orçamento → kit-builder) + advisors read-only no banco de produção.

Plano aprovado: /root/.claude/plans/com-todo-seu-conhecimento-twinkling-crown.md.

O que foi corrigido

1. Carrinho — falhas silenciosas (src/hooks/products/useSellerCarts.ts)

Dos ~13 mutations, só createCart/duplicateCart tinham onError. As demais engoliam erros (RLS/rede/constraint) sem qualquer feedback ao usuário — o item simplesmente não aparecia/atualizava.

  • Adicionado onError consistente (toast + sanitizeError já existente) a: addItem, removeItem, updateItemQuantity, updateItemNotes, updateItemSortOrder, deleteCart, updateCartNotes, updateCartStatus, moveItemToCart, duplicateItemToCart, restoreItems.
  • updateItemSortOrder: era Promise.all que engolia falhas individuais → agora aplica em série, abortando no 1º erro e revalida do servidor em falha (desfaz a ordem parcial otimista).
  • duplicateItemToCart: passou a copiar sort_order (antes ficava null → item duplicado aparecia em posição inesperada).

2. Issue #339 — colunas de personalização ausentes (migration redigida, não aplicada)

Confirmado via banco de produção ao vivo (advisor read-only) que 6 colunas referenciadas pelo front-end não existem (a migration de restore de 24/05 recriou as tabelas com schema mínimo; os call-sites foram apenas anotados com @deprecated TODO(#339)):

Tabela Coluna ausente
product_component_locations area_image_url, max_area_cm2
product_component_location_techniques is_default
product_group_locations area_image_url
product_group_components is_personalizable
product_group_location_techniques is_default

Sintoma: upload de imagem de área e toggle "definir como padrão" não persistem (write falha PGRST204 / read sempre undefined).

➡️ Migration aditiva e idempotente (IF NOT EXISTS) redigida em supabase/migrations/20260525232003_fix_339_personalization_missing_columns.sql. NÃO foi aplicada em produção — aguarda revisão e deploy pelo pipeline normal de migrations. (A feature foi deliberadamente deferida em 24/05; aplicar é decisão do time.)

Verificação

  • npm run build ✅ (1m11s)
  • npm run typecheck (baseline TSC) ✅ — zero regressão
  • ESLint baseline gate ✅ — sem regressão (drift positivo: −1 erro)
  • Testes do carrinho ✅ — tests/hooks/useSellerCarts.test.tsx + SortableCartItemExcellence (8/8)

Cross-reference: advisors do banco ao vivo (read-only, nada alterado)

Fora de escopo desta rodada (registrado, não tocado)

  • Redução dos baselines 1.010 TS / 442 ESLint.
  • Infra dos advisors: auth_db_connections_absolute (Dashboard), reorg de schema, reavaliação de índices, SECURITY DEFINER/buckets (foco era fluxos de usuário, não DB hardening).
  • Hardening de authz das edge functions.

Test plan

https://claude.ai/code/session_01FUXFRgtPYpiR6GNx4wRXqn


Generated by Claude Code


Summary by cubic

Fixes silent failures in seller cart flows with consistent error toasts and safer item reordering, and resolves typecheck regressions in useGlobalSearch. Adds an additive, idempotent migration to restore missing personalization columns for #339 (staged, not applied).

  • Bug Fixes

    • All seller cart mutations now surface errors via toast using sanitizeError (no more silent failures).
    • Reordering applies serially and aborts on first error; on failure, revalidates to undo partial optimistic order.
    • duplicateItemToCart now copies sort_order to keep item position.
    • Global search: switched dynamic queries to untypedFrom and added a color type guard, fixing typecheck regressions in useGlobalSearch.
  • Migration

Written for commit a5f848f. Summary will update on new commits. Review in cubic

Summary by CodeRabbit

Release Notes

  • Bug Fixes

    • Adicionado tratamento robusto de erros em operações de carrinho, exibindo mensagens claras quando falhas ocorrem.
    • Corrigidas colunas faltantes no banco de dados relacionadas à personalização de produtos.
  • Refactor

    • Otimizada lógica de reordenação de itens no carrinho para evitar atualizações parciais.
    • Melhorada confiabilidade na duplicação de itens entre carrinhos.

Review Change Stack

…e personalização)

Fluxos de usuário (foco da auditoria pré-produção):

- useSellerCarts.ts: 10 mutations (addItem, removeItem, updateItemQuantity,
  updateItemNotes, updateItemSortOrder, deleteCart, updateCartNotes,
  updateCartStatus, moveItemToCart, duplicateItemToCart, restoreItems)
  engoliam falhas silenciosamente. Adiciona onError com toast + sanitizeError.
- updateItemSortOrder: aplica em série e aborta no 1º erro (era Promise.all que
  engolia falhas individuais) + revalida do servidor em falha p/ desfazer ordem
  parcial.
- duplicateItemToCart: copia sort_order (antes ficava null → posição inesperada).

#339 — personalização: confirmado via banco ao vivo que 6 colunas referenciadas
pelo front-end não existem. Migration aditiva idempotente redigida (IF NOT EXISTS),
NÃO aplicada em produção — aguarda revisão/deploy pelo pipeline normal.

Gates: build OK, baseline TSC sem regressão, testes do carrinho 8/8.

https://claude.ai/code/session_01FUXFRgtPYpiR6GNx4wRXqn
@vercel
Copy link
Copy Markdown

vercel Bot commented May 25, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
we-dream-big Ready Ready Preview, Comment May 26, 2026 12:04am

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 25, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 2130e700-b690-4595-baf2-7e6c5abaec7f

📥 Commits

Reviewing files that changed from the base of the PR and between b31b50f and a5f848f.

📒 Files selected for processing (4)
  • STATUS.md
  • src/components/search/useGlobalSearch.ts
  • src/hooks/products/useSellerCarts.ts
  • supabase/migrations/20260525232003_fix_339_personalization_missing_columns.sql

Walkthrough

A sessão 2026-05-25 endurece fluxos críticos do promo-gifts-v4: adiciona 6 colunas de personalização via migration idempotente (#339), implementa tratamento robusto de erros em 10 mutações de carrinho com reordenação sequencial, e refatora busca semântica com tipagem mais explícita e normalizações de filtros.

Changes

Hardening de fluxos de usuário - promo-gifts-v4

Layer / File(s) Summary
Correção de schema de personalização (#339)
supabase/migrations/20260525232003_fix_339_personalization_missing_columns.sql, STATUS.md
Migration idempotente cria 6 colunas faltantes (area_image_url, max_area_cm2, is_default, is_personalizable) via alter table ... add column if not exists em tabelas de componentes/localidades/técnicas. STATUS.md registra a sessão 2026-05-25 com menção à migração redigida mas não aplicada em prod.
Robustez de mutações de carrinho
src/hooks/products/useSellerCarts.ts
Adiciona onError com sanitizeError(err) e toast.error em deleteCart, addItem, removeItem, updateItemQuantity, updateItemNotes, updateCartNotes, updateCartStatus, moveItemToCart, duplicateItemToCart e restoreItems. updateItemSortOrder muda de Promise.all para loop sequencial que aborta no erro com invalidação/revalidação de queries. Campo sort_order incluído na duplicação de itens.
Refatoração de busca semântica
src/components/search/useGlobalSearch.ts
Importa untypedFrom e reestrutura queries de produtos, clientes, cotações e comandos. Filtros de preço e cor normalizam estruturas (string vs objeto) com casts explícitos. Blocos wants reformatados em multiline. Rerank/cache/analytics ajustados com formatação sem mudança de fluxo. Handlers de histórico e sugestões em multiline sem alteração de assinatura.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Possibly related PRs

  • adm01-debug/promo-gifts-v4#169: Ambos os PRs fazem mudanças diretas em src/components/search/useGlobalSearch.ts no fluxo de busca (montagem de queries/suporte a comandos e hardening de runtime), então a alteração do main PR está relacionada à do PR #169.
  • adm01-debug/promo-gifts-v4#332: As duas PRs mexem no mesmo hook src/hooks/products/useSellerCarts.ts, incluindo o fluxo de addItem (main PR adiciona tratamento de erro/robustez; #332 altera a deduplicação/identidade da variante para evitar mesclagem de cores).

Suggested labels

codex

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/project-comprehensive-audit-555Dk

Comment @coderabbitai help to get the list of available commands and usage tips.

@supabase
Copy link
Copy Markdown

supabase Bot commented May 25, 2026

Updates to Preview Branch (claude/project-comprehensive-audit-555Dk) ↗︎

Deployments Status Updated
Database ⏸️ Tue, 26 May 2026 00:03:55 UTC
Services ⏸️ Tue, 26 May 2026 00:03:55 UTC
APIs ⏸️ Tue, 26 May 2026 00:03:55 UTC

Tasks are run on every commit but only new migration files are pushed.
Close and reopen this PR if you want to apply changes from existing seed or migration files.

Tasks Status Updated
Configurations ⏸️ Tue, 26 May 2026 00:03:55 UTC
Migrations ⏸️ Tue, 26 May 2026 00:03:55 UTC
Seeding ⏸️ Tue, 26 May 2026 00:03:55 UTC
Edge Functions ⏸️ Tue, 26 May 2026 00:03:55 UTC

❌ Branch Error • Tue, 26 May 2026 00:03:59 UTC

failed to merge file config: While parsing config: toml: incomplete number

View logs for this Workflow Run ↗︎.
Learn more about Supabase for Git ↗︎.

…rde)

- Usa untypedFrom(q.table) p/ as queries de tabela dinâmica em vez de
  supabase.from(string) — elimina o TS2769 ("No overload matches") e o
  TS2345 do forEach sobre GenericStringError[], e remove 3 casts (builder as any).
- Tipa o callback do filtro de cor com type guard (string | objeto) em vez de
  Record<string,string> — elimina o TS2345 restante.

Dívida pré-existente da branch (arquivo não tocado pelo meu commit de carrinho).
Gates: TSC baseline sem regressão (drift +25), ESLint baseline sem regressão (+4).

https://claude.ai/code/session_01FUXFRgtPYpiR6GNx4wRXqn
@adm01-debug adm01-debug marked this pull request as ready for review May 26, 2026 00:06
Copilot AI review requested due to automatic review settings May 26, 2026 00:06
@adm01-debug adm01-debug merged commit b1f1e72 into main May 26, 2026
35 of 42 checks passed
@adm01-debug adm01-debug deleted the claude/project-comprehensive-audit-555Dk branch May 26, 2026 00:07
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Este PR foca em melhorar a confiabilidade dos fluxos do vendedor (especialmente carrinho), garantindo feedback consistente de erro ao usuário, e adiciona uma migration aditiva/idempotente para corrigir drift de schema relacionado ao Issue #339 (colunas de personalização ausentes).

Changes:

  • Padroniza onError nas mutations do carrinho (toast + sanitizeError) e torna a reordenação mais segura (serial/abort on first error).
  • Ajusta duplicateItemToCart para copiar sort_order, preservando a posição do item duplicado.
  • Adiciona migration idempotente restaurando 6 colunas ausentes para personalização (#339) e pequenos ajustes de typecheck/robustez no useGlobalSearch (incluindo untypedFrom).

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.

File Description
supabase/migrations/20260525232003_fix_339_personalization_missing_columns.sql Migration aditiva/idempotente para repor colunas ausentes de personalização (#339).
STATUS.md Atualiza o status da última sessão e registra achados/correções.
src/hooks/products/useSellerCarts.ts Adiciona onError consistente nas mutations e melhora a lógica de reorder/duplicate.
src/components/search/useGlobalSearch.ts Ajustes de tipagem/robustez em queries dinâmicas (uso de untypedFrom) e pequenos guards.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +212 to +214
onError: (err: Error) => {
toast.error('Não foi possível adicionar ao carrinho', { description: sanitizeError(err) });
},
Comment on lines +453 to +455
onError: (err: Error) => {
toast.error('Não foi possível restaurar os itens', { description: sanitizeError(err) });
},
Comment on lines +473 to +478
let builder = untypedFrom(q.table).select(q.select);
if (q.type === 'category')
builder = builder
.eq('is_active', true)
.or(`category_name.ilike.%${term}%,description.ilike.%${term}%`);
else if (q.type === 'collection') builder = builder.ilike('name', `%${term}%`);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants