Gitter migration: Setup redirects (rollout pt. 3)
[gitter.git] / server / services / notifications / online-notification-generator-service.js
blob0e321e1e0268979a01226aa1f2459422e023e460
1 'use strict';
3 var Promise = require('bluebird');
4 var appEvents = require('gitter-web-appevents');
5 var resolveUserAvatarUrl = require('gitter-web-shared/avatars/resolve-user-avatar-url');
6 var troupeDao = require('../daos/troupe-dao').lean;
7 var userDao = require('../daos/user-dao').lean;
8 var chatService = require('gitter-web-chats');
9 var _ = require('lodash');
10 var debug = require('debug')('gitter:app:online-notification-generator');
12 function generateChatMessageNotification(troupeId, chatId) {
13   return Promise.all([
14     chatService.findByIdLean(chatId, { fromUserId: 1, virtualUser: 1, text: 1 }),
15     troupeDao.findByIdRequired(troupeId, { uri: 1, oneToOne: true })
16   ])
17     .spread(function(chat, troupe) {
18       if (!chat) throw new Error('Chat not found');
20       return [
21         chat,
22         troupe,
23         userDao.findById(chat.fromUserId, {
24           username: 1,
25           displayName: 1,
26           gravatarImageUrl: 1,
27           gravatarVersion: 1
28         })
29       ];
30     })
31     .spread(function(chat, troupe, fromUser) {
32       var oneToOne = troupe.oneToOne;
33       if (!fromUser) throw new Error('User not found');
35       let displayName = fromUser.displayName;
36       if (chat.virtualUser) {
37         displayName = chat.virtualUser.displayName;
38       }
40       let avatarUrl = resolveUserAvatarUrl(fromUser, 128);
41       if (chat.virtualUser) {
42         avatarUrl = chat.virtualUser.avatarUrl;
43       }
45       if (oneToOne) {
46         return {
47           text: chat.text,
48           title: displayName,
49           link: '/' + fromUser.username,
50           icon: avatarUrl
51         };
52       } else {
53         return {
54           text: chat.text,
55           title: displayName + ' ðŸ’¬ ' + troupe.uri,
56           link: '/' + troupe.uri,
57           icon: avatarUrl
58         };
59       }
60     });
63 // Takes an array of notification items, which looks like
64 exports.sendOnlineNotifications = Promise.method(function(troupeId, chatId, userIds) {
65   if (!userIds.length) return;
66   debug('sendOnlineNotifications to %s users', userIds.length);
68   return generateChatMessageNotification(troupeId, chatId).then(function(notification) {
69     _.forEach(userIds, function(userId) {
70       var n = {
71         userId: userId,
72         troupeId: troupeId,
73         title: notification.title,
74         text: notification.text,
75         link: notification.link,
76         icon: notification.icon,
77         sound: notification.sound,
78         chatId: chatId
79       };
81       debug('Online notifications: %j', n);
82       appEvents.userNotification(n);
83     });
84   });
85 });