# Fundacao MySQL do CMS

## Objetivo

Definir o schema inicial persistido pelo instalador do `cms/`, com prefixo configuravel de tabelas e limites claros entre entidades de conteudo, configuracoes, usuarios, permissoes e auditoria.

## Prefixo de tabelas

- Todo nome fisico de tabela nasce a partir de `db.prefix`, configurado no instalador e gravado em `cms/config/config.php`.
- O valor padrao permanece `cms_`.
- O prefixo aceita apenas letras, numeros e underscore.
- O codigo deve sempre resolver nomes fisicos via `Cms\Core\Database\Connection::table()` ou logica equivalente; nomes sem prefixo sao apenas aliases conceituais desta documentacao.

## Entidades iniciais

### Usuarios e acesso

| Alias logico | Responsabilidade |
| --- | --- |
| `users` | Identidade administrativa, credenciais hash, status e timestamps operacionais |
| `roles` | Catalogo RBAC minimo (`author`, `editor`, `super_admin`) |
| `permissions` | Acoes de negocio grantaveis, independentes de rota |
| `user_roles` | Vinculo N:N entre usuarios e papeis com trilha de atribuicao |
| `role_permissions` | Matriz N:N entre papeis e permissoes |

### Conteudo

| Alias logico | Responsabilidade |
| --- | --- |
| `contents` | Documento canonico, ownership, slug, status e ponteiros para revisoes correntes/publicadas |
| `content_revisions` | Snapshots versionados do conteudo editorial com dados de revisao/publicacao |

### Configuracoes

| Alias logico | Responsabilidade |
| --- | --- |
| `settings` | Chaves agrupadas por dominio (`core`, `seo`, `system`), tipo de valor, escopo publico e autoria da alteracao |

### Auditoria

| Alias logico | Responsabilidade |
| --- | --- |
| `audit_log` | Trilha append-only com actor, alvo, acao, request/correlation id e metadados JSON |

## Regras estruturais

- `users.email`, `roles.role_key` e `permissions.permission_key` sao unicos.
- `contents` garante `UNIQUE (content_type, slug)` para impedir colisao silenciosa por tipo.
- `content_revisions` garante `UNIQUE (content_id, revision_number)` para versionamento estavel.
- `settings` garante `UNIQUE (setting_group, setting_key)` para separar configuracao editorial de infraestrutura.
- `audit_log` prioriza indices por actor, alvo e data para filtros administrativos futuros.

## Seeds iniciais

O instalador deve semear:

1. os papeis `author`, `editor` e `super_admin`;
2. o catalogo minimo de permissoes editoriais, administrativas e de auditoria;
3. o mapa default de permissoes por papel;
4. o primeiro usuario `super_admin`;
5. configuracoes bootstrap:
   - `core.site_name`
   - `core.project_mode`
   - `core.admin_path`
   - `core.site_timezone`
   - `system.installed_at`
   - `seo.default_title`
   - `seo.default_description`
6. um evento `install.completed` em `audit_log`.

## Fora do baseline imediato

- taxonomias, menus e biblioteca de midia;
- publicacao multi-site;
- politicas avancadas de ownership por tenant;
- migracoes incrementais de schema;
- exclusao fisica rotineira de registros auditaveis.

Esses dominios continuam previstos nos documentos de CRUD, workflow editorial e multi-site, mas nao precisam estar materializados no schema inicial para esta fase.
