import * as Yup from 'yup'; import User from '../models/User'; class UserController { async store(req, res) { const schema = Yup.object().shape({ name: Yup.string().required(), email: Yup.string() .email() .required(), password: Yup.string() .required() .min(6), }); if (!(await schema.isValid(req.body))) { return res.status(400).json({ error: 'Validation fails' }); } const userExists = await User.findOne({ where: { email: req.body.email } }); if (userExists) { return res.status(400).json({ error: 'User already exists.' }); } const { id, name, email, provider } = await User.create(req.body); return res.json({ id, name, email, provider }); } async update(req, res) { const schema = Yup.object().shape({ name: Yup.string(), email: Yup.string().email(), oldPassword: Yup.string().min(6), password: Yup.string() .min(6) .when('oldPassword', (oldPassword, field) => oldPassword ? field.required() : field ), confirmPassword: Yup.string().when('password', (password, field) => password ? field.required().oneOf([Yup.ref('password')]) : field ), }); if (!(await schema.isValid(req.body))) { return res.status(400).json({ error: 'Validation fails' }); } const { email, oldPassword } = req.body; const user = await User.findByPk(req.userId); if (user.email !== email) { const userExists = await User.findOne({ where: { email }, }); if (userExists) { return res.status(400).json({ error: 'User already exists.' }); } } if (oldPassword && !(await user.checkPassword(oldPassword))) { return res.status(401).json({ error: 'Password does not match.' }); } const { id, name, provider } = await user.update(req.body); return res.json({ id, name, email, provider }); } } export default new UserController();
here it creates a normal user with the password 123456
here it should work, since the old password is the same as the password of the created user, and it should update the new password
I want to try to understand how to make him understand the current password as oldpassword and update the password
This can be done with Yup's ref function. We are able to reference the value of password with ref . We use the oneOf function to ensure that passwordConfirmation either matches password or if it is left blank and matches null then it passes the validation for the time being.
To compare if a password is the same as a confirmPassword we can use ref and reference our password field. We use the oneOf option and say that the confirmPassword should be oneOf a reference. Meaning it should match password.
Try this out:
import * as Yup from 'yup'; validationSchema: Yup.object({ password: Yup.string().required('Password is required'), passwordConfirmation: Yup.string() .oneOf([Yup.ref('password'), null], 'Passwords must match') });
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With