/**
* @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,
};