lib/decorator/passport-req.js

Summary

Maintainability
C
1 day
Test Coverage
"use strict";

exports = module.exports = function decorate(req) {

  /**
   * Intiate a login session for `user`.
   *
   * Options:
   *   - `session`  Save login state in session, defaults to _true_
   *
   * Examples:
   *
   *     req.logIn(user, { session: false });
   *
   *     req.logIn(user, function(err) {
     *       if (err) { throw err; }
     *       // session saved
     *     });
   *
   * @param {User} user
   * @param {Object} options
   * @param {Function} done
   * @api public
   */
  req.login =
    req.logIn = function (user, options, done) {
      if (typeof options == "function") { // arguments is user, done
        done = options;
        options = {};
      }
      options = options || {};

      let property = "user";
      if (this._passport && this._passport.instance) {
        property = this._passport.instance._userProperty || property;
      }
      let session = (options.session === undefined) ? true : options.session;

      this[property] = user;
      if (session) {
        if (!this._passport) {
          throw new Error("passport.initialize() middleware not in use");
        }
        if (typeof done != "function") {
          throw new Error("req#login requires a callback function");
        }

        let self = this;
        this._passport.instance.serializeUser(user, this, function (err, obj) {
          if (err) {
            self[property] = null;
            return done(err);
          }
          self._passport.session.user = obj;
          done();
        });
      } else {
        done && done();
      }
    };

  /**
   * Terminate an existing login session.
   *
   * @api public
   */
  req.logout =
    req.logOut = function () {
      let property = "user";
      if (this._passport && this._passport.instance) {
        property = this._passport.instance._userProperty || property;
      }

      this[property] = null;
      if (this._passport && this._passport.session) {
        delete this._passport.session.user;
      }
    };

  /**
   * Test if request is authenticated.
   *
   * @return {Boolean}
   * @api public
   */
  req.isAuthenticated = function () {
    let property = "user";
    if (this._passport && this._passport.instance) {
      property = this._passport.instance._userProperty || property;
    }

    return (this[property]) ? true : false;
  };

  /**
   * Test if request is unauthenticated.
   *
   * @return {Boolean}
   * @api public
   */
  req.isUnauthenticated = function () {
    return !this.isAuthenticated();
  };
};