# Drive — Modelagem de Dados

## 1. Tabela `archives` (o único armazenamento do Drive)

Migration: `v6/database/migrations/2018_04_02_181807_create_archives_table.php`
Model: `v6/app/Http/Model/Prefecture/Archive.php` (namespace `App\Prefecture`, usa `SoftDeletes`)

| Coluna | Tipo | Null | Preenchida pelo Drive? | Observação |
|---|---|---|---|---|
| `id` | serial | não | sim | PK |
| `title` | varchar(300) | sim | não | usado por `updateArchiveTitle` |
| `description` | text | sim | não | idem |
| `type` | varchar(191) | sim | sim | MIME do arquivo (`$file->getMimeType()`) |
| `hash` | varchar(300) | sim | sim | `md5_file($file->getRealPath())` |
| `path` | varchar(300) | sim | sim | `storage/content/midias/<nome>` |
| `name` | varchar(300) | sim | sim | nome gerado (aleatório) |
| `extension` | varchar(191) | sim | sim | extensão em minúsculas |
| `status_create` | bool | sim | não | — |
| `highlight` | bool | sim | não (fica NULL) | marca o arquivo de destaque de um conteúdo |
| `deleted_at` | timestamp | sim | sim (no delete) | soft delete |
| `created_at` / `updated_at` | timestamp | sim | sim | — |
| `contents_id` | int | sim | **não (NULL)** | FK -> `contents.id` |
| `static_pages_id` | int | sim | não | FK -> `static_pages.id` |
| `biddings_id` | int | sim | não | FK -> `biddings.id` |
| `calendar_events_id` | int | sim | não | FK -> `calendar_events.id` |
| `order` | int | sim | não | ordenação na galeria do conteúdo |
| `view_pdf` | bool | sim | não | exibição inline de PDF |
| `reference_id` | text | sim | não | — |
| `type_size_id` | bigint | sim | **não (NULL)** | FK -> `types_sizes.id` |
| `width` | varchar(191) | sim | não | largura (quando `type_size_id = 4`) |
| `height` | varchar(191) | sim | não | altura (quando `type_size_id = 4`) |
| `requerimento_id` | bigint | sim | não | — |
| `tv_camara_id` | bigint | sim | não | — |
| `highlight_id` | int | sim | não | FK -> `highlights.id` (ON DELETE CASCADE) |

### Como o Drive preenche o registro

Código real (`v6/app/Http/Controllers/Prefecture/ArchiveController.php:116-135`):

```php
$name = $this->saveUpload($request->file, $dir, null, null, true);
$file = $request->file('file');

$data = [
    'name' => $name,
    'path' => "$path/$name",
    'extension' => strtolower($file->getClientOriginalExtension()),
    'type' => $file->getMimeType(),
    'hash' => md5_file($file->getRealPath()),
];

if (isset($column)) {
    $data[$column] = $content->id;
}

if ($archive = Archive::create($data)) {
```

Sem `table` na requisição, `$column` não é definido: o arquivo nasce **sem dono**.

## 2. Tabela `types_sizes` (catálogo de tamanhos)

Migration: `v6/database/migrations/2023_07_24_130414_create_types_sizes.php`
Model: `v6/app/Http/Model/Prefecture/TypesSizes.php`

| `id` | `type` | `size` |
|---|---|---|
| 1 | Grande | `600px` |
| 2 | Médio | `350px` |
| 3 | Pequeno | `200px` |
| 4 | Personalizado | (vazio) |

O Drive **não** usa `type_size_id`: os arquivos da biblioteca global ficam com `type_size_id`,
`width` e `height` nulos. O catálogo é usado pelo módulo de secretarias
(`ContentController@genericGenerate` passa `['types_sizes' => $this->typesSizes->all()]`).

Relacionamento declarado em `v6/app/Http/Model/Prefecture/Archive.php`:

```php
public function typeSize()
{
    return $this->hasOne(TypesSizes::class, 'id', 'type_size_id');
}
```

## 3. Tabela `category_contents` (categoria `midias`)

| Campo | Valor |
|---|---|
| `id` | 31 |
| `slug` | `midias` |
| `name` | `Mídias` |
| `status_create` | `true` |

