feat(catalog): exibir categoria-folha (filha/neta) no produto#539
Conversation
Auditoria completa do banco oficial (doufsxqlfjyuvxuezpln): 299 tabelas, 119 views, 295 FKs, 767 RLS policies (0 tabelas sem RLS), 800 funções. Mapeia 644 chamadas .from() (125 tabelas), 34 RPCs (todos existem) e a arquitetura multi-banco (interno + catálogo/CRM via external-db-bridge). - Novo relatório: docs/AUDITORIA_DB_FRONTEND_2026-05-31.md (classificação das 299 tabelas, gaps P0/P1/P2, diagrama ER). - Fix P0: usePrintAreas.useTechniques() consultava 'tecnica_gravacao' (inexistente no banco) -> corrigido para 'tecnicas_gravacao' (tabela real). - Marca docs/AUDIT_FRONTEND_DATABASE.md como superseded (apontava p/ projeto antigo nmojwpihnslkssljowjh). https://claude.ai/code/session_019e55kaN6FDxXsz88gw751L
… e detalhe Antes, o produto exibia frequentemente a categoria raiz ou intermediária (57% dos produtos têm main_category_id em nó não-folha; 821 na própria raiz). Agora resolve a categoria-FOLHA — a mais específica em que o produto se encaixa (filha/neta/bisneta…) — a partir de product_category_assignments. Como funciona: - useProductLeafCategories: hook + provider que resolve as folhas em LOTE (1 query batch nos assignments + 1 nas categorias, sem N+1), via PostgREST nativo no banco doufsxqlfjyuvxuezpln (external-db-bridge descontinuado). - Desempate determinístico quando há ≥2 categorias no nível máximo (686 produtos): maior level → is_primary → display_order → nome. - Monta o caminho raiz→folha em memória (subindo por parent_id, com guarda anti-ciclo) para o tooltip do badge. - ProductCard e ProductDetailHero passam a folha + caminho ao ProductCategoryBadges, que exibe a folha no badge e o caminho completo no tooltip. - Fallback suave: em erro/RLS, mantém o comportamento atual (category_id || main_category_id), sem quebrar a listagem. Validado contra dados reais: "Caderneta percalux" passa de "Cadernetas | Cadernos | Blocos" (nível 2) para "Com Pauta" (nível 6), tooltip com o caminho de 6 níveis. Testes: pickLeaves/buildPath (8) + ProductCategoryBadges (caminho no tooltip e deep-link na folha). Acesso via untypedFrom (tabelas fora do types.ts) + allowlist do lint-untyped-from atualizada. https://claude.ai/code/session_019e55kaN6FDxXsz88gw751L
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (11)
WalkthroughPR integra novo relatório de auditoria DB-Frontend (2026-05-31) documentando acoplamento front-end com banco de dados, corrige query de tabela de técnicas de gravação identificada como erro crítico, e implementa resolução em lote de categorias mais específicas ("folha") para produtos via novo hook com React Context e caching via React Query. ChangesAuditoria DB-Frontend e Correções Identificadas
Resolução de Categorias Folha para Produtos
Sequence Diagram(s)sequenceDiagram
participant CatalogContent as CatalogContent
participant ProductLeafCategoryProvider as ProductLeafCategoryProvider
participant useProductLeafCategories as useProductLeafCategories Hook
participant ReactQuery as React Query
participant PostgREST as PostgREST
participant ProductCard as ProductCard
participant ProductCategoryBadges as ProductCategoryBadges
CatalogContent->>ProductLeafCategoryProvider: Wraps with productIds
ProductLeafCategoryProvider->>useProductLeafCategories: Initialize with productIds
useProductLeafCategories->>ReactQuery: queryKey = sorted unique IDs
ReactQuery->>PostgREST: fetchLeaves() - assignments chunk
PostgREST-->>ReactQuery: product_category_assignments batch
ReactQuery->>PostgREST: Wave 1: category metadata
PostgREST-->>ReactQuery: catById entries
ReactQuery->>PostgREST: Wave 2: ancestors (parent_id traversal)
PostgREST-->>ReactQuery: ancestor metadata
ReactQuery-->>useProductLeafCategories: pickLeaves() - category_leaf Map
useProductLeafCategories-->>ProductLeafCategoryProvider: leafById + isLoading
ProductLeafCategoryProvider->>ProductCard: Provide LeafCategoryCtx
ProductCard->>ProductCard: useLeafCategory(product.id)
ProductCard->>ProductCategoryBadges: Pass id/name/path/categoryUuid
ProductCategoryBadges->>ProductCategoryBadges: Render with categoryPath tooltip
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Rationale: PR combina múltiplos tipos de mudanças (documentação de auditoria + bug fix simples + nova feature de hook/provider de categorias) com cobertura diversa (hook puro com lógica de desempate determinística, React Query, contexto, testes, integrações em 4+ componentes). A lógica de Possibly related PRs
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
|
This pull request has been ignored for the connected project Preview Branches by Supabase. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
There was a problem hiding this comment.
Pull request overview
Adds a leaf-category resolver so product cards and the product detail page display the most specific (leaf) category from product_category_assignments (with a root→leaf tooltip and a deep-link to the leaf), instead of the often shallow category_id/main_category_id. Also fixes a broken tecnica_gravacao → tecnicas_gravacao table name in usePrintAreas.
Changes:
- New
useProductLeafCategorieshook +ProductLeafCategoryProviderthat batch-fetches assignments and category metadata via PostgREST (chunked, with deterministic tie-break: level → is_primary → display_order → name) and builds a root→leaf path via parent walk with cycle guard. - Wire the provider into
CatalogContentand consume the leaf inProductCard,ProductDetailHero, andProductCategoryBadges(which now renders the path in the tooltip and uses the leaf id for the filter deep-link). Includes unit tests forpickLeavesand the badge. - Allowlist
categories/product_category_assignmentsinscripts/lint-untyped-from.sh; fixuseTechniques()to query the real tabletecnicas_gravacao; add audit docs.
Reviewed changes
Copilot reviewed 11 out of 11 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| src/hooks/products/useProductLeafCategories.tsx | New batch hook + provider + pickLeaves/buildPath logic. |
| src/hooks/products/tests/useProductLeafCategories.test.ts | Unit tests for leaf selection, tie-break and path. |
| src/components/products/ProductCategoryBadges.tsx | Renders root→leaf path in tooltip; uses leaf id in deep-link. |
| src/components/products/ProductCategoryBadges.test.tsx | Tests for tooltip path and leaf-uuid deep-link. |
| src/components/products/ProductCard.tsx | Consumes useLeafCategory from provider; passes leaf to badges. |
| src/pages/products/product-detail/ProductDetailHero.tsx | Resolves the leaf for the single product on detail page. |
| src/components/catalog/CatalogContent.tsx | Wraps grid/list/table in ProductLeafCategoryProvider. |
| src/hooks/simulation/usePrintAreas.ts | Fixes table name tecnica_gravacao → tecnicas_gravacao. |
| scripts/lint-untyped-from.sh | Adds categories, product_category_assignments to allowlist. |
| docs/AUDITORIA_DB_FRONTEND_2026-05-31.md, docs/AUDIT_FRONTEND_DATABASE.md | New audit doc + supersede note on old doc. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Objetivo
Exibir no produto a categoria-FOLHA — a última/mais específica em que ele se encaixa (filha, neta, bisneta…) — no card do catálogo e na página de detalhe. Antes, o produto mostrava frequentemente a categoria raiz ou intermediária.
Diagnóstico (centenas de simulações SQL no banco oficial
doufsxqlfjyuvxuezpln)main_category_idem nó não-folha; 821 na própria raiz.level; em 227 produtos ela não descende damain_category_id, então não basta "descer a árvore" — usa-se os assignments.Como funciona
useProductLeafCategories(hook + provider): resolve as folhas em lote — 1 query nosproduct_category_assignments+ 1 nascategories(sem N+1), via PostgREST nativo nodoufsxqlfjyuvxuezpln(oexternal-db-bridge/EXTERNAL_PROMOBRIND_URLfoi descontinuado).level DESC → is_primary → display_order → nome.parent_id, com guarda anti-ciclo) para o tooltip.ProductCardeProductDetailHeropassam folha + caminho aoProductCategoryBadges, que mostra a folha no badge e o caminho completo no tooltip; o deep-link/filtrosusa a folha.category_id || main_category_id— sem quebrar a listagem.Decisões (confirmadas com o usuário)
Mudanças
src/hooks/products/useProductLeafCategories.tsx(hook + provider + lógicapickLeaves/buildPath).pickLeaves/buildPath(8) +ProductCategoryBadges(caminho no tooltip, deep-link na folha).ProductCard.tsx,ProductDetailHero.tsx,ProductCategoryBadges.tsx,CatalogContent.tsx(provider).scripts/lint-untyped-from.sh: allowlist +=categories,product_category_assignments(existem no banco, ausentes dotypes.ts).Verificação
typecheckbaseline: as 6 regressões reportadas já existem em HEAD (provado com mudanças stashed) — este PR é TS-neutro.lint:baselineelint-untyped-from: sem regressões.https://claude.ai/code/session_019e55kaN6FDxXsz88gw751L
Generated by Claude Code
Summary by cubic
Mostra a categoria-folha (mais específica) do produto no card do catálogo e na página de detalhe, com tooltip do caminho completo e deep-link filtrando pela folha. Resolve em lote via PostgREST, sem N+1, e mantém fallback seguro.
New Features
useProductLeafCategorieseProductLeafCategoryProviderpara buscar folhas em lote deproduct_category_assignmentsecategories, com desempate determinístico (level → is_primary → display_order → nome) e caminho raiz→folha em memória.CatalogContent,ProductCardeProductDetailHero;ProductCategoryBadgesexibe a folha e o caminho no tooltip; o link de filtro usa o ID da folha.scripts/lint-untyped-from.shcomcategorieseproduct_category_assignments.Bug Fixes
usePrintAreaspara consultartecnicas_gravacao(nome real da tabela) em vez detecnica_gravacao.Written for commit e4d0c2e. Summary will update on new commits.
Summary by CodeRabbit
New Features
Bug Fixes
Documentation
Tests