- Para atualizar a senha podemos criar um método semelhante ao que criamos na aula anterior, mas específico para atualização de senhas:
- Obs.: Utilizamos a opção “individualHooks”: true para que o hook de hash da senha seja executado (por padrão esses hooks individuas, como beforeSave, não seriam executados no método update).
// src/services/userService.ts
// ...
updatePassword: async (id: string | number, password: string) => {
const [affectedRows, updatedUsers] = await User.update({
password
}, {
where: { id },
individualHooks: true,
returning: true
})
return updatedUsers[0]
},
// ...
- Agora podemos criar um método no controlador para a rota de atualização de senha:
- Obs.: Aqui também utilizamos o nosso método checkPassword para fazer uma nova verificação da senha atual antes de atualizar a senha (por questões de segurança).
// src/controllers/usersController.ts
import { Response } from 'express'
import { AuthenticatedRequest } from '../middlewares/auth'
import { userService } from '../services/user-service'
export const usersController = {
// ...
// PUT /users/current/password
updatePassword: async (req: AuthenticatedRequest, res: Response) => {
const user = req.user
const { currentPassword, newPassword } = req.body
if (!user) {
return res.status(401).json({ message: 'Não autorizado!' })
}
try {
user.checkPassword(currentPassword, async (err, isSame) => {
if (err) {
return res.status(400).json({ message: err.message })
}
if (!isSame) {
return res.status(400).json({ message: 'Senha incorreta' })
}
await userService.updatePassword(user.id, newPassword)
return res.status(204).send()
})
} catch (err) {
if (err instanceof Error) {
return res.status(400).json({ message: err.message })
}
}
}
}
- Agora é só criar a rota e incluir o método:
// src/routes.ts
// ...
router.get('/users/current', ensureAuth, usersController.show)
router.get('/users/current/watching', ensureAuth, usersController.watching)
router.put('/users/current', ensureAuth, usersController.update)
router.put('/users/current/password', ensureAuth, usersController.updatePassword)
// ...