const DataLoader = require('dataloader'); const util = require('./util'); const ActionsService = require('../../services/actions'); const ActionModel = require('../../models/action'); /** * Gets actions based on their item id's. */ const genActionsByItemID = (_, item_ids) => { return ActionsService.findByItemIdArray(item_ids).then( util.arrayJoinBy(item_ids, 'item_id') ); }; /** * Looks up actions based on the requested id's all bounded by the user. * @param {Object} context the context of the request * @param {Array} ids array of id's to get * @return {Promise} resolves to the promises of the requested actions */ const genActionSummariessByItemID = ({ user = {} }, item_ids) => { return ActionsService.getActionSummaries(item_ids, user.id).then( util.arrayJoinBy(item_ids, 'item_id') ); }; /** * Search for actions based on their action_type and item_type and ensures that * the actions returned have unique item id's. * @param {String} action_type the action to search by * @param {String} item_type the item id to search by * @return {Promise} resolves to distinct items actions */ const getItemIdsByActionTypeAndItemType = (_, action_type, item_type) => { return ActionModel.distinct('item_id', { action_type, item_type }); }; /** * Creates a set of loaders based on a GraphQL context. * @param {Object} context the context of the GraphQL request * @return {Object} object of loaders */ module.exports = context => ({ Actions: { getByID: new DataLoader(ids => genActionsByItemID(context, ids)), getSummariesByItemID: new DataLoader(ids => genActionSummariessByItemID(context, ids) ), getByTypes: ({ action_type, item_type }) => getItemIdsByActionTypeAndItemType(context, action_type, item_type), }, });