From b89619b6ee6a98b28a41d8e4df782974a2cda14a Mon Sep 17 00:00:00 2001 From: Florent Vilmart Date: Fri, 11 Mar 2016 16:23:58 -0500 Subject: [PATCH] Full query support for badge Increment --- spec/PushController.spec.js | 41 +++++++++++++++++++++++++++++++ src/Controllers/PushController.js | 17 ++++++++++--- src/RestQuery.js | 24 +++++++++++------- 3 files changed, 70 insertions(+), 12 deletions(-) diff --git a/spec/PushController.spec.js b/spec/PushController.spec.js index e2ced56fcc..9255c5c985 100644 --- a/spec/PushController.spec.js +++ b/spec/PushController.spec.js @@ -1,3 +1,4 @@ +"use strict"; var PushController = require('../src/Controllers/PushController').PushController; var Config = require('../src/Config'); @@ -220,5 +221,45 @@ describe('PushController', () => { }); }); + + it('should support full RESTQuery for increment', (done) => { + var payload = {data: { + alert: "Hello World!", + badge: 'Increment', + }} + + var pushAdapter = { + send: function(body, installations) { + return Promise.resolve(); + }, + getValidPushTypes: function() { + return ["ios"]; + } + } + + var config = new Config(Parse.applicationId); + var auth = { + isMaster: true + } + + let where = { + 'deviceToken': { + '$inQuery': { + 'where': { + 'deviceType': 'ios' + }, + className: '_Installation' + } + } + } + + var pushController = new PushController(pushAdapter, Parse.applicationId); + pushController.sendPush(payload, where, config, auth).then((result) => { + done(); + }).catch((err) => { + fail('should not fail'); + done(); + }); + }); }); diff --git a/src/Controllers/PushController.js b/src/Controllers/PushController.js index 8dbc6a5990..158963828d 100644 --- a/src/Controllers/PushController.js +++ b/src/Controllers/PushController.js @@ -5,6 +5,7 @@ import AdaptableController from './AdaptableController'; import { PushAdapter } from '../Adapters/Push/PushAdapter'; import deepcopy from 'deepcopy'; import features from '../features'; +import RestQuery from '../RestQuery'; const FEATURE_NAME = 'push'; const UNSUPPORTED_BADGE_KEY = "unsupported"; @@ -63,11 +64,21 @@ export class PushController extends AdaptableController { throw "Invalid value for badge, expected number or 'Increment'"; } let updateWhere = deepcopy(where); - updateWhere.deviceType = 'ios'; // Only on iOS! badgeUpdate = () => { - return config.database.adaptiveCollection("_Installation") - .then(coll => coll.updateMany(updateWhere, op)); + let badgeQuery = new RestQuery(config, auth, '_Installation', updateWhere); + return badgeQuery.buildRestWhere().then(() => { + let restWhere = deepcopy(badgeQuery.restWhere); + // Force iOS only devices + if (!restWhere['$and']) { + restWhere['$and'] = [badgeQuery.restWhere]; + } + restWhere['$and'].push({ + 'deviceType': 'ios' + }); + return config.database.adaptiveCollection("_Installation") + .then(coll => coll.updateMany(restWhere, op)); + }) } } diff --git a/src/RestQuery.js b/src/RestQuery.js index c14ac41536..0ddc7b4ba7 100644 --- a/src/RestQuery.js +++ b/src/RestQuery.js @@ -111,6 +111,20 @@ function RestQuery(config, auth, className, restWhere = {}, restOptions = {}) { // 'results' and 'count'. // TODO: consolidate the replaceX functions RestQuery.prototype.execute = function() { + return Promise.resolve().then(() => { + return this.buildRestWhere(); + }).then(() => { + return this.runFind(); + }).then(() => { + return this.runCount(); + }).then(() => { + return this.handleInclude(); + }).then(() => { + return this.response; + }); +}; + +RestQuery.prototype.buildRestWhere = function() { return Promise.resolve().then(() => { return this.getUserAndRoleACL(); }).then(() => { @@ -125,16 +139,8 @@ RestQuery.prototype.execute = function() { return this.replaceInQuery(); }).then(() => { return this.replaceNotInQuery(); - }).then(() => { - return this.runFind(); - }).then(() => { - return this.runCount(); - }).then(() => { - return this.handleInclude(); - }).then(() => { - return this.response; }); -}; +} // Uses the Auth object to get the list of roles, adds the user id RestQuery.prototype.getUserAndRoleACL = function() {