Logotipo Hedhog

Receba novidades do Hedhog no seu e-mail

Novos lançamentos, receitas e breaking changes — sem spam.

Submódulo cms

components

Catálogo de componentes reutilizáveis e renderizáveis (react/html/embed) com schemas de props e props padrão, agrupados em categorias e posicionados nas regiões de layout de página.

Caminho de origem: libraries/cms/src/cms-component.controller.ts, cms-component.service.ts

Arquivo do módulo: cms.module.ts

Introdução

O submódulo Components gerencia `cms_component`, o catálogo de blocos de construção que o endpoint `saveComponents` do submódulo Pages instancia nas regiões de layout de uma página. Cada componente pertence a exatamente uma categoria (`category_id`, FK para `cms_component_category`, `onDelete: RESTRICT`), tem um `type` (react, html ou embed — padrão react), um `props_schema` opcional que descreve o formato de suas props configuráveis para a geração de formulários do editor administrativo, um objeto `default_props` opcional aplicado quando uma nova instância é criada, um flag `is_active`, um flag `is_system` e uma `order` usada para ordenação dentro de sua categoria. `GET /cms/components` aceita um filtro opcional de query `category_id` e sempre ordena por categoria e, em seguida, por order.

A criação e a atualização seguem o mesmo padrão de linha-base-e-depois-upsert-de-locale dos Layouts. `PATCH /cms/components/:id`, no entanto, tem um comportamento não óbvio que vale destacar explicitamente: `CmsComponentService.update()` calcula `hasExplicitFields` — verdadeiro se o corpo da requisição definir qualquer um de `category_id`, `slug`, `type`, `props_schema`, `default_props`, `is_system`, `order` ou `locale`. Se o corpo do PATCH **não** contiver nenhum deles (ou seja, um payload `{}` genuinamente vazio, sem `is_active` também), o serviço trata a chamada como um atalho de alternância e inverte `is_active` para o oposto de seu valor atual. Qualquer corpo que inclua ao menos o mapa `locale` — o caso comum de uma edição apenas de tradução — é tratado como "explícito" e não dispara a alternância, de modo que isso só ocorre com um corpo de requisição verdadeiramente vazio; não é algo que um cliente normal de edição de locale acionaria por acidente, mas significa que um PATCH vazio não é um no-op.

O flag `is_system` existe no schema e no DTO para marcar componentes internos, não deletáveis, mas `CmsComponentService` atualmente não o impõe em lugar nenhum — `delete()` e `update()` se aplicam a componentes de sistema exatamente como a qualquer outro, de modo que proteger componentes internos de edições ou exclusões acidentais não é algo que este endpoint garanta hoje. Separadamente, a tabela `cms_component` define uma coluna `preview_image_file_id` (FK para `file`, `onDelete: SET NULL`) que não tem campo correspondente em `CmsComponentDto` e nunca é lida nem escrita pelo serviço — uma imagem de pré-visualização não pode ser definida por esta API atualmente, apesar de a coluna existir no schema.

Como nos Layouts, todo endpoint de escrita (criar, atualizar, excluir) é restrito a `admin`/`admin-cms`; `cms-editor` e `cms-publisher` podem ler o catálogo para escolher componentes ao construir uma página, mas não podem adicioná-los nem modificá-los.

Endpoints HTTP

5 endpoints

Listagem completa de componentes (não paginada), ordenada por categoria e, em seguida, por order, localizada para o locale da requisição.

Query
category_id? — filter to components in a single category

Cria um novo componente e suas linhas de nome/descrição por locale.

Body

FieldTypeRequiredNotes
category_idnumberyes
slugstringyes
typeCmsComponentType (react | html | embed)noDefault: react
props_schemaobjectnoDescribes configurable props for admin form generation
default_propsobjectnoApplied to new instances of this component
is_activebooleannoDefault: true
is_systembooleannoDefault: false. Not currently enforced by the service
ordernumbernoDefault: 0
localeRecord<string, { name: string; description?: string }>yese.g. { "en": { "name": "...", "description": "..." } } — upserts one locale row per key

Obtém um único componente, localizado para o locale da requisição.

Params
id (int)

Atualiza um componente (mesmos campos da criação, todos opcionais). Se o corpo da requisição estiver completamente vazio (sem nenhum campo, incluindo locale), o serviço alterna is_active em vez de não fazer nada.

Params
id (int)

Exclui fisicamente um componente. Não protegido contra is_system, nem protegido contra componentes ainda posicionados como instâncias de componente em páginas.

Params
id (int)