Home Reference Source

src/controllers/user.controller.js

import {
  ACCEPTED
} from 'http-status';
import {
  conflict, notFound, badImplementation, forbidden
} from 'boom';
import {
  get, clone, pick,
  merge, isNull, map, isEqual
} from 'lodash';

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

/**
 * This function lists the users
 * @param { Object } request the Hapi request object
 * @param { Function } reply the Hapi reply object
 * @return { Promise } a promise that resolves
 */
export const listUsers = (request, reply) =>
  User.find()
  .exec()
  .then(users => reply(map(users, user => user.profile)))
  .catch(err => reply(badImplementation(err)));

/**
 * This function creates a new user
 * @param { Object } request the Hapi request object
 * @param { Function } reply the Hapi reply object
 * @return { Promise } a promise that resolves
 */
export const createUser = (request, reply) =>
  User
  .create(get(request, 'payload', {}))
  .then(user => reply(user.profile).code(201))
  .catch(err => reply(conflict(err)));

/**
 * This function serves details about the logged user
 * @param { Object } request the Hapi request object
 * @param { Function } reply the Hapi reply object
 * @return { Promise } a promise that resolves
 */
export const detailMe = (request, reply) =>
  User
  .findById(get(request, 'auth.credentials._id', ''))
  .exec()
  .then((user) => {
    if (isNull(user)) {
      return reply(notFound(new Error('User not found')));
    }
    return reply(user.profile);
  })
  .catch(err => reply(badImplementation(err)));

/**
 * This function serves details about a user
 * @param { Object } request the Hapi request object
 * @param { Function } reply the Hapi reply object
 * @return { Promise } a promise that resolves
 */
export const detailUser = (request, reply) =>
  User
  .findById(get(request, 'params.id', ''))
  .exec()
  .then((user) => {
    if (isNull(user)) {
      return reply(notFound(new Error('User not found')));
    }
    return reply(user.profile);
  })
  .catch(err => reply(badImplementation(err)));

/**
 * This function update a given user
 * @param { Object } request the Hapi request object
 * @param { Function } reply the Hapi reply object
 * @return { Promise } a promise that resolves
 */
export const updateUser = (request, reply) =>
  User
  .findById(get(request, 'params.id', ''))
  .exec()
  .then((user) => {
    if (isNull(user)) {
      return reply(notFound(new Error('User not found')));
    }
    return merge(clone(user),
      pick(get(request, 'payload', {}), ['email', 'password', 'role']))
      .save()
      .then(user => reply(user.profile));
  })
  .catch(err => reply(badImplementation(err)));

/**
 * This function deletes a given user
 * @param { Object } request the Hapi request object
 * @param { Function } reply the Hapi reply object
 * @return { Promise } a promise that resolves
 */
export const deleteUser = (request, reply) =>
  User
  .findById(get(request, 'params.id', ''))
  .exec()
  .then((user) => {
    if (isNull(user)) {
      return reply(notFound(new Error('User not found')));
    }

    if (isEqual(get(user, '_id', '').toString(),
      get(request, 'auth.credentials._id', ''))) {
      return reply(forbidden(new Error('Cannot delete oneself')));
    }
    return User
      .remove({ _id: get(request, 'params.id', '') }).exec()
      .then(() => reply('deleted').code(ACCEPTED));
  })
  .catch(err => reply(badImplementation(err)));