Skip to content

Commit 60f8da7

Browse files
committed
verification status change & resend verification email done
1 parent 9faf6cd commit 60f8da7

File tree

4 files changed

+51
-8
lines changed

4 files changed

+51
-8
lines changed

controllers/auth.js

+42
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,52 @@ const register = async(req, res) => {
4242
})
4343
};
4444

45+
// Зміна статусу email-у на "верифікований" та очищення верифікаційного коду в БД після підтвердження пошти в отриманому листі
46+
const verifyEmail = async(req, res) => {
47+
const { verificationCode } = req.params;
48+
const user = await User.findOne({verificationCode}); // перевіряємо чи є в БД користувач з таким кодом
49+
if(!user) {
50+
throw HttpError(401, 'Email is not found')
51+
}
52+
await User.findByIdAndUpdate(user._id, {verify: true, verificationCode: ''}); // якщо є такий користувач, то вносимо зміни до БД
53+
54+
console.log('user:', user);
55+
56+
res.json({
57+
message: "The email is successfully verified."
58+
})
59+
};
60+
61+
const resendVerifyEmail = async(req, res) => {
62+
const { email } = req.body;
63+
const user = await User.findOne({email});
64+
if(!user){
65+
throw HttpError(401, 'Email is not found');
66+
}
67+
if(user.verify) { //якщо користувач не підтвердив email (user.verify = false)
68+
throw HttpError(401, 'The email is already verified')
69+
}
70+
const verifyEmail = {
71+
to: email,
72+
subject: 'Verify email',
73+
html: `<a target='_blank' href="${BASE_URL}/api/auth/verify/${user.verificationCode}">Let's verify your email so you can start login. Click here to verify.</a>`,
74+
};
75+
await sendEmail(verifyEmail);
76+
77+
res.json({
78+
message: 'Verification email is resent.'
79+
})
80+
}
81+
4582
const login = async(req, res) => {
4683
const { email, password } = req.body;
4784
const user = await User.findOne({email});
4885
if(!user) {
4986
throw HttpError(401, 'Email or password invalid'); //більш безпечний варіант писати ...або..., а не один email
5087
}
88+
if(!user.verify) { //якщо користувач не підтвердив email (user.verify = false)
89+
throw HttpError(401, 'Email not verified')
90+
}
5191
const passwordCompare = await bcrypt.compare(password, user.password); //порівнюємо введений пароль з тим, що є в БД (true/false)
5292
if(!passwordCompare) { //якщо false
5393
throw HttpError(401, 'Email or pasword invalid');
@@ -132,6 +172,8 @@ const updateAvatar = async(req, res) => {
132172

133173
export default { //огортаємо все в try/catch
134174
register: ctrlWrapper(register),
175+
verifyEmail: ctrlWrapper(verifyEmail),
176+
resendVerifyEmail: ctrlWrapper(resendVerifyEmail),
135177
login: ctrlWrapper(login),
136178
getCurrent: ctrlWrapper(getCurrent), //тут ми не викидаємо помилку, але для універсальності
137179
logout: ctrlWrapper(logout),

helpers/sendEmail.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import sgMail from '@sendgrid/mail';
22
import 'dotenv/config';
33

44
const { SENDGRID_API_KEY, EMAIL_FROM } = process.env; // забираємо зі змінних оточень ключ до sendgrid
5-
// const { SENDGRID_API_KEY } = process.env;
65

76
sgMail.setApiKey(SENDGRID_API_KEY); // передаємо sendgrid ключ
87

@@ -21,7 +20,7 @@ const sendEmail = async (data) => {
2120
const email = { ...data, from: EMAIL_FROM };
2221
await sgMail.send(email)
2322
.then(() => console.log('Email was sent successfuly'))
24-
.catch(error => console.log(`hello from catch 2:`, error.message))
23+
.catch(error => console.log(error.message))
2524
// return true;
2625
};
2726

models/user.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ const userSchema = new Schema({ //mongoose-схема - перевіряє те
3232
},
3333
verify: { // чи підтвердив користувач свій email перед тим як залогінитись
3434
type: Boolean,
35-
default: false, // після реєстрації, але до логіну - false
35+
default: false // після реєстрації, але до логіну - false
3636
},
37-
verificationCode: { // або verificationToken - код підтвердження (згенерований nanoid), який приходить в посиланні на пошту
37+
verificationCode: { // або verificationToken - код (згенерований nanoid), що зашитий у лінку, що приходить на пошту для підтвердження email-у
3838
type: String,
39-
// default: ''
40-
required: [true, 'Verify token is required'],
39+
default: '',
40+
required: [true, 'Token verification is required']
4141
}
4242
}, { versionKey: false, timestamps: true });
4343

routes/api/auth.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import { authenticate, upload } from '../../middlewares/index.js';
77
const router = express.Router();
88

99
router.post('/register', validateBody(schemas.registerSchema), authCtrl.register); //signup
10-
// router.get('/verify/:verificationCode', authCtrl.verifyEmail);
11-
// router.post('/verify', validateBody(schemas.emailSchema), authCtrl.resendverifyEmail);
10+
11+
router.get('/verify/:verificationCode', authCtrl.verifyEmail);
12+
router.post('/verify', validateBody(schemas.emailSchema), authCtrl.resendVerifyEmail);
13+
1214
router.post('/login', validateBody(schemas.loginSchema), authCtrl.login); //signin
1315

1416
router.get('/current', authenticate, authCtrl.getCurrent);

0 commit comments

Comments
 (0)