DDCreationStudios/votingApp

View on GitHub
src/serverSideES6/config/passport.js

Summary

Maintainability
B
5 hrs
Test Coverage
/* eslint-disable no-param-reassign*/
// disabling eslint rule since no "reassign" happening ->  creating properties!
import { Strategy as TwitterStrategy } from 'passport-twitter';
import { Strategy as LocalStrategy } from 'passport-local';

import constants from './constants';
import User from '../models/user';

console.log(constants);

export default function (passport) {
  passport.serializeUser((user, done) => {
    console.log(`___SERIALIZE{user}+++${user}`);
    done(null, user.id);
  });

  passport.deserializeUser((id, done) => {
    console.log(`____DESERIALIZE${id}+++${id}`);
    User.findById(id, (err, user) => {
      done(err, user);
    });
  });

  passport.use(
        new TwitterStrategy(constants.TWITTER_STRATEGY, (req, token, tokenSecret, profile, done) => {
  process.nextTick(() => {
    if (!req.user) {
      User.findOne({ 'twitter.id': profile.id }, (err, user) => {
        if (err) return done(err);
        if (user) {
          if (!user.twitter.token) {
            user.twitter.token = token;
            user.twitter.username = profile.username;
            user.twitter.displayName = profile.displayName;
            user.save(() => {
              if (err) return done(err);
              return done(null, user);
            });
          }
          return done(null, user);
        }

                        // if no user is found create one
        const newUser = new User();

        newUser.twitter.id = profile.id;
        newUser.twitter.token = token;
        newUser.twitter.username = profile.username;
        newUser.twitter.displayName = profile.displayName;

        newUser.save(() => {
          if (err) return done(err);
          return done(null, newUser);
        });
      });
    } else {
                    // when user already exists and is logged in
      const user = req.user;

      user.twitter.id = profile.id;
      user.twitter.token = token;
      user.twitter.username = profile.username;
      user.twitter.displayName = profile.displayName;

      user.save((err) => {
        if (err) return done(err);
        return done(null, user);
      });
    }
  });
}),
    );

    //= ==========local signup===================

  passport.use(
        'local-signup',
        new LocalStrategy(constants.LOCAL_STRATEGY, (req, email, password, done) => {
  if (email) {
    email = email.toLowerCase();
  }
  process.nextTick(() => {
    if (!req.user) {
      User.findOne({ 'local.email': email }, (err, user) => {
        if (err) return done(err);
        if (user) {
          return done(null, false, {
            message: 'You cannot sign up with this email because it is already taken!',
          });
        }
                        // create the user
        const newUser = new User();
        newUser.local.email = email;
        newUser.local.password = newUser.generateHash(password);
        newUser.save(() => {
          if (err) return done(err);
          return done(null, newUser);
        });
      });
                    // if the user is logged in with a provider
    } else if (!req.user.local.email) {
      User.findOne({ 'local.email': email }, (err, user) => {
        if (err) return done(err);
        if (user) {
          return done(null, false, {
            message: 'You cannot sign up with this email because it is already taken!',
          });
        }
        user = req.user;
        user.local.email = email;
        user.local.password = user.generateHash(password);
        user.save(() => {
          if (err) return done(err);
          return done(null, user);
        });
      });
    } else {
                    // user is logged in
      return done(null, req.user);
    }
  });
}),
    );

    // =========== local login
  passport.use(
        'local-login',
        new LocalStrategy(constants.LOCAL_STRATEGY, (req, email, password, done) => {
  if (email) email = email.toLowerCase();
  process.nextTick(() => {
    User.findOne({ 'local.email': email }, (err, user) => {
      if (err) return done(err);

      if (req.user) {
        return done(null, false, {
          message: `You are already logged in as ${req.user}`,
        });
      }

      if (!user) {
        return done(null, false, {
          message: 'User cannot be found in DB!',
        });
      }

      if (!user.validPassword(password)) {
        return done(null, false, {
          message: 'Password is completely wrong! :D',
        });
      }
      return done(null, user);
    });
  });
}),
    );
}