Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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) {
var 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