Skip to content

Commit 8e087cf

Browse files
mmazzaroloflovilmart
authored andcommitted
Added notification field for fcm [WIP] (#41)
* Implemented notification field form fcm * Updated specs for notifications * Added 'fcm' to valid push types * priority -> high, data no more stringified * Fixed tests
1 parent ef59a8c commit 8e087cf

File tree

4 files changed

+71
-37
lines changed

4 files changed

+71
-37
lines changed

spec/GCM.spec.js

Lines changed: 52 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,89 +20,117 @@ describe('GCM', () => {
2020

2121
it('can generate GCM Payload without expiration time', (done) => {
2222
//Mock request data
23-
var data = {
24-
'alert': 'alert'
23+
var requestData = {
24+
data: {
25+
'alert': 'alert'
26+
},
27+
notification: {
28+
'title': 'I am a title',
29+
'body': 'I am a body'
30+
}
2531
};
2632
var pushId = 'pushId';
2733
var timeStamp = 1454538822113;
2834
var timeStampISOStr = new Date(timeStamp).toISOString();
2935

30-
var payload = GCM.generateGCMPayload(data, pushId, timeStamp);
36+
var payload = GCM.generateGCMPayload(requestData, pushId, timeStamp);
3137

32-
expect(payload.priority).toEqual('normal');
38+
expect(payload.priority).toEqual('high');
3339
expect(payload.timeToLive).toEqual(undefined);
3440
var dataFromPayload = payload.data;
3541
expect(dataFromPayload.time).toEqual(timeStampISOStr);
42+
expect(payload.notification).toEqual(requestData.notification);
3643
expect(dataFromPayload['push_id']).toEqual(pushId);
37-
var dataFromUser = JSON.parse(dataFromPayload.data);
38-
expect(dataFromUser).toEqual(data);
44+
var dataFromUser = dataFromPayload.data;
45+
expect(dataFromUser).toEqual(requestData.data);
3946
done();
4047
});
4148

4249
it('can generate GCM Payload with valid expiration time', (done) => {
4350
//Mock request data
44-
var data = {
45-
'alert': 'alert'
51+
var requestData = {
52+
data: {
53+
'alert': 'alert'
54+
},
55+
notification: {
56+
'title': 'I am a title',
57+
'body': 'I am a body'
58+
}
4659
};
4760
var pushId = 'pushId';
4861
var timeStamp = 1454538822113;
4962
var timeStampISOStr = new Date(timeStamp).toISOString();
5063
var expirationTime = 1454538922113
5164

52-
var payload = GCM.generateGCMPayload(data, pushId, timeStamp, expirationTime);
65+
var payload = GCM.generateGCMPayload(requestData, pushId, timeStamp, expirationTime);
5366

54-
expect(payload.priority).toEqual('normal');
67+
expect(payload.priority).toEqual('high');
5568
expect(payload.timeToLive).toEqual(Math.floor((expirationTime - timeStamp) / 1000));
5669
var dataFromPayload = payload.data;
5770
expect(dataFromPayload.time).toEqual(timeStampISOStr);
71+
expect(payload.notification).toEqual(requestData.notification);
5872
expect(dataFromPayload['push_id']).toEqual(pushId);
59-
var dataFromUser = JSON.parse(dataFromPayload.data);
60-
expect(dataFromUser).toEqual(data);
73+
var dataFromUser = dataFromPayload.data;
74+
expect(dataFromUser).toEqual(requestData.data);
6175
done();
6276
});
6377

6478
it('can generate GCM Payload with too early expiration time', (done) => {
6579
//Mock request data
66-
var data = {
67-
'alert': 'alert'
80+
var requestData = {
81+
data: {
82+
'alert': 'alert'
83+
},
84+
notification: {
85+
'title': 'I am a title',
86+
'body': 'I am a body'
87+
}
6888
};
6989
var pushId = 'pushId';
7090
var timeStamp = 1454538822113;
7191
var timeStampISOStr = new Date(timeStamp).toISOString();
7292
var expirationTime = 1454538822112;
7393

74-
var payload = GCM.generateGCMPayload(data, pushId, timeStamp, expirationTime);
94+
var payload = GCM.generateGCMPayload(requestData, pushId, timeStamp, expirationTime);
7595

76-
expect(payload.priority).toEqual('normal');
96+
expect(payload.priority).toEqual('high');
7797
expect(payload.timeToLive).toEqual(0);
7898
var dataFromPayload = payload.data;
7999
expect(dataFromPayload.time).toEqual(timeStampISOStr);
100+
expect(payload.notification).toEqual(requestData.notification);
80101
expect(dataFromPayload['push_id']).toEqual(pushId);
81-
var dataFromUser = JSON.parse(dataFromPayload.data);
82-
expect(dataFromUser).toEqual(data);
102+
var dataFromUser = dataFromPayload.data;
103+
expect(dataFromUser).toEqual(requestData.data);
83104
done();
84105
});
85106

86107
it('can generate GCM Payload with too late expiration time', (done) => {
87108
//Mock request data
88-
var data = {
89-
'alert': 'alert'
109+
var requestData = {
110+
data: {
111+
'alert': 'alert'
112+
},
113+
notification: {
114+
'title': 'I am a title',
115+
'body': 'I am a body'
116+
}
90117
};
91118
var pushId = 'pushId';
92119
var timeStamp = 1454538822113;
93120
var timeStampISOStr = new Date(timeStamp).toISOString();
94121
var expirationTime = 2454538822113;
95122

96-
var payload = GCM.generateGCMPayload(data, pushId, timeStamp, expirationTime);
123+
var payload = GCM.generateGCMPayload(requestData, pushId, timeStamp, expirationTime);
97124

98-
expect(payload.priority).toEqual('normal');
125+
expect(payload.priority).toEqual('high');
99126
// Four week in second
100127
expect(payload.timeToLive).toEqual(4 * 7 * 24 * 60 * 60);
101128
var dataFromPayload = payload.data;
102129
expect(dataFromPayload.time).toEqual(timeStampISOStr);
130+
expect(payload.notification).toEqual(requestData.notification);
103131
expect(dataFromPayload['push_id']).toEqual(pushId);
104-
var dataFromUser = JSON.parse(dataFromPayload.data);
105-
expect(dataFromUser).toEqual(data);
132+
var dataFromUser = dataFromPayload.data;
133+
expect(dataFromUser).toEqual(requestData.data);
106134
done();
107135
});
108136

spec/ParsePushAdapter.spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,13 @@ describe('ParsePushAdapter', () => {
5454
it('can get valid push types', (done) => {
5555
var parsePushAdapter = new ParsePushAdapter();
5656

57-
expect(parsePushAdapter.getValidPushTypes()).toEqual(['ios', 'android']);
57+
expect(parsePushAdapter.getValidPushTypes()).toEqual(['ios', 'android', 'fcm']);
5858
done();
5959
});
6060

6161
it('can classify installation', (done) => {
6262
// Mock installations
63-
var validPushTypes = ['ios', 'android'];
63+
var validPushTypes = ['ios', 'android', 'fcm'];
6464
var installations = [
6565
{
6666
deviceType: 'android',

src/GCM.js

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ GCM.prototype.send = function(data, devices) {
5757
}
5858
// Generate gcm payload
5959
// PushId is not a formal field of GCM, but Parse Android SDK uses this field to deduplicate push notifications
60-
let gcmPayload = generateGCMPayload(data.data, pushId, timestamp, expirationTime);
60+
let gcmPayload = generateGCMPayload(data, pushId, timestamp, expirationTime);
6161
// Make and send gcm request
6262
let message = new gcm.Message(gcmPayload);
6363

@@ -114,22 +114,27 @@ GCM.prototype.send = function(data, devices) {
114114

115115
/**
116116
* Generate the gcm payload from the data we get from api request.
117-
* @param {Object} coreData The data field under api request body
117+
* @param {Object} requestData The request body
118118
* @param {String} pushId A random string
119119
* @param {Number} timeStamp A number whose format is the Unix Epoch
120120
* @param {Number|undefined} expirationTime A number whose format is the Unix Epoch or undefined
121121
* @returns {Object} A promise which is resolved after we get results from gcm
122122
*/
123-
function generateGCMPayload(coreData, pushId, timeStamp, expirationTime) {
124-
let payloadData = {
125-
'time': new Date(timeStamp).toISOString(),
126-
'push_id': pushId,
127-
'data': JSON.stringify(coreData)
128-
}
123+
function generateGCMPayload(requestData, pushId, timeStamp, expirationTime) {
129124
let payload = {
130-
priority: 'normal',
131-
data: payloadData
125+
priority: 'high'
132126
};
127+
payload.data = {
128+
data: requestData.data,
129+
push_id: pushId,
130+
time: new Date(timeStamp).toISOString()
131+
}
132+
if (requestData.content_available) {
133+
payload.content_available = requestData.content_available;
134+
}
135+
if (requestData.notification) {
136+
payload.notification = requestData.notification;
137+
}
133138
if (expirationTime) {
134139
// The timeStamp and expiration is in milliseconds but gcm requires second
135140
let timeToLive = Math.floor((expirationTime - timeStamp) / 1000);

src/ParsePushAdapter.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export class ParsePushAdapter {
1212
supportsPushTracking = true;
1313

1414
constructor(pushConfig = {}) {
15-
this.validPushTypes = ['ios', 'android'];
15+
this.validPushTypes = ['ios', 'android', 'fcm'];
1616
this.senderMap = {};
1717
// used in PushController for Dashboard Features
1818
this.feature = {
@@ -30,6 +30,7 @@ export class ParsePushAdapter {
3030
this.senderMap[pushType] = new APNS(pushConfig[pushType]);
3131
break;
3232
case 'android':
33+
case 'fcm':
3334
this.senderMap[pushType] = new GCM(pushConfig[pushType]);
3435
break;
3536
}

0 commit comments

Comments
 (0)