| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 | import { ReactiveCache } from '/imports/reactiveCache';// We use activities fields at two different places:// 1. The board sidebar// 2. The card activity tab// We use this publication to paginate for these two publications.Meteor.publish('activities', (kind, id, limit, showActivities) => {  check(    kind,    Match.Where(x => {      return ['board', 'card'].indexOf(x) !== -1;    }),  );  check(id, Match.Maybe(String));  check(limit, Number);  check(showActivities, Boolean);  // Return empty cursor if id is null or undefined  if (!id) {    return this.ready();  }  // Get linkedBoard  let linkedElmtId = [id];  if (kind == 'board') {    ReactiveCache.getCards({      "type": "cardType-linkedBoard",      "boardId": id}      ).forEach(card => {        linkedElmtId.push(card.linkedId);    });  }  const selector = showActivities    ? { [`${kind}Id`]: { $in: linkedElmtId } }    : { $and: [{ activityType: 'addComment' }, { [`${kind}Id`]: { $in: linkedElmtId } }] };  const ret = ReactiveCache.getActivities(selector,    {      limit,      sort: { createdAt: -1 },    },    true,  );  return ret;});
 |