| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 | // a map of notification service, like email, web, IM, qq, etc.// serviceName -> callback(user, title, description, params)// expected arguments to callback:// - user: Meteor user object// - title: String, TAPi18n key// - description, String, TAPi18n key// - params: Object, values extracted from context, to used for above two TAPi18n keys//   see example call to Notifications.notify() in models/activities.jsconst notifyServices = {};Notifications = {  subscribe: (serviceName, callback) => {    notifyServices[serviceName] = callback;  },  unsubscribe: (serviceName) => {    if (typeof notifyServices[serviceName] === 'function')      delete notifyServices[serviceName];  },  // filter recipients according to user settings for notification  getUsers: (participants, watchers) => {    const userMap = {};    participants.forEach((userId) => {      if (userMap[userId]) return;      const user = Users.findOne(userId);      if (user && user.hasTag('notify-participate')) {        userMap[userId] = user;      }    });    watchers.forEach((userId) => {      if (userMap[userId]) return;      const user = Users.findOne(userId);      if (user && user.hasTag('notify-watch')) {        userMap[userId] = user;      }    });    return _.map(userMap, (v) => v);  },  notify: (user, title, description, params) => {    for(const k in notifyServices) {      const notifyImpl = notifyServices[k];      if (notifyImpl && typeof notifyImpl === 'function') notifyImpl(user, title, description, params);    }  },};
 |