# Salvando nova senha (se token for valido)

O usuário vai entrar na tela de nova senha e digitar ela e o backend vai conferir se o token ainda é valido.

### Consulta para encontrar o token não expirado

Utilizaremos ela no PasswordRecoverRepository.

```java
@Query("SELECT obj FROM PasswordRecover obj WHERE obj.token = :token AND obj.expiration > :now")
List<PasswordRecover> searchValidTokens(String token, Instant now);
```

### No AuthController:

Criaremos um PUT (afinal, iremos inserir uma nova senha).

1. A URL será "/new-password"
2. Retornará Void
3. O método criado (para o service) será "saveNewPassword"
4. @Valid e @RequestBody, passando um NewPasswordDTO (terá somente um String token e String password com critério de validação), veja:

**Critérios de validação de senha:**

Mínimo 8 caracteres e @NotBlank.

### No AuthService:

No service, criar o método com Transactional e fazer a lógica, primeiro verificando se o token está expirado.

Se a lista que retornará do repository for igual a zero, lançaremos a exceção ResourceNotFoundException.

Se o token for válido, salvaremos a senha no banco.

O que vem de resultado nessa lista (advinda do PasswordRecover), ela possui como atributo o email do usuário, então faremos o seguinte:

1. Instanciaremos um usuário, e no `result.get(0)` (o primeiro token que chegou), podemos acessar o atributo com `.getEmail()`
2. Alocaremos isso em um findByEmail do userRepository
3. Pegaremos o usuário e daremos um `setPassword`, atualizando a sua senha. Como a senha é tem a criptografia, injetaremos o BCrypt (PasswordEncoder) lá em cima
4. Após isso, usar o `save`.

Para testar, só passar o NewPasswordDTO na URL "/auth/new-password" com o token + password. O token é o recoverToken (UUID) que chegará no email.

\\
