{
  "id": "action-resetuserpassword",
  "title": "Action — ResetUserPassword",
  "description": "Implementação do contrato Fortify para validar e salvar a nova senha.",
  "type": "technical-reference",
  "status": "implemented",
  "visibility": "public",
  "tags": [
    "sge/actions",
    "sge/autenticacao",
    "sge/seguranca"
  ],
  "related": [
    "concern-passwordvalidationrules",
    "e-mails-notificacoes-e-entregas",
    "providers",
    "model-user"
  ],
  "sourceRefs": [
    "https://github.com/sge-suite/sge/blob/master/app/Actions/Fortify/ResetUserPassword.php"
  ],
  "authors": [],
  "updated": null,
  "diagram": null,
  "body": "## Fluxo\n\nImplementa `Laravel\\Fortify\\Contracts\\ResetsUserPasswords`:\n\n1. Recebe `User $user` e o array de entrada.\n2. Valida `password` usando [`PasswordValidationRules`](doc:concern-passwordvalidationrules).\n3. Usa `forceFill()` para atribuir a senha.\n4. Usa `save()`; o cast `hashed` do Model transforma o valor antes da persistência.\n\nNão cria token, não envia e-mail e não registra conteúdo sensível; o fluxo de solicitação do token fica no Fortify/broker.\n\n## Checklist\n\n- [x] Registrar Action no `FortifyServiceProvider`.\n- [x] Reutilizar regras de senha.\n- [x] Persistir senha via cast `hashed` do `User`.\n- [x] Testar redefinição bem-sucedida e o evento `password_changed` sem senha/hash no Activity Log.\n- [x] Manter tokens/URLs fora do Activity Log e das tabelas `email_messages` e `email_delivery_attempts`; a Notification de reset é enfileirada e criptografada.\n- [ ] Ampliar testes de token expirado/reutilizado e respostas para solicitação repetida.\n\n## Relacionamentos\n\n- [Providers](doc:providers)\n- [Model User](doc:model-user)\n- [PasswordValidationRules](doc:concern-passwordvalidationrules)",
  "sections": [
    {
      "id": "fluxo",
      "level": 2,
      "title": "Fluxo",
      "text": "Implementa `Laravel\\Fortify\\Contracts\\ResetsUserPasswords`:  1. Recebe `User $user` e o array de entrada. 2. Valida `password` usando [`PasswordValidationRules`](doc:concern-passwordvalidationrules). 3. Usa `forceFill()` para atribuir a senha. 4. Usa `save()`; o cast `hashed` do Model transforma o valor antes da persistência.  Não cria token, não envia e-mail e não registra conteúdo sensível; o fluxo de solicitação do token fica no Fortify/broker.",
      "line": 1
    },
    {
      "id": "checklist",
      "level": 2,
      "title": "Checklist",
      "text": "- [x] Registrar Action no `FortifyServiceProvider`. - [x] Reutilizar regras de senha. - [x] Persistir senha via cast `hashed` do `User`. - [x] Testar redefinição bem-sucedida e o evento `password_changed` sem senha/hash no Activity Log. - [x] Manter tokens/URLs fora do Activity Log e das tabelas `email_messages` e `email_delivery_attempts`; a Notification de reset é enfileirada e criptografada. - [ ] Ampliar testes de token expirado/reutilizado e respostas para solicitação repetida.",
      "line": 12
    },
    {
      "id": "relacionamentos",
      "level": 2,
      "title": "Relacionamentos",
      "text": "- [Providers](doc:providers) - [Model User](doc:model-user) - [PasswordValidationRules](doc:concern-passwordvalidationrules)",
      "line": 21
    }
  ],
  "sourcePath": "content/action-resetuserpassword.md",
  "visuals": [],
  "apiVersion": 1
}
