Skip to content

Commit

Permalink
Fixes problems related to increment badge
Browse files Browse the repository at this point in the history
- name conventions are aweful in PushController
- properly looks at the badge into body.data instead of body
- We may want to refactor that as it's confusing to use a full body
  • Loading branch information
flovilmart committed Mar 7, 2016
1 parent f1f9bde commit 5370fd9
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 24 deletions.
51 changes: 51 additions & 0 deletions spec/Parse.Push.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
describe('Parse.Push', () => {
it('should properly send push', (done) => {
var pushAdapter = {
send: function(body, installations) {
return Promise.resolve({
body: body,
installations: installations
})
},
getValidPushTypes: function() {
return ["ios", "android"];
}
}
setServerConfiguration({
appId: Parse.applicationId,
masterKey: Parse.masterKey,
serverURL: Parse.serverURL,
push: {
adapter: pushAdapter
}
});
var installations = [];
while(installations.length != 10) {
var installation = new Parse.Object("_Installation");
installation.set("installationId", "installation_"+installations.length);
installation.set("deviceToken","device_token_"+installations.length)
installation.set("badge", installations.length);
installation.set("originalBadge", installations.length);
installation.set("deviceType", "ios");
installations.push(installation);
}
Parse.Object.saveAll(installations).then(() => {
return Parse.Push.send({
where: {
deviceType: 'ios'
},
data: {
badge: 'Increment',
alert: 'Hello world!'
}
}, {useMasterKey: true});
})
.then(() => {
console.log("OK!");
done();
}, (err) => {
console.error(err);
done();
});
});
});
14 changes: 7 additions & 7 deletions spec/PushController.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,10 @@ describe('PushController', () => {

it('properly increment badges', (done) => {

var payload = {
var payload = {data:{
alert: "Hello World!",
badge: "Increment",
}
}}
var installations = [];
while(installations.length != 10) {
var installation = new Parse.Object("_Installation");
Expand All @@ -157,7 +157,7 @@ describe('PushController', () => {

var pushAdapter = {
send: function(body, installations) {
var badge = body.badge;
var badge = body.data.badge;
installations.forEach((installation) => {
if (installation.deviceType == "ios") {
expect(installation.badge).toEqual(badge);
Expand Down Expand Up @@ -196,10 +196,10 @@ describe('PushController', () => {

it('properly set badges to 1', (done) => {

var payload = {
var payload = {data: {
alert: "Hello World!",
badge: 1,
}
}}
var installations = [];
while(installations.length != 10) {
var installation = new Parse.Object("_Installation");
Expand All @@ -213,7 +213,7 @@ describe('PushController', () => {

var pushAdapter = {
send: function(body, installations) {
var badge = body.badge;
var badge = body.data.badge;
installations.forEach((installation) => {
expect(installation.badge).toEqual(badge);
expect(1).toEqual(installation.badge);
Expand Down Expand Up @@ -244,6 +244,6 @@ describe('PushController', () => {
done();
});

})
});

});
36 changes: 20 additions & 16 deletions src/Controllers/PushController.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,14 +60,16 @@ export class PushController extends AdaptableController {
body['expiration_time'] = PushController.getExpirationTime(body);
// TODO: If the req can pass the checking, we return immediately instead of waiting
// pushes to be sent. We probably change this behaviour in the future.
let badgeUpdate = Promise.resolve();
let badgeUpdate = () => {
return Promise.resolve();
}

if (body.badge) {
if (body.data && body.data.badge) {
var op = {};
if (body.badge == "Increment") {
if (body.data.badge == "Increment") {
op = {'$inc': {'badge': 1}}
} else if (Number(body.badge)) {
op = {'$set': {'badge': body.badge } }
} else if (Number(body.data.badge)) {
op = {'$set': {'badge': body.data.badge } }
} else {
throw "Invalid value for badge, expected number or 'Increment'";
}
Expand All @@ -77,33 +79,35 @@ export class PushController extends AdaptableController {
updateWhere.deviceType = 'ios';

// TODO: @nlutsenko replace with better thing
badgeUpdate = config.database.rawCollection("_Installation").then((coll) => {
return coll.update(updateWhere, op, { multi: true });
});
badgeUpdate = () => {
return config.database.rawCollection("_Installation").then((coll) => {
return coll.update(updateWhere, op, { multi: true });
});
}
}

return badgeUpdate.then(() => {
return rest.find(config, auth, '_Installation', where)
return badgeUpdate().then(() => {
return rest.find(config, auth, '_Installation', where);
}).then((response) => {
if (body.badge && body.badge == "Increment") {
if (body.data && body.data.badge && body.data.badge == "Increment") {
// Collect the badges to reduce the # of calls
let badgeInstallationsMap = response.results.reduce((map, installation) => {
let badge = installation.badge;
if (installation.deviceType != "ios") {
badge = UNSUPPORTED_BADGE_KEY;
}
map[badge] = map[badge] || [];
map[badge].push(installation);
map[badge+''] = map[badge+''] || [];
map[badge+''].push(installation);
return map;
}, {});

// Map the on the badges count and return the send result
let promises = Object.keys(badgeInstallationsMap).map((badge) => {
let payload = deepcopy(body);
if (badge == UNSUPPORTED_BADGE_KEY) {
delete payload.badge;
delete payload.data.badge;
} else {
payload.badge = parseInt(badge);
payload.data.badge = parseInt(badge);
}
return pushAdapter.send(payload, badgeInstallationsMap[badge]);
});
Expand Down
1 change: 0 additions & 1 deletion src/Routers/PushRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ export class PushRouter extends PromiseRouter {
}

var where = PushRouter.getQueryCondition(req);

pushController.sendPush(req.body, where, req.config, req.auth);
return Promise.resolve({
response: {
Expand Down

0 comments on commit 5370fd9

Please sign in to comment.