# Redes Sociais — Modelagem de Dados

## 1. Tabelas envolvidas

### 1.1 `contents` (dados da rede)

| Coluna | Tipo | Uso no módulo |
|---|---|---|
| `id` | serial | PK, referenciado por `links.contents_id` |
| `title` | varchar(191) | nome da rede exibido ao lado do ícone (rodapé) ou como `title` do link |
| `icon` | varchar(191) | classe CSS do ícone (ex.: `fab fa-facebook`) |
| `status` | bool | `true` = rede ativa e visível no portal |
| `order` | int | ordem exibida no CMS (reordenação por drag-and-drop) |
| `position_id` | bigint (FK `positions.id`) | 1 Cabeçalho, 2 Rodapé, 3 Ambos |
| `category_contents_id` | int (FK) | aponta para a categoria `rede-social` (id 26) |
| `slug` | varchar(191) | gerado a partir do título |
| `text` | text | **não usado** neste módulo |
| `deleted_at` | timestamp | SoftDeletes |

A coluna `position_id` foi adicionada em `v6/database/migrations/2023_08_17_094529_add_position_id_to_contents_table.php`,
que já atribui `position_id = 2` (Rodapé) às redes existentes:

```php
DB::table('contents')->where('category_contents_id', '=', 26)->update(['position_id' => 2]);
```

### 1.2 `links` (URL da rede)

| Coluna | Tipo | Uso |
|---|---|---|
| `id` | serial | PK |
| `contents_id` | int | FK -> `contents.id` (1:1 na prática, via `linksUnique`) |
| `link` | varchar | URL da rede |
| `title` / `name` / `alt` | varchar | preenchidos com o `title` do conteúdo |
| `isBlank` | bool/ tinyint | “Abrir em nova guia” (`target="_blank"`) |

Model: `v6/app/Http/Model/Prefecture/Link.php` (tabela `links`, `$fillable` com `title`, `link`, `alt`, `name`, `isBlank`, `contents_id`, `static_pages_id`, `status_create`).
Migration: `v6/database/migrations/2018_04_02_181150_create_links_table.php` (e renomeação em `v6/database/migrations/2019_09_10_161305_alter_link_to_links_table.php`).

Relação em `v6/app/Http/Model/Prefecture/Content.php`:

```php
public function linksUnique()
{
    return $this->hasOne(Link::class, 'contents_id', 'id');
}
```

### 1.3 `category_contents`

| Campo | Valor |
|---|---|
| `id` | 26 |
| `slug` | `rede-social` (singular, ao contrário do slug do módulo no CMS) |
| `name` | `Rede Social` |
| `status_create` | `1` |

Seed: `v6/database/seeds/CategoryContentTableSeeder.php:152-155`.

### 1.4 `positions` (catálogo)

Migration: `v6/database/migrations/2023_08_17_094440_position_table_with_data.php`

| `id` | `name` | `slug` |
|---|---|---|
| 1 | Cabeçalho | `cabecalho` |
| 2 | Rodapé | `rodape` |
| 3 | Ambos | `ambos` |

A tabela tem `id`, `name`, `slug` (único), `timestamps` e `deleted_at` (`SoftDeletes` no modelo
`v6/app/Http/Model/Prefecture/Position.php`).

### 1.5 `modulos` (chave liga/desliga)

| `id` | `slug` | `status` |
|---|---|---|
| 29 | `redes-sociais` | `false` (desativado por padrão) |

Confirmado por leitura no banco (`prefeituras_v5`).

## 2. View SQL `rede_social`

Migration: `v6/database/migrations/2023_04_10_161440_create_view_to_rede-social.php`

```sql
CREATE OR REPLACE VIEW rede_social AS
SELECT row_number() OVER (ORDER BY c.created_at DESC) AS value,
    c.title AS titulo,
    CASE
        WHEN c.status IS TRUE THEN 'Ativado'::text
        ELSE 'Desativado'::text
    END AS status_name,
    c.id as id,
    c.status as status
FROM contents c
    JOIN category_contents cc ON cc.id = c.category_contents_id
WHERE c.deleted_at IS NULL AND cc.slug = 'rede-social'
ORDER BY c.created_at DESC;
```

| Coluna | Tipo | Uso no CMS |
|---|---|---|
| `value` | bigint | coluna “ID” da tabela (numeração sequencial, não o `contents.id`) |
| `titulo` | text | coluna “Título” |
| `status_name` | text | coluna “Status” (“Ativado” / “Desativado”) |
| `id` | int | chave para editar/excluir/toggle |
| `status` | bool | alimenta o botão de ativação |

Observações: a view **não** expõe `icon`, `order` nem `position_id`; o status é “traduzido” em
SQL, o que impede o CMS de filtrar por status no texto traduzido.

## 3. Relacionamentos

| Relação | Tipo | Uso |
|---|---|---|
| `Content::categoryContents()` | `belongsTo(CategoryContent)` | filtro por `slug = 'rede-social'` |
| `Content::linksUnique()` | `hasOne(Link)` | URL e `isBlank` |
| `Content::position()` | `hasOne(Position::class, 'id', 'position_id')` | nome da posição |
| `Link::contents()` | `belongsTo(Content)` | volta da URL para a rede |
| `Position::contents()` | `belongsTo(Content::class, 'position_id', 'id')` | redes por posição |

Observação técnica: `Content::position()` e `Position::contents()` usam `hasOne`/`belongsTo` com
chaves não padrão (`'id', 'position_id'`), o que é semanticamente `belongsTo`. Funciona, mas é
uma armadilha para quem lê o código.

## 4. Estado atual no banco

| Consulta | Resultado |
|---|---|
| `select count(*) from rede_social` | 0 |
| `select id, slug, status from modulos where slug = 'redes-sociais'` | 29, `redes-sociais`, `false` |

Não há redes cadastradas no ambiente de desenvolvimento; o módulo está **desativado e vazio**.

## 5. Migrations e seeds

| Arquivo | Papel |
|---|---|
| `v6/database/migrations/2018_04_01_180916_create_category_contents_table.php` | `category_contents` |
| `v6/database/migrations/2018_04_02_180433_create_contents_table.php` | `contents` |
| `v6/database/migrations/2018_04_02_181150_create_links_table.php` | `links` |
| `v6/database/migrations/2023_04_10_161440_create_view_to_rede-social.php` | view `rede_social` |
| `v6/database/migrations/2023_08_17_094440_position_table_with_data.php` | tabela `positions` + 3 posições |
| `v6/database/migrations/2023_08_17_094529_add_position_id_to_contents_table.php` | `contents.position_id` |
| `v6/database/migrations/2024_11_01_150206_create_modulos_table.php` | tabela `modulos` |
| `v6/database/seeds/CategoryContentTableSeeder.php` | categoria `rede-social` |
| `v6/database/seeds/ResourcesTableSeeder.php` | resource `redes-sociais` |
| `v6/database/seeds/AjustesMigracao.php` | renomeia o resource `rede-social` -> `redes-sociais` |
| `v6/database/seeds/MenuOrderSeeder.php` | `menu_orders` da categoria |
| `v6/database/seeds/RolesTableSeeder.php` | permissões `redes-sociais.*` |