A categoria existe apenas para dar um `slug` ao Controller genérico de conteúdos (e um título ao
menu). **Nenhum `contents` é criado para a categoria `midias`**: o Drive não cria conteúdo, apenas
arquivos.

## 4. Tabela `contents` (apenas quando o arquivo pertence a um conteúdo)

| Coluna | Papel |
|---|---|
| `id` | dono do arquivo (`archives.contents_id`) |
| `galery` | flag que habilita a galeria na tela de edição (`ContentController@returnData`, linha 289) |
| `slug` | define a pasta física: `storage/content/<categoria>/<slug>/<id>/galeria` |

## 5. Views SQL

**Não há view SQL para o Drive.** O módulo não usa `CREATE VIEW`; a listagem é feita diretamente
sobre `archives` pelo `ArchiveRepository`.

Views SQL existentes no projeto que **não** têm relação com o Drive: `telefones_uteis`,
`rede_social`, `banners`, `super_banners`, `glossario`, `paginas_estaticas`.

## 6. Armazenamento físico

| Caminho | Conteúdo |
|---|---|
| `storage/content/midias/` | arquivos do Drive (biblioteca global) |
| `storage/content/<categoria>/<slug>/<id>/galeria/` | galeria de um conteúdo |
| `storage/content/<categoria>/<slug>/<id>/destaque/` | imagem de destaque de um conteúdo |
| `storage/statics/<slug>/galeria/` | galeria de página estática |
| `storage/calendar-events/<categoria>/<id>/galeria/` | galeria de evento |

O nome do arquivo é gerado por `FileTrait::getFileName`:

```php
public function getFileName($file, $reference = null): string
{
    $name = uniqid('', false) . str_random(5) . "." . $file->getClientOriginalExtension();
    return strtolower($name);
}
```

Ou seja: **o nome original do arquivo é perdido**. O `name` exibido na grade é o nome gerado.

## 7. Versões geradas da imagem

`FileTrait::saveUpload` chama `compress($caminhoDaImagem)`, que produz (quando a imagem é válida):

| Versão | Largura | Uso típico |
|---|---|---|
| `_min` | 200 px | miniaturas |
| `_med` | 380 px | cartões |
| `_larg` | 1480 px | página |

Os helpers `getNormalFile`, `getMinFile`, `getMedFile` e `getLargFile`
(`v6/app/Helpers/functions.php:971-1007`) devolvem o caminho da versão quando ela existe em
`public_path`, senão o caminho original. `getTypeSize` (linha 1009) devolve o `size` do registro de
`types_sizes` ou `"600px"` como padrão.

> Observação: esses helpers são usados na **renderização** de imagens no portal; o JS do Drive
> **não** os usa — ele monta a URL a partir de `path` diretamente.

## 8. Estado atual no banco (`prefeituras_v5`)

| Consulta | Resultado |
|---|---|
| `select count(*) from archives` | 91 |
| `select count(*) from archives where contents_id is null` | 87 |
| `select count(*) from archives where path like 'storage/content/midias%'` | 0 |

Interpretação: **87 dos 91 arquivos do sistema estão órfãos** (sem `contents_id`). Como a listagem
do Drive não aplica filtro, ela exibiria **todos** os 91 arquivos, ainda que nenhum pertença à
biblioteca do Drive. A biblioteca `storage/content/midias` está vazia no ambiente de desenvolvimento.

## 9. Migrations e seeds relacionados

| Arquivo | Papel |
|---|---|
| `v6/database/migrations/2018_04_02_181807_create_archives_table.php` | tabela `archives` |
| `v6/database/migrations/2023_07_24_130414_create_types_sizes.php` | tabela `types_sizes` |
| `v6/database/migrations/2018_04_01_180916_create_category_contents_table.php` | `category_contents` |
| `v6/database/migrations/2024_11_01_150206_create_modulos_table.php` | módulo `drive` |
| `v6/database/seeds/CategoryContentTableSeeder.php` | categoria `midias` |
| `v6/database/seeds/ResourcesTableSeeder.php` | resource `drive` |
| `v6/database/seeds/AjustesMigracao.php` | renomeia o resource `midias` -> `drive` |
| `v6/database/seeds/MenuOrderSeeder.php` | `menu_orders` da categoria `midias` |
| `v6/database/seeds/RolesTableSeeder.php` | permissões `midias.*` |
