Code coverage report for common/models/user.js

Statements: 16.67% (11 / 66)      Branches: 0% (0 / 32)      Functions: 8.33% (1 / 12)      Lines: 17.19% (11 / 64)      Ignored: none     

All files » common/models/ » user.js
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 1701 1     1         1 1   1                                                                   1                 1                                                                                         1             1                                                                     1                                                      
var debug = require('debug')('freecc:user:remote');
var blacklistedUsernames =
  require('../../server/utils/constants').blacklistedUsernames;
 
module.exports = function(User) {
  // NOTE(berks): user email validation currently not needed but build in. This
  // work around should let us sneak by
  // see:
  // https://github.com/strongloop/loopback/issues/1137#issuecomment-109200135
  delete User.validations.email;
  debug('setting up user hooks');
  // send verification email to new camper
  User.afterRemote('create', function(ctx, user, next) {
    debug('user created, sending email');
    if (!user.email) { return next(); }
 
    var mailOptions = {
      type: 'email',
      to: user.email,
      from: 'Team@freecodecamp.com',
      subject: 'Welcome to Free Code Camp!',
      redirect: '/',
      text: [
        'Greetings from San Francisco!\n\n',
        'Thank you for joining our community.\n',
        'Feel free to email us at this address if you have ',
        'any questions about Free Code Camp.\n',
        'And if you have a moment, check out our blog: ',
        'blog.freecodecamp.com.\n',
        'Good luck with the challenges!\n\n',
        '- the Free Code Camp Volunteer Team'
      ].join('')
    };
    user.verify(mailOptions, function(err) {
      if (err) { return next(err); }
      debug('verification email sent');
      ctx.req.flash('success', {
        msg: [
          'Please check your email and click on the verification link '
          + 'before logging in.'
        ]
      });
      ctx.res.redirect('/');
    });
  });
 
  User.afterRemote('confirm', function(ctx) {
    ctx.req.flash('success', {
      msg: [
        'You\'re email has been confirmed!'
      ]
    });
    ctx.res.redirect('/email-signin');
  });
 
  User.afterRemote('login', function(ctx, instance, next) {
    var res = ctx.res;
    var req = ctx.req;
 
    User.findOne({where: {email: ctx.args.credentials.email}},
      function(err, response) {
        if (err) {
          return next(err);
        }
        if (response.emailVerified !== true) {
          return res.redirect('/');
        }
        User.login({
          email: ctx.args.credentials.email,
          password: ctx.args.credentials.password,
          ttl: Infinity
        }, function(err, accessToken) {
          if (err) {
            req.flash('errors', {
              msg: [
                'Invalid username or password.'
              ]
            });
            return res.redirect('/');
          }
          var config = {
            signed: !!req.signedCookies,
            maxAge: accessToken.ttl
          };
          if (accessToken && accessToken.id) {
            res.cookie('access_token', accessToken.id, config);
            res.cookie('userId', accessToken.userId, config);
          }
          req.logIn(response, function(err) {
            if (err) {
              return next(err);
            }
            req.flash('success', { msg: 'Success! You are logged in.' });
            return res.redirect('/');
          });
        });
      });
    return res.redirect('/');
  });
 
  User.afterRemote('logout', function(ctx, result, next) {
    var res = ctx.result;
    res.clearCookie('access_token');
    res.clearCookie('userId');
    next();
  });
 
  User.doesExist = function doesExist(username, email, cb) {
    if (!username && !email) {
      return process.nextTick(function() {
        cb(null, false);
      });
    }
    debug('checking existence');
 
    // check to see if username is on blacklist
    if (username && blacklistedUsernames.indexOf(username) !== -1) {
      return cb(null, true);
    }
 
    var where = {};
    if (username) {
      where.username = username.toLowerCase();
    } else {
      where.email = email ? email.toLowerCase() : email;
    }
    debug('where', where);
    User.count(
      where,
      function (err, count) {
        if (err) {
          debug('err checking existance: ', err);
          return cb(err);
        }
        if (count > 0) {
          return cb(null, true);
        }
        return cb(null, false);
      }
    );
  };
 
  User.remoteMethod(
    'doesExist',
    {
      description: 'checks whether a user exists using email or username',
      accepts: [
        {
          arg: 'username',
          type: 'string'
        },
        {
          arg: 'email',
          type: 'string'
        }
      ],
      returns: [
        {
          arg: 'exists',
          type: 'boolean'
        }
      ],
      http: {
        path: '/exists',
        verb: 'get'
      }
    }
  );
};