const PassportLocalStrategy = require('passport-local').Strategy; const User = require('../models/User'); const { loginSchema } = require('./validators'); const DebugControl = require('../utils/debug.js'); const passportLogin = async () => new PassportLocalStrategy( { usernameField: 'email', passwordField: 'password', session: false, passReqToCallback: true, }, async (req, email, password, done) => { const { error } = loginSchema.validate(req.body); if (error) { log({ title: 'Passport Local Strategy - Validation Error', parameters: [{ name: 'req.body', value: req.body }], }); return done(null, false, { message: error.details[0].message }); } try { const user = await User.findOne({ email: email.trim() }); if (!user) { log({ title: 'Passport Local Strategy - User Not Found', parameters: [{ name: 'email', value: email }], }); return done(null, false, { message: 'Email does not exists.' }); } user.comparePassword(password, function (err, isMatch) { if (err) { log({ title: 'Passport Local Strategy - Compare password error', parameters: [{ name: 'error', value: err }], }); return done(err); } if (!isMatch) { log({ title: 'Passport Local Strategy - Password does not match', parameters: [{ name: 'isMatch', value: isMatch }], }); return done(null, false, { message: 'Incorrect password.' }); } return done(null, user); }); } catch (err) { return done(err); } }, ); function log({ title, parameters }) { DebugControl.log.functionName(title); if (parameters) { DebugControl.log.parameters(parameters); } } module.exports = passportLogin;