File size: 1,968 Bytes
3b6afc0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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;