{
  "id": "migration-base-01-users",
  "title": "Migration base 01 — users",
  "description": "Estado atual das tabelas de autenticação, reset de senha e sessões.",
  "type": "migration-reference",
  "status": "implemented",
  "visibility": "public",
  "tags": [
    "sge/migrations",
    "sge/autenticacao",
    "sge/banco-de-dados"
  ],
  "related": [
    "cast-cpfcast",
    "migration-02-user-personal-data",
    "model-user",
    "provider-fortifyserviceprovider"
  ],
  "sourceRefs": [
    "https://github.com/sge-suite/sge/blob/master/database/migrations/0001_01_01_000000_create_users_table.php"
  ],
  "authors": [],
  "updated": null,
  "diagram": null,
  "body": "> [!success] Estado\n> Implementada no arquivo `0001_01_01_000000_create_users_table.php`. É a base das contas e mantém o CPF como identificador único da pessoa.\n\n## Tabelas criadas\n\n### `users`\n\n| Campo            | Contrato atual                         |\n| ---------------- | -------------------------------------- |\n| `id`             | bigint, chave primária.                |\n| `name`           | string, obrigatório.                   |\n| `email`          | string, único.                         |\n| `cpf`            | string(11), único; hoje está na conta. |\n| `password`       | string.                                |\n| `remember_token` | token padrão de sessão.                |\n| timestamps       | `created_at`/`updated_at`.             |\n\n### `password_reset_tokens`\n\n`email` é a chave primária; `token` guarda o token do broker; `created_at` é nullable. A política do projeto deve evitar copiar token para logs ou `email_messages`.\n\n### `sessions`\n\n`id` é a chave primária; `user_id` é nullable e indexado; há `ip_address`, `user_agent`, `payload` e `last_activity` indexado. O arquivo atual não cria FK para `users`.\n\n## Rollback atual\n\n`down()` usa `dropIfExists()` para `users`, `password_reset_tokens` e `sessions`. Como não há FK explícita em `sessions`, a ordem atual executa.\n\n## Checklist\n\n- [x] Criar as três tabelas base.\n- [x] Tornar e-mail e CPF únicos no estado atual.\n- [x] Configurar broker de reset para `password_reset_tokens`.\n- [x] Manter CPF e [CpfCast](doc:cast-cpfcast) em `users`; `user_personal_data` guarda dados pessoais atuais e campos profissionais opcionais do supervisor.\n- [ ] Confirmar se `sessions.user_id` deve receber FK no futuro.\n- [ ] Adicionar teste de schema/rollback se essa migration for alterada.\n\n## Próximas referências\n\n- [user_personal_data](doc:migration-02-user-personal-data)\n- [Model User](doc:model-user)\n- [FortifyServiceProvider](doc:provider-fortifyserviceprovider)",
  "sections": [
    {
      "id": "tabelas-criadas",
      "level": 2,
      "title": "Tabelas criadas",
      "text": "",
      "line": 4
    },
    {
      "id": "users",
      "level": 3,
      "title": "users",
      "text": "| Campo            | Contrato atual                         | | ---------------- | -------------------------------------- | | `id`             | bigint, chave primária.                | | `name`           | string, obrigatório.                   | | `email`          | string, único.                         | | `cpf`            | string(11), único; hoje está na conta. | | `password`       | string.                                | | `remember_token` | token padrão de sessão.                | | timestamps       | `created_at`/`updated_at`.             |",
      "line": 6
    },
    {
      "id": "password-reset-tokens",
      "level": 3,
      "title": "password_reset_tokens",
      "text": "`email` é a chave primária; `token` guarda o token do broker; `created_at` é nullable. A política do projeto deve evitar copiar token para logs ou `email_messages`.",
      "line": 18
    },
    {
      "id": "sessions",
      "level": 3,
      "title": "sessions",
      "text": "`id` é a chave primária; `user_id` é nullable e indexado; há `ip_address`, `user_agent`, `payload` e `last_activity` indexado. O arquivo atual não cria FK para `users`.",
      "line": 22
    },
    {
      "id": "rollback-atual",
      "level": 2,
      "title": "Rollback atual",
      "text": "`down()` usa `dropIfExists()` para `users`, `password_reset_tokens` e `sessions`. Como não há FK explícita em `sessions`, a ordem atual executa.",
      "line": 26
    },
    {
      "id": "checklist",
      "level": 2,
      "title": "Checklist",
      "text": "- [x] Criar as três tabelas base. - [x] Tornar e-mail e CPF únicos no estado atual. - [x] Configurar broker de reset para `password_reset_tokens`. - [x] Manter CPF e [CpfCast](doc:cast-cpfcast) em `users`; `user_personal_data` guarda dados pessoais atuais e campos profissionais opcionais do supervisor. - [ ] Confirmar se `sessions.user_id` deve receber FK no futuro. - [ ] Adicionar teste de schema/rollback se essa migration for alterada.",
      "line": 30
    },
    {
      "id": "proximas-referencias",
      "level": 2,
      "title": "Próximas referências",
      "text": "- [user_personal_data](doc:migration-02-user-personal-data) - [Model User](doc:model-user) - [FortifyServiceProvider](doc:provider-fortifyserviceprovider)",
      "line": 39
    }
  ],
  "sourcePath": "content/migration-base-01-users.md",
  "visuals": [],
  "apiVersion": 1
}
