From 873133767750b648e1a83a47aff8590a0d504beb Mon Sep 17 00:00:00 2001 From: Florent Vilmart Date: Fri, 25 Mar 2016 14:20:12 -0400 Subject: [PATCH] removes onesignal --- spec/OneSignalPushAdapter.spec.js | 243 ---------------------- src/Adapters/Push/OneSignalPushAdapter.js | 209 ------------------- 2 files changed, 452 deletions(-) delete mode 100644 spec/OneSignalPushAdapter.spec.js delete mode 100644 src/Adapters/Push/OneSignalPushAdapter.js diff --git a/spec/OneSignalPushAdapter.spec.js b/spec/OneSignalPushAdapter.spec.js deleted file mode 100644 index 0565643f..00000000 --- a/spec/OneSignalPushAdapter.spec.js +++ /dev/null @@ -1,243 +0,0 @@ -'use strict'; - -var OneSignalPushAdapter = require('../src/Adapters/Push/OneSignalPushAdapter'); -var classifyInstallations = require('parse-server-push-adapter').utils.classifyInstallations; - -// Make mock config -var pushConfig = { - oneSignalAppId:"APP ID", - oneSignalApiKey:"API KEY" -}; - -describe('OneSignalPushAdapter', () => { - it('can be initialized', (done) => { - - var oneSignalPushAdapter = new OneSignalPushAdapter(pushConfig); - - var senderMap = oneSignalPushAdapter.senderMap; - - expect(senderMap.ios instanceof Function).toBe(true); - expect(senderMap.android instanceof Function).toBe(true); - done(); - }); - - it('cannot be initialized if options are missing', (done) => { - - expect(() => { - new OneSignalPushAdapter(); - }).toThrow("Trying to initialize OneSignalPushAdapter without oneSignalAppId or oneSignalApiKey"); - done(); - }); - - it('can get valid push types', (done) => { - var oneSignalPushAdapter = new OneSignalPushAdapter(pushConfig); - - expect(oneSignalPushAdapter.getValidPushTypes()).toEqual(['ios', 'android']); - done(); - }); - - it('can classify installation', (done) => { - // Mock installations - var validPushTypes = ['ios', 'android']; - var installations = [ - { - deviceType: 'android', - deviceToken: 'androidToken' - }, - { - deviceType: 'ios', - deviceToken: 'iosToken' - }, - { - deviceType: 'win', - deviceToken: 'winToken' - }, - { - deviceType: 'android', - deviceToken: undefined - } - ]; - - var deviceMap = OneSignalPushAdapter.classifyInstallations(installations, validPushTypes); - expect(deviceMap['android']).toEqual([makeDevice('androidToken')]); - expect(deviceMap['ios']).toEqual([makeDevice('iosToken')]); - expect(deviceMap['win']).toBe(undefined); - done(); - }); - - - it('can send push notifications', (done) => { - var oneSignalPushAdapter = new OneSignalPushAdapter(pushConfig); - - // Mock android ios senders - var androidSender = jasmine.createSpy('send') - var iosSender = jasmine.createSpy('send') - - var senderMap = { - ios: iosSender, - android: androidSender - }; - oneSignalPushAdapter.senderMap = senderMap; - - // Mock installations - var installations = [ - { - deviceType: 'android', - deviceToken: 'androidToken' - }, - { - deviceType: 'ios', - deviceToken: 'iosToken' - }, - { - deviceType: 'win', - deviceToken: 'winToken' - }, - { - deviceType: 'android', - deviceToken: undefined - } - ]; - var data = {}; - - oneSignalPushAdapter.send(data, installations); - // Check android sender - expect(androidSender).toHaveBeenCalled(); - var args = androidSender.calls.first().args; - expect(args[0]).toEqual(data); - expect(args[1]).toEqual([ - makeDevice('androidToken') - ]); - // Check ios sender - expect(iosSender).toHaveBeenCalled(); - args = iosSender.calls.first().args; - expect(args[0]).toEqual(data); - expect(args[1]).toEqual([ - makeDevice('iosToken') - ]); - done(); - }); - - it("can send iOS notifications", (done) => { - var oneSignalPushAdapter = new OneSignalPushAdapter(pushConfig); - var sendToOneSignal = jasmine.createSpy('sendToOneSignal'); - oneSignalPushAdapter.sendToOneSignal = sendToOneSignal; - - oneSignalPushAdapter.sendToAPNS({'data':{ - 'badge': 1, - 'alert': "Example content", - 'sound': "Example sound", - 'content-available': 1, - 'misc-data': 'Example Data' - }},[{'deviceToken':'iosToken1'},{'deviceToken':'iosToken2'}]) - - expect(sendToOneSignal).toHaveBeenCalled(); - var args = sendToOneSignal.calls.first().args; - expect(args[0]).toEqual({ - 'ios_badgeType':'SetTo', - 'ios_badgeCount':1, - 'contents': { 'en':'Example content'}, - 'ios_sound': 'Example sound', - 'content_available':true, - 'data':{'misc-data':'Example Data'}, - 'include_ios_tokens':['iosToken1','iosToken2'] - }) - done(); - }); - - it("can send Android notifications", (done) => { - var oneSignalPushAdapter = new OneSignalPushAdapter(pushConfig); - var sendToOneSignal = jasmine.createSpy('sendToOneSignal'); - oneSignalPushAdapter.sendToOneSignal = sendToOneSignal; - - oneSignalPushAdapter.sendToGCM({'data':{ - 'title': 'Example title', - 'alert': 'Example content', - 'misc-data': 'Example Data' - }},[{'deviceToken':'androidToken1'},{'deviceToken':'androidToken2'}]) - - expect(sendToOneSignal).toHaveBeenCalled(); - var args = sendToOneSignal.calls.first().args; - expect(args[0]).toEqual({ - 'contents': { 'en':'Example content'}, - 'title': {'en':'Example title'}, - 'data':{'misc-data':'Example Data'}, - 'include_android_reg_ids': ['androidToken1','androidToken2'] - }) - done(); - }); - - it("can post the correct data", (done) => { - - var oneSignalPushAdapter = new OneSignalPushAdapter(pushConfig); - - var write = jasmine.createSpy('write'); - oneSignalPushAdapter.https = { - 'request': function(a,b) { - return { - 'end':function(){}, - 'on':function(a,b){}, - 'write':write - } - } - }; - - var installations = [ - { - deviceType: 'android', - deviceToken: 'androidToken' - }, - { - deviceType: 'ios', - deviceToken: 'iosToken' - }, - { - deviceType: 'win', - deviceToken: 'winToken' - }, - { - deviceType: 'android', - deviceToken: undefined - } - ]; - - oneSignalPushAdapter.send({'data':{ - 'title': 'Example title', - 'alert': 'Example content', - 'content-available':1, - 'misc-data': 'Example Data' - }}, installations); - - expect(write).toHaveBeenCalled(); - - // iOS - let args = write.calls.first().args; - expect(args[0]).toEqual(JSON.stringify({ - 'contents': { 'en':'Example content'}, - 'content_available':true, - 'data':{'title':'Example title','misc-data':'Example Data'}, - 'include_ios_tokens':['iosToken'], - 'app_id':'APP ID' - })); - - // Android - args = write.calls.mostRecent().args; - expect(args[0]).toEqual(JSON.stringify({ - 'contents': { 'en':'Example content'}, - 'title': {'en':'Example title'}, - 'data':{"content-available":1,'misc-data':'Example Data'}, - 'include_android_reg_ids':['androidToken'], - 'app_id':'APP ID' - })); - - done(); - }); - - function makeDevice(deviceToken, appIdentifier) { - return { - deviceToken: deviceToken, - appIdentifier: appIdentifier - }; - } - -}); diff --git a/src/Adapters/Push/OneSignalPushAdapter.js b/src/Adapters/Push/OneSignalPushAdapter.js deleted file mode 100644 index 9e429850..00000000 --- a/src/Adapters/Push/OneSignalPushAdapter.js +++ /dev/null @@ -1,209 +0,0 @@ -"use strict"; -// ParsePushAdapter is the default implementation of -// PushAdapter, it uses GCM for android push and APNS -// for ios push. - -import { utils } from 'parse-server-push-adapter'; -import ParsePushAdapter from 'parse-server-push-adapter'; - -const Parse = require('parse/node').Parse; -var deepcopy = require('deepcopy'); -import PushAdapter from './PushAdapter'; - -export class OneSignalPushAdapter extends PushAdapter { - - constructor(pushConfig = {}) { - super(pushConfig); - this.https = require('https'); - - this.validPushTypes = ['ios', 'android']; - this.senderMap = {}; - this.OneSignalConfig = {}; - const { oneSignalAppId, oneSignalApiKey } = pushConfig; - if (!oneSignalAppId || !oneSignalApiKey) { - throw "Trying to initialize OneSignalPushAdapter without oneSignalAppId or oneSignalApiKey"; - } - this.OneSignalConfig['appId'] = pushConfig['oneSignalAppId']; - this.OneSignalConfig['apiKey'] = pushConfig['oneSignalApiKey']; - - this.senderMap['ios'] = this.sendToAPNS.bind(this); - this.senderMap['android'] = this.sendToGCM.bind(this); - } - - send(data, installations) { - let deviceMap = utils.classifyInstallations(installations, this.validPushTypes); - - let sendPromises = []; - for (let pushType in deviceMap) { - let sender = this.senderMap[pushType]; - if (!sender) { - console.log('Can not find sender for push type %s, %j', pushType, data); - continue; - } - let devices = deviceMap[pushType]; - - if(devices.length > 0) { - sendPromises.push(sender(data, devices)); - } - } - return Parse.Promise.when(sendPromises); - } - - static classifyInstallations(installations, validTypes) { - return utils.classifyInstallations(installations, validTypes) - } - - getValidPushTypes() { - return this.validPushTypes; - } - - sendToAPNS(data,tokens) { - - data= deepcopy(data['data']); - - var post = {}; - if(data['badge']) { - if(data['badge'] == "Increment") { - post['ios_badgeType'] = 'Increase'; - post['ios_badgeCount'] = 1; - } else { - post['ios_badgeType'] = 'SetTo'; - post['ios_badgeCount'] = data['badge']; - } - delete data['badge']; - } - if(data['alert']) { - post['contents'] = {en: data['alert']}; - delete data['alert']; - } - if(data['sound']) { - post['ios_sound'] = data['sound']; - delete data['sound']; - } - if(data['content-available'] == 1) { - post['content_available'] = true; - delete data['content-available']; - } - post['data'] = data; - - let promise = new Parse.Promise(); - - var chunk = 2000 // OneSignal can process 2000 devices at a time - var tokenlength=tokens.length; - var offset = 0 - // handle onesignal response. Start next batch if there's not an error. - let handleResponse = function(wasSuccessful) { - if (!wasSuccessful) { - return promise.reject("OneSignal Error"); - } - - if(offset >= tokenlength) { - promise.resolve() - } else { - this.sendNext(); - } - }.bind(this) - - this.sendNext = function() { - post['include_ios_tokens'] = []; - tokens.slice(offset,offset+chunk).forEach(function(i) { - post['include_ios_tokens'].push(i['deviceToken']) - }) - offset+=chunk; - this.sendToOneSignal(post, handleResponse); - }.bind(this) - - this.sendNext() - - return promise; - } - - sendToGCM(data,tokens) { - data= deepcopy(data['data']); - - var post = {}; - - if(data['alert']) { - post['contents'] = {en: data['alert']}; - delete data['alert']; - } - if(data['title']) { - post['title'] = {en: data['title']}; - delete data['title']; - } - if(data['uri']) { - post['url'] = data['uri']; - } - - post['data'] = data; - - let promise = new Parse.Promise(); - - var chunk = 2000 // OneSignal can process 2000 devices at a time - var tokenlength=tokens.length; - var offset = 0 - // handle onesignal response. Start next batch if there's not an error. - let handleResponse = function(wasSuccessful) { - if (!wasSuccessful) { - return promise.reject("OneSIgnal Error"); - } - - if(offset >= tokenlength) { - promise.resolve() - } else { - this.sendNext(); - } - }.bind(this); - - this.sendNext = function() { - post['include_android_reg_ids'] = []; - tokens.slice(offset,offset+chunk).forEach(function(i) { - post['include_android_reg_ids'].push(i['deviceToken']) - }) - offset+=chunk; - this.sendToOneSignal(post, handleResponse); - }.bind(this) - - - this.sendNext(); - return promise; - } - - sendToOneSignal(data, cb) { - let headers = { - "Content-Type": "application/json", - "Authorization": "Basic "+this.OneSignalConfig['apiKey'] - }; - let options = { - host: "onesignal.com", - port: 443, - path: "/api/v1/notifications", - method: "POST", - headers: headers - }; - data['app_id'] = this.OneSignalConfig['appId']; - - let request = this.https.request(options, function(res) { - if(res.statusCode < 299) { - cb(true); - } else { - console.log('OneSignal Error'); - res.on('data', function(chunk) { - console.log(chunk.toString()) - }); - cb(false) - } - }); - request.on('error', function(e) { - console.log("Error connecting to OneSignal") - console.log(e); - cb(false); - }); - request.write(JSON.stringify(data)) - request.end(); - } -} - - -export default OneSignalPushAdapter; -module.exports = OneSignalPushAdapter;