From fb343f8feb6ec4e7a663a740948739241a3c7c42 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Fri, 19 Feb 2016 20:34:55 +0100 Subject: [PATCH] port push notifications in api v3 --- website/src/controllers/api-v2/challenges.js | 2 +- website/src/controllers/api-v2/groups.js | 2 +- website/src/controllers/api-v2/members.js | 2 +- .../src/controllers/{ => api-v2}/pushNotifications.js | 0 website/src/controllers/api-v3/challenges.js | 4 ++-- website/src/controllers/api-v3/groups.js | 9 ++++++++- website/src/controllers/api-v3/quests.js | 11 ++++++++++- website/src/controllers/payments/index.js | 2 +- website/src/libs/api-v3/pushNotifications.js | 5 +++-- website/src/models/group.js | 10 +++++++--- 10 files changed, 34 insertions(+), 13 deletions(-) rename website/src/controllers/{ => api-v2}/pushNotifications.js (100%) diff --git a/website/src/controllers/api-v2/challenges.js b/website/src/controllers/api-v2/challenges.js index 89d68495d6..f5a2a4a882 100644 --- a/website/src/controllers/api-v2/challenges.js +++ b/website/src/controllers/api-v2/challenges.js @@ -11,7 +11,7 @@ var logging = require('./../../libs/api-v2/logging'); var csv = require('express-csv'); var utils = require('../../libs/api-v2/utils'); var api = module.exports; -var pushNotify = require('./../pushNotifications'); +var pushNotify = require('./pushNotifications'); /* ------------------------------------------------------------------------ diff --git a/website/src/controllers/api-v2/groups.js b/website/src/controllers/api-v2/groups.js index 5f840c4330..064d786937 100644 --- a/website/src/controllers/api-v2/groups.js +++ b/website/src/controllers/api-v2/groups.js @@ -17,7 +17,7 @@ var Challenge = require('./../../models/challenge').model; var EmailUnsubscription = require('./../../models/emailUnsubscription').model; var isProd = nconf.get('NODE_ENV') === 'production'; var api = module.exports; -var pushNotify = require('./../pushNotifications'); +var pushNotify = require('./pushNotifications'); var analytics = utils.analytics; var firebase = require('../../libs/api-v2/firebase'); diff --git a/website/src/controllers/api-v2/members.js b/website/src/controllers/api-v2/members.js index 1c3bb448ac..190f36c9b1 100644 --- a/website/src/controllers/api-v2/members.js +++ b/website/src/controllers/api-v2/members.js @@ -7,7 +7,7 @@ var _ = require('lodash'); var shared = require('../../../../common'); var utils = require('../../libs/api-v2/utils'); var nconf = require('nconf'); -var pushNotify = require('./../pushNotifications'); +var pushNotify = require('./pushNotifications'); var fetchMember = function(uuid, restrict){ return function(cb){ diff --git a/website/src/controllers/pushNotifications.js b/website/src/controllers/api-v2/pushNotifications.js similarity index 100% rename from website/src/controllers/pushNotifications.js rename to website/src/controllers/api-v2/pushNotifications.js diff --git a/website/src/controllers/api-v3/challenges.js b/website/src/controllers/api-v3/challenges.js index c239a63dd3..6e6d90a85b 100644 --- a/website/src/controllers/api-v3/challenges.js +++ b/website/src/controllers/api-v3/challenges.js @@ -17,7 +17,7 @@ import { import shared from '../../../../common'; import * as Tasks from '../../models/task'; import { sendTxn as txnEmail } from '../../libs/api-v3/email'; -import pushNotify from '../../libs/api-v3/pushNotifications'; +import { sendNotification as sendPushNotification } from '../../libs/api-v3/pushNotifications'; import Q from 'q'; import csvStringify from '../../libs/api-v3/csvStringify'; @@ -471,7 +471,7 @@ async function _closeChal (challenge, broken = {}) { ]); } - pushNotify(savedWinner, shared.i18n.t('wonChallenge'), challenge.name); // TODO translate + sendPushNotification(savedWinner, shared.i18n.t('wonChallenge'), challenge.name); // TODO translate } // Run some operations in the background withouth blocking the thread diff --git a/website/src/controllers/api-v3/groups.js b/website/src/controllers/api-v3/groups.js index d4f19ea2ec..06259fbee3 100644 --- a/website/src/controllers/api-v3/groups.js +++ b/website/src/controllers/api-v3/groups.js @@ -21,7 +21,8 @@ import { removeFromArray } from '../../libs/api-v3/collectionManipulators'; import * as firebase from '../../libs/api-v3/firebase'; import { sendTxn as sendTxnEmail } from '../../libs/api-v3/email'; import { encrypt } from '../../libs/api-v3/encryption'; - +import common from '../../../../common'; +import { sendNotification as sendPushNotification } from '../../libs/api-v3/pushNotifications'; let api = {}; // TODO shall we accept party as groupId in all routes? @@ -510,6 +511,12 @@ async function _inviteByUUID (uuid, group, inviter, req, res) { sendTxnEmail(userToInvite, `invited-${groupLabel}`, emailVars); } + sendPushNotification( + userToInvite, + common.i18n.t(group.type === 'guild' ? 'invitedGuild' : 'invitedParty'), + group.name + ); + let userInvited = await userToInvite.save(); if (group.type === 'guild') { return userInvited.invitations.guilds[userToInvite.invitations.guilds.length - 1]; diff --git a/website/src/controllers/api-v3/quests.js b/website/src/controllers/api-v3/quests.js index e0ad3b86d4..f6861938aa 100644 --- a/website/src/controllers/api-v3/quests.js +++ b/website/src/controllers/api-v3/quests.js @@ -17,6 +17,8 @@ import { sendTxn as sendTxnEmail, } from '../../libs/api-v3/email'; import { quests as questScrolls } from '../../../../common/script/content'; +import common from '../../../../common'; +import { sendNotification as sendPushNotification } from '../../libs/api-v3/pushNotifications'; function canStartQuestAutomatically (group) { // If all members are either true (accepted) or false (rejected) return true @@ -62,7 +64,7 @@ api.inviteToQuest = { let members = await User.find({ 'party._id': group._id, _id: {$ne: user._id}, - }).select('auth.facebook auth.local preferences.emailNotifications profile.name') + }).select('auth.facebook auth.local preferences.emailNotifications profile.name pushDevices') .exec(); group.markModified('quest'); @@ -102,6 +104,13 @@ api.inviteToQuest = { // send out invites let inviterVars = getUserInfo(user, ['name', 'email']); let membersToEmail = members.filter(member => { + // send push notifications while filtering members before sending emails + sendPushNotification( + member, + common.i18n.t('questInvitationTitle'), + common.i18n.t('questInvitationInfo', { quest: quest.text() }) + ); + return member.preferences.emailNotifications.invitedQuest !== false; }); sendTxnEmail(membersToEmail, `invite-${quest.boss ? 'boss' : 'collection'}-quest`, [ diff --git a/website/src/controllers/payments/index.js b/website/src/controllers/payments/index.js index 074fab2369..86ac9c2047 100644 --- a/website/src/controllers/payments/index.js +++ b/website/src/controllers/payments/index.js @@ -12,7 +12,7 @@ var async = require('async'); var iap = require('./iap'); var mongoose= require('mongoose'); var cc = require('coupon-code'); -var pushNotify = require('./../pushNotifications'); +var pushNotify = require('./../api-v2/pushNotifications'); function revealMysteryItems(user) { _.each(shared.content.gear.flat, function(item) { diff --git a/website/src/libs/api-v3/pushNotifications.js b/website/src/libs/api-v3/pushNotifications.js index fbf5e2666a..f2f7825477 100644 --- a/website/src/libs/api-v3/pushNotifications.js +++ b/website/src/libs/api-v3/pushNotifications.js @@ -25,11 +25,11 @@ if (gcm) { } // TODO test -export default function sendNotify (user, title, message, timeToLive = 15) { +export default function sendNotification (user, title, message, timeToLive = 15) { // TODO need investigation: // https://github.com/HabitRPG/habitrpg/issues/5252 - if (!user) throw new Error('User is required'); + if (!user) throw new Error('User is required.'); _.each(user.pushDevices, pushDevice => { switch (pushDevice.type) { @@ -50,6 +50,7 @@ export default function sendNotify (user, title, message, timeToLive = 15) { break; case 'ios': + // TODO implement break; } }); diff --git a/website/src/models/group.js b/website/src/models/group.js index ab63e813ac..c01f365389 100644 --- a/website/src/models/group.js +++ b/website/src/models/group.js @@ -15,6 +15,7 @@ import { sendTxn as sendTxnEmail } from '../libs/api-v3/email'; import { quests as questScrolls } from '../../../common/script/content'; import Q from 'q'; import nconf from 'nconf'; +import { sendNotification as sendPushNotification } from '../libs/api-v3/pushNotifications'; let Schema = mongoose.Schema; @@ -306,9 +307,12 @@ schema.methods.startQuest = async function startQuest (user) { // send notifications in the background without blocking User.find( { _id: { $in: nonUserQuestMembers } }, - 'party.quest items.quests auth.facebook auth.local preferences.emailNotifications profile.name', - ).exec().then(membersToEmail => { - membersToEmail = _.filter(membersToEmail, (member) => { + 'party.quest items.quests auth.facebook auth.local preferences.emailNotifications pushDevices profile.name', + ).exec().then(membersToNotify => { + let membersToEmail = _.filter(membersToNotify, (member) => { + // send push notifications and filter users that disabled emails + sendPushNotification(user, 'HabitRPG', `${shared.i18n.t('questStarted')}: ${quest.text()}`); + return member.preferences.emailNotifications.questStarted !== false && member._id !== user._id; });