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 8, 2016
1 parent 4259c5d commit c582225
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 23 deletions.
59 changes: 59 additions & 0 deletions spec/Parse.Push.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
describe('Parse.Push', () => {
it('should properly send push', (done) => {
var pushAdapter = {
send: function(body, installations) {
let badge = body.data.badge;
installations.forEach((installation) => {
if (installation.deviceType == "ios") {
expect(installation.badge).toEqual(badge);
expect(installation.originalBadge+1).toEqual(installation.badge);
} else {
expect(installation.badge).toBeUndefined();
}
});
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(() => {
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 @@ -107,10 +107,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 @@ -132,7 +132,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 @@ -171,10 +171,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 @@ -188,7 +188,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 @@ -219,6 +219,6 @@ describe('PushController', () => {
done();
});

})
});

});
37 changes: 21 additions & 16 deletions src/Controllers/PushController.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,55 +48,60 @@ 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) {
let badge = body.data.badge;
let op = {};
if (body.badge == "Increment") {
if (badge == "Increment") {
op = { $inc: { badge: 1 } }
} else if (Number(body.badge)) {
op = { $set: { badge: body.badge } }
} else if (Number(badge)) {
op = { $set: { badge: badge } }
} else {
throw "Invalid value for badge, expected number or 'Increment'";
}
let updateWhere = deepcopy(where);
updateWhere.deviceType = 'ios'; // Only on iOS!

badgeUpdate = config.database.adaptiveCollection("_Installation")
badgeUpdate = () => {
return config.database.adaptiveCollection("_Installation")
.then(coll => coll.updateMany(updateWhere, op));
}
}

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]);
return pushAdapter.send(payload, badgeInstallationsMap[badge]);
});
return Promise.all(promises);
}
return pushAdapter.send(body, response.results);
});
}

/**
* Get expiration time from the request body.
* @param {Object} request A request object
Expand Down

0 comments on commit c582225

Please sign in to comment.