# Novidades — Arquitetura

> Módulo **novo na v6**. É o CRUD mais simples do CMS: Route -> Controller
> -> FormRequest -> Model -> tabela, sem Repository e sem Service.

---

## 1. Fluxo da requisição

```
Navegador
   ▼
routes/basepro.php:73-79   (grupo 'cms', middleware check.logged)
   ▼
Admin\ChangeLogController
   ├─ index()   →  ChangeLog::orderBy('id','DESC')->get()
   │                →  view 'prefecture.configurations.changelog.index'
   ├─ create()  →  view 'prefecture.configurations.changelog.create'
   ├─ store(ChangeLogRequest)
   │      ├─ Carbon::createFromFormat('d/m/Y H:i:s')  (fallback 'd/m/Y')
   │      └─ ChangeLog::save()
   ├─ edit($id) →  ChangeLog::findOrFail($id)
   │                →  view 'prefecture.configurations.changelog.edit'
   ├─ update(ChangeLogRequest, $id)
   │      ├─ Carbon::createFromFormat(...)
   │      └─ $changelog->update($data)
   ├─ destroy($id) →  ChangeLog::findOrFail($id)->delete()
   └─ show($id)  →  NÃO IMPLEMENTADO (rota existe → erro 500)
   ▼
App\Admin\ChangeLog  →  tabela change_logs
```

O model **não** tem `$table` declarado: o Eloquent deduz
`change_logs` (plural snake_case de `ChangeLog`), que é o nome real da
tabela.

---

## 2. Diagrama das rotas

```
                         ┌──────────────────────────────┐
                         │  GET  /cms/novidades         │→ index
                         │  GET  /cms/novidades/create  │→ create
                         │  POST /cms/novidades         │→ store
                         │  GET  /cms/novidades/{id}    │→ show  ✗ (sem método)
                         │  GET  /cms/novidades/editar/{id} │→ edit
                         │  PUT  /cms/novidades/update/{id} │→ update
                         │  DELETE /cms/novidades/delete/{id} │→ destroy
                         └──────────────────────────────┘
                                   (todas com check.logged)
```

> A ordem de declaração importa: `novidades/editar/{id}` (linha 74) vem
> **antes** de `novidades/create` (linha 75) e de `novidades/{id}`
> (linha 76). Como `editar/{id}` tem dois segmentos, não há colisão com
> `novidades/{id}` (um segmento). Já `novidades/create` **colide** com
> `novidades/{id}` — mas, como `create` é declarado **antes**, ele vence
> e `GET /cms/novidades/create` não é interpretado como
> `changelog.show`.

---

## 3. Classes envolvidas

| Classe | Caminho | Papel |
|---|---|---|
| `Admin\ChangeLogController` | `v6/app/Http/Controllers/Admin/ChangeLogController.php` | CRUD do changelog |
| `App\Admin\ChangeLog` | `v6/app/Http/Model/Admin/ChangeLog.php` | Model da tabela `change_logs` |
| `App\Http\Requests\ChangeLogRequest` | `v6/app/Http/Requests/ChangeLogRequest.php` | Validação da escrita |
| `App\Http\Model\Admin\Modulos` | `v6/app/Http/Model/Admin/Modulos.php` | Registro de módulos (id 10) |
| `App\Http\Model\Prefecture\UpdateLogs` | `v6/app/Http/Model/Prefecture/UpdateLogs.php` | **Outro** conceito: versão corrente do sistema |
| `UpdateVersion` | `v6/app/Console/Commands/UpdateVersion.php` | Comando `update:logs` que incrementa a versão em `update_logs` |
| `Admin\ModulosController` | `v6/app/Http/Controllers/Admin/ModulosController.php` | Tela `/cms/modulos` (mesmo registro de módulos) |

### 3.1 Observação de namespace

O controller está em `App\Http\Controllers\Admin`, mas as views estão em
`v6/resources/views/prefecture/configurations/changelog/`. A mesma
inconsistência existe em outros módulos movidos da área "Prefecture"
para "Admin" (o modelo continua em `App\Admin`, as views em
`prefecture/`).

---

## 4. Dependências externas

| Pacote | Versão | Uso |
|---|---|---|
| `laravel/framework` | `5.5.*` | Eloquent, Carbon, roteamento, views |
| `nesbot/carbon` | (via Laravel) | `Carbon::createFromFormat` para converter a data |
| `laravelcollective/html` | `^5.5` | `Form::` nos Blades |
| Summernote | (asset) | editor da descrição |
| `fontawesome-iconpicker` | (asset) | seleção do ícone |
| `laralabs/toaster` | `^2.0` | mensagens de flash |

---

## 5. Onde o módulo é consumido

| Consumidor | Dependência | Onde |
|---|---|---|
| Menu do AdminLTE | `route('changelog.index')` | `v6/resources/views/vendor/adminlte/page.blade.php:310-317` |
| Rodapé do AdminLTE | `route('changelog.index')` + `UpdateLogs::all()->last()->version` | `v6/resources/views/vendor/adminlte/page.blade.php:427-432` |
| Portal público | **nada** | — |

> O **portal público** não exibe o changelog. Apenas o CMS.

---

## 6. Mapa de arquivos

```
app/Http/Controllers/Admin/ChangeLogController.php
app/Http/Model/Admin/ChangeLog.php
app/Http/Model/Admin/Modulos.php
app/Http/Model/Prefecture/UpdateLogs.php
app/Http/Requests/ChangeLogRequest.php
app/Console/Commands/UpdateVersion.php

resources/views/prefecture/configurations/changelog/
├── index.blade.php
├── create.blade.php
├── edit.blade.php
├── form.blade.php
└── modal.blade.php

public/assets/js/custom/config/novidades/changelog-modal.js
public/assets/plugins/summernote/summernote.min.js
public/assets/plugins/summernote/summernote-pt-BR.js
public/assets/js/custom/utilities/richtext/summernote.js
public/assets/plugins/fontawesome-iconpicker/dist/js/fontawesome-iconpicker.js

database/migrations/2022_04_22_094515_create_changelog_table.php
database/migrations/2025_09_26_103213_alter_number_versao_to_string_in_change_logs_table.php
database/seeds/ChangeLogTableSeeder.php
routes/basepro.php:73-79
```
