port push notifications in api v3

This commit is contained in:
Matteo Pagliazzi
2016-02-19 20:34:55 +01:00
parent 624c0da5ab
commit fb343f8feb
10 changed files with 34 additions and 13 deletions

View File

@@ -11,7 +11,7 @@ var logging = require('./../../libs/api-v2/logging');
var csv = require('express-csv'); var csv = require('express-csv');
var utils = require('../../libs/api-v2/utils'); var utils = require('../../libs/api-v2/utils');
var api = module.exports; var api = module.exports;
var pushNotify = require('./../pushNotifications'); var pushNotify = require('./pushNotifications');
/* /*
------------------------------------------------------------------------ ------------------------------------------------------------------------

View File

@@ -17,7 +17,7 @@ var Challenge = require('./../../models/challenge').model;
var EmailUnsubscription = require('./../../models/emailUnsubscription').model; var EmailUnsubscription = require('./../../models/emailUnsubscription').model;
var isProd = nconf.get('NODE_ENV') === 'production'; var isProd = nconf.get('NODE_ENV') === 'production';
var api = module.exports; var api = module.exports;
var pushNotify = require('./../pushNotifications'); var pushNotify = require('./pushNotifications');
var analytics = utils.analytics; var analytics = utils.analytics;
var firebase = require('../../libs/api-v2/firebase'); var firebase = require('../../libs/api-v2/firebase');

View File

@@ -7,7 +7,7 @@ var _ = require('lodash');
var shared = require('../../../../common'); var shared = require('../../../../common');
var utils = require('../../libs/api-v2/utils'); var utils = require('../../libs/api-v2/utils');
var nconf = require('nconf'); var nconf = require('nconf');
var pushNotify = require('./../pushNotifications'); var pushNotify = require('./pushNotifications');
var fetchMember = function(uuid, restrict){ var fetchMember = function(uuid, restrict){
return function(cb){ return function(cb){

View File

@@ -17,7 +17,7 @@ import {
import shared from '../../../../common'; import shared from '../../../../common';
import * as Tasks from '../../models/task'; import * as Tasks from '../../models/task';
import { sendTxn as txnEmail } from '../../libs/api-v3/email'; 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 Q from 'q';
import csvStringify from '../../libs/api-v3/csvStringify'; 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 // Run some operations in the background withouth blocking the thread

View File

@@ -21,7 +21,8 @@ import { removeFromArray } from '../../libs/api-v3/collectionManipulators';
import * as firebase from '../../libs/api-v3/firebase'; import * as firebase from '../../libs/api-v3/firebase';
import { sendTxn as sendTxnEmail } from '../../libs/api-v3/email'; import { sendTxn as sendTxnEmail } from '../../libs/api-v3/email';
import { encrypt } from '../../libs/api-v3/encryption'; import { encrypt } from '../../libs/api-v3/encryption';
import common from '../../../../common';
import { sendNotification as sendPushNotification } from '../../libs/api-v3/pushNotifications';
let api = {}; let api = {};
// TODO shall we accept party as groupId in all routes? // 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); sendTxnEmail(userToInvite, `invited-${groupLabel}`, emailVars);
} }
sendPushNotification(
userToInvite,
common.i18n.t(group.type === 'guild' ? 'invitedGuild' : 'invitedParty'),
group.name
);
let userInvited = await userToInvite.save(); let userInvited = await userToInvite.save();
if (group.type === 'guild') { if (group.type === 'guild') {
return userInvited.invitations.guilds[userToInvite.invitations.guilds.length - 1]; return userInvited.invitations.guilds[userToInvite.invitations.guilds.length - 1];

View File

@@ -17,6 +17,8 @@ import {
sendTxn as sendTxnEmail, sendTxn as sendTxnEmail,
} from '../../libs/api-v3/email'; } from '../../libs/api-v3/email';
import { quests as questScrolls } from '../../../../common/script/content'; import { quests as questScrolls } from '../../../../common/script/content';
import common from '../../../../common';
import { sendNotification as sendPushNotification } from '../../libs/api-v3/pushNotifications';
function canStartQuestAutomatically (group) { function canStartQuestAutomatically (group) {
// If all members are either true (accepted) or false (rejected) return true // If all members are either true (accepted) or false (rejected) return true
@@ -62,7 +64,7 @@ api.inviteToQuest = {
let members = await User.find({ let members = await User.find({
'party._id': group._id, 'party._id': group._id,
_id: {$ne: user._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(); .exec();
group.markModified('quest'); group.markModified('quest');
@@ -102,6 +104,13 @@ api.inviteToQuest = {
// send out invites // send out invites
let inviterVars = getUserInfo(user, ['name', 'email']); let inviterVars = getUserInfo(user, ['name', 'email']);
let membersToEmail = members.filter(member => { 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; return member.preferences.emailNotifications.invitedQuest !== false;
}); });
sendTxnEmail(membersToEmail, `invite-${quest.boss ? 'boss' : 'collection'}-quest`, [ sendTxnEmail(membersToEmail, `invite-${quest.boss ? 'boss' : 'collection'}-quest`, [

View File

@@ -12,7 +12,7 @@ var async = require('async');
var iap = require('./iap'); var iap = require('./iap');
var mongoose= require('mongoose'); var mongoose= require('mongoose');
var cc = require('coupon-code'); var cc = require('coupon-code');
var pushNotify = require('./../pushNotifications'); var pushNotify = require('./../api-v2/pushNotifications');
function revealMysteryItems(user) { function revealMysteryItems(user) {
_.each(shared.content.gear.flat, function(item) { _.each(shared.content.gear.flat, function(item) {

View File

@@ -25,11 +25,11 @@ if (gcm) {
} }
// TODO test // TODO test
export default function sendNotify (user, title, message, timeToLive = 15) { export default function sendNotification (user, title, message, timeToLive = 15) {
// TODO need investigation: // TODO need investigation:
// https://github.com/HabitRPG/habitrpg/issues/5252 // 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 => { _.each(user.pushDevices, pushDevice => {
switch (pushDevice.type) { switch (pushDevice.type) {
@@ -50,6 +50,7 @@ export default function sendNotify (user, title, message, timeToLive = 15) {
break; break;
case 'ios': case 'ios':
// TODO implement
break; break;
} }
}); });

View File

@@ -15,6 +15,7 @@ import { sendTxn as sendTxnEmail } from '../libs/api-v3/email';
import { quests as questScrolls } from '../../../common/script/content'; import { quests as questScrolls } from '../../../common/script/content';
import Q from 'q'; import Q from 'q';
import nconf from 'nconf'; import nconf from 'nconf';
import { sendNotification as sendPushNotification } from '../libs/api-v3/pushNotifications';
let Schema = mongoose.Schema; let Schema = mongoose.Schema;
@@ -306,9 +307,12 @@ schema.methods.startQuest = async function startQuest (user) {
// send notifications in the background without blocking // send notifications in the background without blocking
User.find( User.find(
{ _id: { $in: nonUserQuestMembers } }, { _id: { $in: nonUserQuestMembers } },
'party.quest items.quests auth.facebook auth.local preferences.emailNotifications profile.name', 'party.quest items.quests auth.facebook auth.local preferences.emailNotifications pushDevices profile.name',
).exec().then(membersToEmail => { ).exec().then(membersToNotify => {
membersToEmail = _.filter(membersToEmail, (member) => { 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 && return member.preferences.emailNotifications.questStarted !== false &&
member._id !== user._id; member._id !== user._id;
}); });