# StructuralLandingEditor (SLE) — Editor Estrutural

## 1. O que é o módulo

Maior módulo do sistema V2. Permite a personalização avançada e completa da estrutura visual e funcional do portal público, incluindo metaconfigurações, tema visual, dados estruturais (header/footer/contato/redes sociais/LAI), features (acessibilidade, VLibras) e editor de conteúdo (header, footer, CSS, JS). Restrito ao e-mail de suporte (`config('v2.support.email')`).

**Namespace:** `V2\Modules\Support\StructuralLandingEditor`

## 2. Estrutura de dados

### StructuralPortalContent (tabela: `v2_structural_portal_contents`)
- `id` (uuid, PK)
- `area` (string, unique) — ex: 'header', 'footer', 'main_left', 'main_right', 'css_head', 'css_foot', 'js_head', 'js_foot'
- `content` (text) — conteúdo Blade/CSS/JS
- `content_type` (string) — 'htmlmixed', 'css', 'javascript'
- `active` (boolean)

### SleAsset (tabela: `v2_sle_assets`), usa SoftDeletes
- `id` (uuid, PK)
- `type` (string) — 'css', 'js', 'image'
- `original_name` (string)
- `storage_path` (string)
- `mime_type` (string)
- `file_size` (integer)
- `gallery_media_id` (integer, nullable) — referência à galeria de mídias
- `snippet` (text) — snippet Blade gerado automaticamente

### LayoutBaseConfig (tabela: `v2_layout_base_configs`), usa SoftDeletes
- `id` (uuid, PK)
- `key` (string, unique) — ex: 'logos', 'contato', 'links_header', 'links_footer', 'social_media', 'global_banner', 'lai_items', 'lai_enabled'
- `payload` (jsonb)
- `transaction_snapshot_id` (uuid, nullable)

## 3. Dependências

- **StorageService** (`V2\Services\Storage\StorageService`) — upload de assets e favicon
- **GalleryService** (`V2\Services\Gallery\Services\GalleryService`) — upload de imagens via galeria
- **MediaInputer** (`V2\Services\Media\Services\MediaInputer`) — upload de mídia no LayoutBase
- **ActivityLoggerService** (`V2\Services\ActivityLogger\ActivityLoggerService`) — auditoria de todas as operações
- **PortalConfigsService** + **SupportConfigsService** — persistência de configs do portal e tema CMS
- **V2PermissionMiddleware** — (embora todo acesso seja restrito ao e-mail de suporte)

## 4. Tabelas

- `v2_structural_portal_contents` — conteúdos por área (criado pela migração 2026_07_03_000000)
- `v2_layout_base_configs` — configurações estruturais (criado pela migração 2026_07_03_000001)
- `v2_sle_assets` — assets CSS/JS/imagens (criado pela migração 2026_07_06_000000)

## 5. Arquivos

```
V2/Modules/Support/StructuralLandingEditor/
├── Controllers/
│   ├── LayoutBaseCmsController.php      # update() — logos, links, contato, redes, banner, LAI
│   ├── SleCmsController.php             # meta, theme, structuralData, features, editor, assets
│   └── UserConfigsCmsController.php     # update() — configs do portal, e-mail, tema CMS
├── helpers.php                           # sle_component() — função global para renderizar componentes no eval()
├── Migrations/
│   ├── 2026_07_03_000000_create_v2_structural_portal_blocks_table.php
│   ├── 2026_07_03_000001_create_v2_layout_base_configs_table.php
│   └── 2026_07_06_000000_create_v2_sle_assets_table.php
├── Models/
│   ├── LayoutBaseConfig.php             # LayoutBaseConfig (softDeletes, uuid)
│   ├── SleAsset.php                     # SleAsset (softDeletes, uuid)
│   └── StructuralPortalContent.php      # StructuralPortalContent (uuid, sem softDeletes)
├── ModuleProvider.php                    # Config: 5 submódulos, registra BlockRenderer + ComponentResolver + LayoutBaseComposer
├── Routes/
│   └── cms.php                          # prefix: cms/infra/structural-editor (20+ rotas)
├── Services/
│   ├── AssetManagerService.php          # Upload, listagem, deleção de assets CSS/JS/imagens
│   ├── BlockRenderer.php                # Renderização de blocos Blade via eval() — coração do SLE
│   ├── ComponentResolver.php            # Resolve {!! sle_component('nome') !!} para views do portal
│   ├── GallerySender.php                # Extensão do GallerySender para o contexto SLE
│   └── UserConfigsService.php           # Fachada para configs de portal + e-mail + tema CMS
├── ViewComposers/
│   └── LayoutBaseComposer.php           # Injeta $layoutConfigs nas views v2-portal::* e v2-basicpage::*
├── Views/
│   └── cms/
│       ├── components/
│       │   ├── asset-card.blade.php
│       │   ├── asset-picker-modal.blade.php
│       │   ├── asset-sidebar.blade.php
│       │   └── help-manual.blade.php
│       ├── submodules/
│       │   ├── assets/
│       │   │   └── index.blade.php
│       │   ├── editor/
│       │   │   └── index.blade.php
│       │   ├── features/
│       │   │   └── index.blade.php
│       │   ├── meta/
│       │   │   └── index.blade.php
│       │   ├── structural-data/
│       │   │   └── index.blade.php
│       │   └── theme/
│       │       └── index.blade.php
│       └── tabs/
│           ├── css-head.blade.php
│           ├── footer.blade.php
│           ├── header.blade.php
│           ├── js-foot.blade.php
│           ├── layoutbase/
│           │   ├── comunicado-global.blade.php
│           │   ├── contato.blade.php
│           │   ├── links-footer.blade.php
│           │   ├── links-header.blade.php
│           │   ├── logos.blade.php
│           │   ├── redes-sociais.blade.php
│           │   ├── transparencia-lai.blade.php
│           │   └── components/
│           │       └── history-table.blade.php
│           ├── main.blade.php
│           └── userconfigs/
│               ├── email.blade.php
│               ├── metadados.blade.php
│               ├── seo.blade.php
│               ├── tema-cms.blade.php
│               ├── tema-portal.blade.php
│               └── temas.blade.php
│       └── manual/
│           └── content.blade.php
```

## 6. Observações/Sugestão

- **BlockRenderer usa `eval()`** (`eval('?>' . $compiled);`) — isso é um risco de segurança significativo. Apenas o e-mail de suporte tem acesso, mas considerar alternativas como sandboxing ou um parser de template mais restrito seria ideal.
- O módulo é extremamente acoplado: `SleCmsController` instancia `UserConfigsCmsController` e `LayoutBaseCmsController` diretamente via `app()`. Isso dificulta testes unitários.
- As views de tabs têm estrutura aninhada complexa (tabs/layoutbase/, tabs/userconfigs/). Seria benéfico padronizar a organização de views por submódulo (já iniciado em submodules/).
- `AssetManagerService` faz dependência circular conceitual: usa `GalleryService` para upload de imagens, mas também expõe método `createFromGallery()` para importar da galeria.
- A funcionalidade de snapshot (`transaction_snapshot_id` nas migrations) parece planejada mas não implementada nos controllers.
