Catalogo - Operacao
O catalogo concentra os produtos operados pela loja.
Nota de referência para contratos, arquitetura, runbook e organização do workspace. É a camada mais estável da documentação.
Papel do modulo
O catalogo concentra os produtos operados pela loja.
Nesta primeira fase, ele cobre:
- cadastro e edicao de produto no
EcommPanel; - cadastro e edicao de categorias e colecoes no
EcommPanel; - leitura publica para PLP e PDP;
- organizacao do dominio em produto, categoria e colecao;
- preco, disponibilidade e estoque expandido;
- campos centrais tipados com area de extensao opcional;
- migracao gradual entre arquivo e banco.
Rotas principais
Painel
/ecommpanel/admin/catalog/api/ecommpanel/catalog/products/api/ecommpanel/catalog/products/[productId]/api/ecommpanel/catalog/categories/api/ecommpanel/catalog/categories/[categoryId]/api/ecommpanel/catalog/collections/api/ecommpanel/catalog/collections/[collectionId]
Storefront e API publica
/api/v1/catalog/products/api/v1/catalog/products/[slug]/api/v1/catalog/categories
O storefront agora pode usar a propria API interna como fonte principal do catalogo.
Modos de persistencia
Variavel:
ECOM_CATALOG_PERSISTENCE_MODE=hybridModos:
files: usa apenas os arquivos administrativos do catalogo;hybrid: prefere PostgreSQL e usa arquivos como fallback e semente;database: usa apenas PostgreSQL e ignora os arquivos como fonte de runtime.
Sandbox de demonstração
Quando o usuário autenticado pertence ao perfil demo_operator, o catálogo administrativo passa a usar um snapshot temporário por sessão.
Comportamento:
- produtos, categorias e coleções lidos no painel passam a sair desse snapshot;
- novas alterações não tocam o banco nem os arquivos oficiais;
- a duração acompanha a sessão demo, com limite de
30 minutos; - ao expirar, o snapshot é descartado automaticamente.
Isso vale para o painel administrativo. A loja pública e a API pública continuam lendo apenas a fonte oficial do catálogo.
Persistencia em arquivo
Arquivos administrativos do catalogo:
src/data/ecommpanel/catalog/products-index.jsonsrc/data/ecommpanel/catalog/products/<productId>.jsonsrc/data/ecommpanel/catalog/categories-index.jsonsrc/data/ecommpanel/catalog/collections-index.json
Se esses arquivos ainda nao existirem, o sistema cria uma base inicial a partir do catalogo local que ja existia no storefront.
Persistencia em banco
Tabela atual:
catalog_productscatalog_categoriescatalog_collections
Escopo atual da tabela:
- identificacao do produto;
- slug e SKU;
- GTIN, EAN, NCM, CEST e referencias internas;
- preco e preco de lista;
- status e disponibilidade;
- categorias, departamentos e colecoes;
- imagem principal e galeria;
- descricao curta e longa;
- SEO;
- fornecedor, custo e dimensoes;
- estoque, reserva, entrada e locais de estoque;
- variacoes / SKUs derivados e atributos comerciais;
- metadados operacionais.
Estrutura de dados
O catalogo agora segue um modelo misto:
- campos centrais tipados para o que e operacional e critico;
- campos de extensao opcionais em JSON para evolucao futura.
Campos centrais tipados
Exemplos no produto:
slugskunamebrandstatusavailablepricelistPricecategoriesdepartmentscollectionsstockidentificationdimensionssupplierattributesvariantsseo
Exemplos em categoria e colecao:
slugnamedescriptionstatus
Area maleavel
Para nao travar a evolucao do projeto, o banco tambem aceita campos opcionais:
catalog_products.custom_fieldscatalog_categories.metadatacatalog_collections.metadata
Esses blocos recebem propriedades novas sem quebrar a leitura da loja. Se estiverem vazios, o runtime continua funcional normalmente.
Como isso evolui no painel
O admin agora opera a estrutura em camadas:
- produto com formulario operacional;
- estoque com camada mais detalhada de saldo, reserva, entrada e reposicao;
- identificacao comercial/fiscal e fornecedor;
- dimensoes e preparo logistico;
- variacoes / SKUs derivados via estrutura JSON controlada;
- categoria com CRUD proprio;
- colecao com CRUD proprio;
- campos adicionais e metadados em JSON quando for necessario expandir sem refazer o schema inteiro.
Isso permite crescer com seguranca:
- o que e essencial fica explicito e tipado;
- o que e novo ou experimental pode entrar como extensao;
- depois, se um campo opcional virar regra do negocio, ele pode migrar para coluna propria.
Como a loja consome
Quando NEXT_PUBLIC_DATA_SOURCE=app, a loja deixa de depender diretamente dos mocks locais e passa a consumir:
GET /api/v1/catalog/productspara PLP;GET /api/v1/catalog/products/[slug]para PDP.
Com isso, o painel, a API publica e o storefront passam a ler a mesma camada de catalogo.
Contrato entre painel, banco e loja
Hoje o fluxo do catalogo funciona assim:
- o
EcommPanelenvia a alteracao para as rotas administrativas do catalogo; - as rotas chamam o runtime do catalogo;
- o runtime decide como persistir conforme
ECOM_CATALOG_PERSISTENCE_MODE; - a API publica le esse mesmo runtime;
- a loja consome a API publica quando
NEXT_PUBLIC_DATA_SOURCE=app.
Escrita administrativa
Rotas administrativas principais:
POST /api/ecommpanel/catalog/productsPUT /api/ecommpanel/catalog/products/[productId]POST /api/ecommpanel/catalog/categoriesPUT /api/ecommpanel/catalog/categories/[categoryId]POST /api/ecommpanel/catalog/collectionsPUT /api/ecommpanel/catalog/collections/[collectionId]
Em sessão demo:
- essas escritas continuam funcionando no admin;
- mas passam a gravar apenas no sandbox temporário daquela sessão.
Regra de persistencia
files: o painel grava so em JSON;hybrid: o painel grava em JSON e tambem fazupsertno PostgreSQL;database: o painel grava somente no PostgreSQL.
Em hybrid, a leitura prefere o banco. Se o banco estiver vazio, o runtime pode semear as tabelas a partir dos arquivos administrativos.
Leitura publica
As rotas publicas:
GET /api/v1/catalog/productsGET /api/v1/catalog/products/[slug]GET /api/v1/catalog/categories
leem o runtime do catalogo, nao os formulários do painel diretamente. Isso garante que a loja enxergue a mesma estrutura consolidada que o admin acabou de salvar.
Integridade e performance no estado atual
Integridade
Hoje a ideia aplicada e:
- o painel sempre grava no runtime do catalogo;
- o site nunca consulta o formulario do painel;
- o site consulta a camada publica do app;
- produto, categoria e colecao compartilham o mesmo dominio de leitura;
- o mesmo dominio agora carrega tambem a estrutura ampliada de estoque e variacoes.
Isso reduz divergencia entre o que foi salvo no admin e o que a loja exibe.
Cache
No estado atual:
- a API publica ja responde com
Cache-Control; - o storefront em modo
appainda usafetch(..., { cache: 'no-store' }); - isso privilegia consistencia durante a migracao para banco.
Ou seja: o contrato ja esta integro, mas o cache do storefront ainda esta num modo mais conservador.
Proxima etapa de performance
Para o catalogo ficar mais rapido em producao, a evolucao natural e:
- manter o banco como fonte de verdade;
- gerar uma camada publica de leitura bem estavel;
- adicionar cache/projecao para PLP, PDP, categorias e colecoes;
- invalidar ou renovar cache quando houver mudanca no painel.
Essa camada de cache ainda nao e o centro do catalogo hoje. Primeiro estamos consolidando o dominio e a persistencia.
Permissoes atuais
Permissoes relevantes:
catalog.products.managecatalog.content.managecatalog.pricing.managelogistics.manage
Perfil pronto:
catalog_manager
Limite desta fase
Ainda nao entraram nesta rodada:
- familias de produto;
- SKUs separados por variacao;
- estoque concorrente;
- promocoes e cupons.
Essa fase resolve a base operacional do produto. A parte transacional mais forte continua para a etapa de banco mais avancada.