Source: card.service.js

/**
 *  @fileOverview A service that handles CRUD operations for user's cards
 *
 *  @author       Ralfs Lagzda
 *
 *  @requires     NPM:lodash
 *  @requires     ../models/card
 */
const _ = require('lodash');
const Card = require('../models/card');
/**
 * List all cards
 *
 * @memberOf CardService
 * @function list
 * @param {Object} params the parameters to limit the query to desired results
 * @returns {Promise<Card[]>} Promise that eventually resolves an array of cards or throws error
 */
const list = params => new Promise(async (resolve, reject) => {
  try {
    if (typeof (params) !== 'object' || _.isEmpty(params)) throw (Error('Invalid parameters'));
    const cards = await Card.find(params)
      .populate('description')
      .populate('email')
      .populate('telephone');
    resolve(cards);
  } catch (err) {
    reject(err);
  }
});
/**
 * Create a card
 *
 * @memberOf CardService
 * @function create
 * @param {String} userId the owner of the card
 * @param {Object} card the card object to create
 * @returns {Promise<Card>} Promise that eventually creates and resolves a card or throws error
 */
const create = (userId, card) => new Promise(async (resolve, reject) => {
  try {
    const creatableCard = await Object.assign(card, { createdBy: userId });
    resolve(new Card(creatableCard).save());
  } catch (err) {
    reject(err);
  }
});
/**
 * Retrieves a single card by ID
 *
 * @memberOf CardService
 * @function read
 * @param {String} cardId the ID of the card
 * @returns {Promise<Card>} Promise that eventually resolves a card or throws error
 */
const read = cardId => new Promise(async (resolve, reject) => {
  try {
    const card = await Card.findById(cardId).lean()
      .populate('description')
      .populate('email')
      .populate('telephone');
    resolve(card);
  } catch (err) {
    reject(err);
  }
});
/**
 * Updates a single card
 *
 * @memberOf CardService
 * @function update
 * @param {String} cardId the ID of the card
 * @param {Object} body key/value pairs of the fields that should be changed
 * @returns {Promise<Card>} Promise that eventually updates and resolves a card or throws error
 */
const update = (cardId, body) => new Promise(async (resolve, reject) => {
  try {
    const updatedCard = await Object.assign(await Card.findById(cardId), body);
    resolve(updatedCard.save());
  } catch (err) {
    reject(err);
  }
});
/**
 * Deletes a single card
 *
 * @memberOf CardService
 * @function del
 * @param {String} cardId the ID of the card
 * @returns {Promise} Promise that eventually deletes a card or throws error
 */
const del = cardId => new Promise(async (resolve, reject) => {
  try {
    await Card.remove({ _id: cardId });
    resolve();
  } catch (err) {
    reject(err);
  }
});
/**
 * A service that handles CRUD operations for user's cards
 * @namespace CardService
 */
module.exports = {
  list,
  create,
  read,
  update,
  del,
};