Skip to content

Commit e523be2

Browse files
committed
Make push follow controller and adapter style
1 parent 76d9871 commit e523be2

File tree

6 files changed

+88
-95
lines changed

6 files changed

+88
-95
lines changed

spec/ParsePushAdapter.spec.js

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,6 @@ var ParsePushAdapter = require('../src/Adapters/Push/ParsePushAdapter');
22

33
describe('ParsePushAdapter', () => {
44
it('can be initialized', (done) => {
5-
var parsePushAdapter = new ParsePushAdapter();
6-
7-
expect(parsePushAdapter.validPushTypes).toEqual(['ios', 'android']);
8-
done();
9-
});
10-
11-
it('can initialize', (done) => {
12-
var parsePushAdapter = new ParsePushAdapter();
135
// Make mock config
146
var pushConfig = {
157
android: {
@@ -30,7 +22,7 @@ describe('ParsePushAdapter', () => {
3022
]
3123
};
3224

33-
parsePushAdapter.initialize(pushConfig);
25+
var parsePushAdapter = new ParsePushAdapter(pushConfig);
3426
// Check ios
3527
var iosSenders = parsePushAdapter.senders['ios'];
3628
expect(iosSenders.length).toBe(2);
@@ -53,7 +45,6 @@ describe('ParsePushAdapter', () => {
5345
});
5446

5547
it('can throw on initializing with unsupported push type', (done) => {
56-
var parsePushAdapter = new ParsePushAdapter();
5748
// Make mock config
5849
var pushConfig = {
5950
win: {
@@ -63,20 +54,19 @@ describe('ParsePushAdapter', () => {
6354
};
6455

6556
expect(function() {
66-
parsePushAdapter.initialize(pushConfig)
57+
new ParsePushAdapter(pushConfig);
6758
}).toThrow();
6859
done();
6960
});
7061

7162
it('can throw on initializing with invalid pushConfig', (done) => {
72-
var parsePushAdapter = new ParsePushAdapter();
7363
// Make mock config
7464
var pushConfig = {
7565
android: 123
7666
};
7767

7868
expect(function() {
79-
parsePushAdapter.initialize(pushConfig)
69+
new ParsePushAdapter(pushConfig);
8070
}).toThrow();
8171
done();
8272
});

spec/push.spec.js renamed to spec/PushController.spec.js

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
var push = require('../src/push');
1+
var PushController = require('../src/Controllers/PushController').PushController;
22

3-
describe('push', () => {
3+
describe('PushController', () => {
44
it('can check valid master key of request', (done) => {
55
// Make mock request
66
var request = {
@@ -13,7 +13,7 @@ describe('push', () => {
1313
}
1414

1515
expect(() => {
16-
push.validateMasterKey(request);
16+
PushController.validateMasterKey(request);
1717
}).not.toThrow();
1818
done();
1919
});
@@ -30,7 +30,7 @@ describe('push', () => {
3030
}
3131

3232
expect(() => {
33-
push.validateMasterKey(request);
33+
PushController.validateMasterKey(request);
3434
}).toThrow();
3535
done();
3636
});
@@ -43,7 +43,7 @@ describe('push', () => {
4343
}
4444
}
4545

46-
var where = push.getQueryCondition(request);
46+
var where = PushController.getQueryCondition(request);
4747
expect(where).toEqual({
4848
'channels': {
4949
'$in': ['Giants', 'Mets']
@@ -62,7 +62,7 @@ describe('push', () => {
6262
}
6363
}
6464

65-
var where = push.getQueryCondition(request);
65+
var where = PushController.getQueryCondition(request);
6666
expect(where).toEqual({
6767
'injuryReports': true
6868
});
@@ -77,7 +77,7 @@ describe('push', () => {
7777
}
7878

7979
expect(function() {
80-
push.getQueryCondition(request);
80+
PushController.getQueryCondition(request);
8181
}).toThrow();
8282
done();
8383
});
@@ -96,7 +96,7 @@ describe('push', () => {
9696
}
9797

9898
expect(function() {
99-
push.getQueryCondition(request);
99+
PushController.getQueryCondition(request);
100100
}).toThrow();
101101
done();
102102
});
@@ -108,7 +108,7 @@ describe('push', () => {
108108
var validPushTypes = ['ios', 'android'];
109109

110110
expect(function(){
111-
push.validatePushType(where, validPushTypes);
111+
PushController.validatePushType(where, validPushTypes);
112112
}).not.toThrow();
113113
done();
114114
});
@@ -121,7 +121,7 @@ describe('push', () => {
121121
var validPushTypes = ['ios', 'android'];
122122

123123
expect(function(){
124-
push.validatePushType(where, validPushTypes);
124+
PushController.validatePushType(where, validPushTypes);
125125
}).not.toThrow();
126126
done();
127127
});
@@ -136,7 +136,7 @@ describe('push', () => {
136136
var validPushTypes = ['ios', 'android'];
137137

138138
expect(function(){
139-
push.validatePushType(where, validPushTypes);
139+
PushController.validatePushType(where, validPushTypes);
140140
}).not.toThrow();
141141
done();
142142
});
@@ -149,7 +149,7 @@ describe('push', () => {
149149
var validPushTypes = ['ios', 'android'];
150150

151151
expect(function(){
152-
push.validatePushType(where, validPushTypes);
152+
PushController.validatePushType(where, validPushTypes);
153153
}).toThrow();
154154
done();
155155
});
@@ -162,7 +162,7 @@ describe('push', () => {
162162
var validPushTypes = ['ios', 'android'];
163163

164164
expect(function(){
165-
push.validatePushType(where, validPushTypes);
165+
PushController.validatePushType(where, validPushTypes);
166166
}).toThrow();
167167
done();
168168
});
@@ -176,7 +176,7 @@ describe('push', () => {
176176
}
177177
}
178178

179-
var time = push.getExpirationTime(request);
179+
var time = PushController.getExpirationTime(request);
180180
expect(time).toEqual(new Date(timeStr).valueOf());
181181
done();
182182
});
@@ -190,7 +190,7 @@ describe('push', () => {
190190
}
191191
}
192192

193-
var time = push.getExpirationTime(request);
193+
var time = PushController.getExpirationTime(request);
194194
expect(time).toEqual(timeNumber * 1000);
195195
done();
196196
});
@@ -204,7 +204,7 @@ describe('push', () => {
204204
}
205205

206206
expect(function(){
207-
push.getExpirationTime(request);
207+
PushController.getExpirationTime(request);
208208
}).toThrow();
209209
done();
210210
});

src/Adapters/Push/ParsePushAdapter.js

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,10 @@ const Parse = require('parse/node').Parse;
77
const GCM = require('../../GCM');
88
const APNS = require('../../APNS');
99

10-
function ParsePushAdapter() {
11-
this.validPushTypes = ['ios', 'android'];
12-
this.senders = {};
13-
}
10+
function ParsePushAdapter(pushConfig) {
11+
this.validPushTypes = ['ios', 'android'];
12+
this.senders = {};
1413

15-
/**
16-
* Register push senders
17-
* @param {Object} pushConfig The push configuration which is given when parse server is initialized
18-
*/
19-
ParsePushAdapter.prototype.initialize = function(pushConfig) {
2014
// Initialize senders
2115
for (let validPushType of this.validPushTypes) {
2216
this.senders[validPushType] = [];

src/Adapters/Push/PushAdapter.js

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,15 @@
33
// Allows you to change the push notification mechanism.
44
//
55
// Adapter classes must implement the following functions:
6-
// * initialize(pushConfig)
7-
// * getPushSenders(parseConfig)
8-
// * getValidPushTypes(parseConfig)
6+
// * getValidPushTypes()
97
// * send(devices, installations)
108
//
119
// Default is ParsePushAdapter, which uses GCM for
1210
// android push and APNS for ios push.
11+
export class PushAdapter {
12+
send(devices, installations) { }
1313

14-
var ParsePushAdapter = require('./ParsePushAdapter');
15-
16-
var adapter = new ParsePushAdapter();
17-
18-
function setAdapter(pushAdapter) {
19-
adapter = pushAdapter;
20-
}
21-
22-
function getAdapter() {
23-
return adapter;
14+
getValidPushTypes() { }
2415
}
2516

26-
module.exports = {
27-
getAdapter: getAdapter,
28-
setAdapter: setAdapter
29-
};
17+
export default PushAdapter;

src/push.js renamed to src/Controllers/PushController.js

Lines changed: 45 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,44 @@
1-
// push.js
1+
import { Parse } from 'parse/node';
2+
import PromiseRouter from '../PromiseRouter';
3+
import rest from '../rest';
24

3-
var Parse = require('parse/node').Parse,
4-
PromiseRouter = require('./PromiseRouter'),
5-
PushAdapter = require('./Adapters/Push/PushAdapter'),
6-
rest = require('./rest');
5+
export class PushController {
76

8-
function handlePushWithoutQueue(req) {
9-
validateMasterKey(req);
10-
var where = getQueryCondition(req);
11-
var pushAdapter = PushAdapter.getAdapter();
12-
validatePushType(where, pushAdapter.getValidPushTypes());
13-
// Replace the expiration_time with a valid Unix epoch milliseconds time
14-
req.body['expiration_time'] = getExpirationTime(req);
15-
// TODO: If the req can pass the checking, we return immediately instead of waiting
16-
// pushes to be sent. We probably change this behaviour in the future.
17-
rest.find(req.config, req.auth, '_Installation', where).then(function(response) {
18-
return pushAdapter.send(req.body, response.results);
19-
});
20-
return Parse.Promise.as({
21-
response: {
22-
'result': true
23-
}
24-
});
7+
constructor(pushAdapter) {
8+
this._pushAdapter = pushAdapter;
9+
}
10+
11+
handlePOST(req) {
12+
if (!this._pushAdapter) {
13+
throw new Parse.Error(Parse.Error.PUSH_MISCONFIGURED,
14+
'Push adapter is not availabe');
15+
}
16+
17+
validateMasterKey(req);
18+
var where = getQueryCondition(req);
19+
var pushAdapter = this._pushAdapter;
20+
validatePushType(where, pushAdapter.getValidPushTypes());
21+
// Replace the expiration_time with a valid Unix epoch milliseconds time
22+
req.body['expiration_time'] = getExpirationTime(req);
23+
// TODO: If the req can pass the checking, we return immediately instead of waiting
24+
// pushes to be sent. We probably change this behaviour in the future.
25+
rest.find(req.config, req.auth, '_Installation', where).then(function(response) {
26+
return pushAdapter.send(req.body, response.results);
27+
});
28+
return Parse.Promise.as({
29+
response: {
30+
'result': true
31+
}
32+
});
33+
}
34+
35+
getExpressRouter() {
36+
var router = new PromiseRouter();
37+
router.route('POST','/push', (req) => {
38+
return this.handlePOST(req);
39+
});
40+
return router;
41+
}
2542
}
2643

2744
/**
@@ -116,16 +133,11 @@ function validateMasterKey(req) {
116133
}
117134
}
118135

119-
var router = new PromiseRouter();
120-
router.route('POST','/push', handlePushWithoutQueue);
121-
122-
module.exports = {
123-
router: router,
124-
}
125-
126136
if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') {
127-
module.exports.getQueryCondition = getQueryCondition;
128-
module.exports.validateMasterKey = validateMasterKey;
129-
module.exports.getExpirationTime = getExpirationTime;
130-
module.exports.validatePushType = validatePushType;
137+
PushController.getQueryCondition = getQueryCondition;
138+
PushController.validateMasterKey = validateMasterKey;
139+
PushController.getExpirationTime = getExpirationTime;
140+
PushController.validatePushType = validatePushType;
131141
}
142+
143+
export default PushController;

src/index.js

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ var batch = require('./batch'),
55
cache = require('./cache'),
66
DatabaseAdapter = require('./DatabaseAdapter'),
77
express = require('express'),
8-
PushAdapter = require('./Adapters/Push/PushAdapter'),
98
middlewares = require('./middlewares'),
109
multer = require('multer'),
1110
Parse = require('parse/node').Parse,
@@ -14,9 +13,12 @@ var batch = require('./batch'),
1413

1514
import { GridStoreAdapter } from './Adapters/Files/GridStoreAdapter';
1615
import { S3Adapter } from './Adapters/Files/S3Adapter';
17-
1816
import { FilesController } from './Controllers/FilesController';
1917

18+
import ParsePushAdapter from './Adapters/Push/ParsePushAdapter';
19+
import { PushController } from './Controllers/PushController';
20+
21+
2022
// Mutate the Parse object to add the Cloud Code handlers
2123
addParseCloud();
2224

@@ -51,8 +53,18 @@ function ParseServer(args) {
5153
DatabaseAdapter.setAdapter(args.databaseAdapter);
5254
}
5355

56+
// Make files adapter
5457
let filesAdapter = args.filesAdapter || new GridStoreAdapter();
5558

59+
// Make push adapter
60+
let pushConfig = args.push;
61+
let pushAdapter;
62+
if (pushConfig && pushConfig.adapter) {
63+
pushAdapter = pushConfig.adapter;
64+
} else if (pushConfig) {
65+
pushAdapter = new ParsePushAdapter(pushConfig)
66+
}
67+
5668
if (args.databaseURI) {
5769
DatabaseAdapter.setAppDatabaseURI(args.appId, args.databaseURI);
5870
}
@@ -87,10 +99,6 @@ function ParseServer(args) {
8799
cache.apps[args.appId]['facebookAppIds'].push(process.env.FACEBOOK_APP_ID);
88100
}
89101

90-
// Register push senders
91-
var pushConfig = args.push;
92-
PushAdapter.getAdapter().initialize(pushConfig);
93-
94102
// Initialize the node client SDK automatically
95103
Parse.initialize(args.appId, args.javascriptKey || '', args.masterKey);
96104
if(args.serverURL) {
@@ -122,10 +130,11 @@ function ParseServer(args) {
122130
router.merge(require('./sessions'));
123131
router.merge(require('./roles'));
124132
router.merge(require('./analytics'));
125-
router.merge(require('./push').router);
126133
router.merge(require('./installations'));
127134
router.merge(require('./functions'));
128135
router.merge(require('./schemas'));
136+
let pushController = new PushController(pushAdapter);
137+
router.merge(pushController.getExpressRouter());
129138

130139
batch.mountOnto(router);
131140

0 commit comments

Comments
 (0)