# BasicPage (Páginas do Portal)

## O que é o módulo

Gerencia todas as páginas fixas e dinâmicas do portal. Inclui 5 páginas fixas obrigatórias (Homepage, LGPD, Acessibilidade, Mapa do Site, Ouvidoria) com slugs predefinidos e seeds iniciais, além de páginas criadas em runtime pelo suporte técnico. Possui editor de conteúdo com suporte a HTML/CSS/JS, gerenciamento de assets (imagens, CSS, JS) com snippets, SEO configurável por página, e integração com busca full-text.

## Estrutura de dados

### BasicPage (`v2_basic_pages`)
| Campo | Tipo | Descrição |
|-------|------|-----------|
| `id` | UUID (PK) | |
| `slug` | string unique | Slug da página |
| `title` | string | Título |
| `content` | text nullable | Conteúdo HTML |
| `content_type` | string(50) | Tipo do conteúdo (htmlmixed, css, javascript) |
| `is_runtime` | boolean | Se foi criada em runtime (não é fixa) |
| `metadata` | jsonb nullable | SEO data + layout config |
| `created_at` / `updated_at` | timestamp | |

### BasicPageAsset (`v2_basic_page_assets`)
| Campo | Tipo | Descrição |
|-------|------|-----------|
| `id` | UUID (PK) | |
| `type` | enum: css/js/image | Tipo do asset |
| `original_name` | string | Nome original do arquivo |
| `storage_path` | string | Caminho no storage |
| `mime_type` | string(127) nullable | MIME type |
| `file_size` | bigint nullable | Tamanho em bytes |
| `gallery_media_id` | integer unsigned nullable | FK para v2_gallery_media |
| `snippet` | text nullable | Código de inclusão (link/script/@include) |
| `created_at` / `updated_at` / `deleted_at` | timestamp | |

## Dependências

- **ActivityLoggerService** (`V2\Services\ActivityLogger`) — auditoria de alterações
- **SEOService** (`V2\Services\SEO`) — meta tags e SEO
- **StorageService** (`V2\Services\Storage`) — armazenamento de assets
- **GalleryService** (`V2\Services\Gallery`) — upload de imagens via galeria
- **CMSIndexerService / PublicIndexerService** (`V2\Services\Search`) — indexação de busca
- **Sentinel** — autenticação para rotas restritas

## Tabelas

- `v2_basic_pages`
- `v2_basic_page_assets`

## Arquivos existentes

### Migrations
- `Migrations/2026_06_29_092300_create_basic_pages_table.php` — cria `v2_basic_pages` + seed das 5 páginas fixas
- `Migrations/2026_07_06_000200_create_basic_page_assets_table.php` — cria `v2_basic_page_assets`

### Models
- `Models/BasicPage.php` — modelo com SEO defaults, layout configs e syncToSearch
- `Models/BasicPageAsset.php` — asset com soft delete

### Controllers
- `Controllers/BasicPageCmsController.php` — index, previews (homepage, lgpd, acessibilidade, mapa-site, ouvidoria), create, store, edit, saveContent, updateSeo
- `Controllers/BasicPagePortalController.php` — homepage, lgpd, acessibilidade, mapaSite, ouvidoria, runtime (catch-all)
- `Controllers/BasicPageRuntimeController.php` — edit, saveContent, assets CRUD (list, upload, from-gallery, delete)

### Services
- `Services/BasicPageAssetManagerService.php` — upload de vendor (css/js), upload de imagem, CRUD de assets, seed a partir de arquivo local

### Routes
- `Routes/cms.php` — rotas CMS (index, previews, editor, assets)
- `Routes/web.php` — rotas públicas (homepage, lgpd, acessibilidade, mapa-do-site, ouvidoria, catch-all runtime)

### Views CMS
- `Views/cms/index.blade.php` — listagem de todas as páginas
- `Views/cms/editor.blade.php` — editor de conteúdo runtime
- `Views/cms/create.blade.php` — criação de página runtime
- `Views/cms/preview.blade.php` — preview genérico CMS
- `Views/cms/components/asset-sidebar.blade.php`
- `Views/cms/components/asset-card.blade.php`
- `Views/cms/assets/index.blade.php` — biblioteca de assets

### Views Portal
- `Views/portal/homepage.blade.php` — homepage
- `Views/portal/lgpd.blade.php` — LGPD
- `Views/portal/acessibilidade.blade.php` — acessibilidade
- `Views/portal/mapa_site.blade.php` — mapa do site
- `Views/portal/ouvidoria.blade.php` — ouvidoria
- `Views/portal/runtime.blade.php` — páginas criadas em runtime

### ModuleProvider
- `ModuleProvider.php` — configuração do módulo com 2 submódulos (Todas as Páginas, Criar Página — este restrito ao suporte)

## Observações

- **Páginas fixas:** 5 páginas são criadas por seed na migration (`homepage`, `lgpd`, `acessibilidade`, `mapa-do-site`, `ouvidoria`). O slug determina qual view do portal será renderizada.
- **Runtime pages:** páginas criadas dinamicamente pelo suporte são servidas pelo catch-all `/{slug}`. A view usa `Views/portal/runtime.blade.php` que carrega o conteúdo do banco dentro de um iframe sandbox.
- **Restrição de acesso:** criação e edição de páginas runtime e gerenciamento de assets são restritos ao email de suporte (`config('v2.support.email')`).
- **Assets:** o serviço `BasicPageAssetManagerService` gerencia upload de CSS, JS e imagens. Assets de imagem podem vir de upload direto ou da galeria (`GalleryService`). Cada asset gera um snippet de inclusão.
- **SEO:** o modelo `BasicPage` possui defaults de SEO hardcoded para slugs conhecidos (homepage, lgpd, etc.) com fallback para metadados salvos no banco. Inclui JSON-LD estruturado.
- **Layout config:** o metadata armazena configurações de layout (mostrar header, footer, accessibility bar, etc.) que são mescladas com defaults.
- **Ordem de rotas:** a rota catch-all `/{slug}` deve vir DEPOIS de todas as rotas explícitas no `Routes/web.php` para não interceptá-las.
- **Rota de assets:** `GET /editor/assets` deve vir ANTES de `GET /editor/{slug}` para não ser tratada como slug.
- **Sincronização de busca:** `BasicPage::saved()` dispara `syncToSearch()` que indexa tanto no CMS (com URL de edição) quanto no público.
