Home Reference Source Repository

src/controllers/UserController.js

// Import the neccesary modules.
import passport from 'passport';

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

/** Class for CRUD operations for users. */
export default class UserController {

  /** Create a new UserController object */
  constructor() {
    /**
     * The projection used for getting multiple users.
     * @type {Object}
     */
    UserController._projection = {
      username: 1,
      firstname: 1,
      lastname: 1,
      email: 1
    };
  }

  /**
   * Register a new user.
   * @param {Request} req - The express request object.
   * @param {Response} res - The express response object.
   * @param {function} next - The next function for Express.
   * @returns {JSON} - The authentication token for the user.
   */
  register(req, res, next) {
    const { firstname, lastname, email, username, password } = req.body;

    if (!username || !password) return res.status(400).json({
      message: 'Please fill out all fields'
    });

    const user = new User({
      firstname,
      lastname,
      email,
      username,
      password
    });

    user._id = username;
    user.save(err => {
      if (err) return next(err);
      return res.json({
        user,
        token: user.generateJWT()
      })
    });
  }

  /**
   * Login with an user.
   * @param {Request} req - The express request object.
   * @param {Response} res - The express response object.
   * @param {function} next - The next function for Express.
   * @returns {JSON} - The authentication token for the user.
   */
  login(req, res, next) {
    const { username, password } = req.body;

    if (!username || !password) return res.status(400).json({
      message: 'Please fill out all fields'
    });

    const auth = passport.authenticate('local', (err, user, info) => {
      if (err) return next(err);
      if (!user) return res.json(info);
      return res.json({
        user,
        token: user.generateJWT()
      });
    });

    return auth(req, res, next);
  }

  /**
   * Get an user based on the id.
   * @param {Request} req - The express request object.
   * @param {Response} res - The express response object.
   * @param {function} next - The next function for Express.
   * @returns {JSON} - A user based on the given id.
   */
  getUser(req, res, next) {
    return User.findOne({
      _id: req.params.user
    }).exec()
      .then(user => res.json(user))
      .catch(err => next(err));
  }

}