From 48dcfe37e7861c764d3f2e1d1782b3cfc9bd6bca Mon Sep 17 00:00:00 2001 From: Florent Vilmart Date: Mon, 22 Feb 2016 18:31:10 -0500 Subject: [PATCH] Removes shared code in PushAdapter, replaces AdapterLoader.load by loadAdapter --- spec/AdapterLoader.spec.js | 18 +++---- spec/OneSignalPushAdapter.spec.js | 4 +- spec/ParsePushAdapter.spec.js | 2 +- src/Adapters/AdapterLoader.js | 58 +++++++++++------------ src/Adapters/Push/OneSignalPushAdapter.js | 12 ++++- src/Adapters/Push/ParsePushAdapter.js | 11 ++++- src/Adapters/Push/PushAdapter.js | 34 +------------ src/Adapters/Push/PushAdapterUtils.js | 30 ++++++++++++ src/index.js | 8 ++-- 9 files changed, 95 insertions(+), 82 deletions(-) create mode 100644 src/Adapters/Push/PushAdapterUtils.js diff --git a/spec/AdapterLoader.spec.js b/spec/AdapterLoader.spec.js index d577896934..80f30d6fed 100644 --- a/spec/AdapterLoader.spec.js +++ b/spec/AdapterLoader.spec.js @@ -1,5 +1,5 @@ -var AdapterLoader = require("../src/Adapters/AdapterLoader").AdapterLoader; +var loadAdapter = require("../src/Adapters/AdapterLoader").loadAdapter; var FilesAdapter = require("../src/Adapters/Files/FilesAdapter").default; describe("AdaptableController", ()=>{ @@ -7,7 +7,7 @@ describe("AdaptableController", ()=>{ it("should instantiate an adapter from string in object", (done) => { var adapterPath = require('path').resolve("./spec/MockAdapter"); - var adapter = AdapterLoader.load({ + var adapter = loadAdapter({ adapter: adapterPath, key: "value", foo: "bar" @@ -21,7 +21,7 @@ describe("AdaptableController", ()=>{ it("should instantiate an adapter from string", (done) => { var adapterPath = require('path').resolve("./spec/MockAdapter"); - var adapter = AdapterLoader.load(adapterPath); + var adapter = loadAdapter(adapterPath); expect(adapter instanceof Object).toBe(true); expect(adapter.options).toBe(adapterPath); @@ -30,7 +30,7 @@ describe("AdaptableController", ()=>{ it("should instantiate an adapter from string that is module", (done) => { var adapterPath = require('path').resolve("./src/Adapters/Files/FilesAdapter"); - var adapter = AdapterLoader.load({ + var adapter = loadAdapter({ adapter: adapterPath }); @@ -39,7 +39,7 @@ describe("AdaptableController", ()=>{ }); it("should instantiate an adapter from function/Class", (done) => { - var adapter = AdapterLoader.load({ + var adapter = loadAdapter({ adapter: FilesAdapter }); expect(adapter instanceof FilesAdapter).toBe(true); @@ -47,22 +47,22 @@ describe("AdaptableController", ()=>{ }); it("should instantiate the default adapter from Class", (done) => { - var adapter = AdapterLoader.load(null, FilesAdapter); + var adapter = loadAdapter(null, FilesAdapter); expect(adapter instanceof FilesAdapter).toBe(true); done(); }); it("should use the default adapter", (done) => { var defaultAdapter = new FilesAdapter(); - var adapter = AdapterLoader.load(null, defaultAdapter); + var adapter = loadAdapter(null, defaultAdapter); expect(adapter instanceof FilesAdapter).toBe(true); done(); }); it("should use the provided adapter", (done) => { var originalAdapter = new FilesAdapter(); - var adapter = AdapterLoader.load(originalAdapter); + var adapter = loadAdapter(originalAdapter); expect(adapter).toBe(originalAdapter); done(); }); -}); \ No newline at end of file +}); diff --git a/spec/OneSignalPushAdapter.spec.js b/spec/OneSignalPushAdapter.spec.js index a49e5e8d81..2c165c4588 100644 --- a/spec/OneSignalPushAdapter.spec.js +++ b/spec/OneSignalPushAdapter.spec.js @@ -1,6 +1,6 @@ var OneSignalPushAdapter = require('../src/Adapters/Push/OneSignalPushAdapter'); - +var classifyInstallations = require('../src/Adapters/Push/PushAdapterUtils').classifyInstallations; describe('OneSignalPushAdapter', () => { it('can be initialized', (done) => { // Make mock config @@ -47,7 +47,7 @@ describe('OneSignalPushAdapter', () => { } ]; - var deviceMap = OneSignalPushAdapter.classifyInstallation(installations, validPushTypes); + var deviceMap = OneSignalPushAdapter.classifyInstallations(installations, validPushTypes); expect(deviceMap['android']).toEqual([makeDevice('androidToken')]); expect(deviceMap['ios']).toEqual([makeDevice('iosToken')]); expect(deviceMap['win']).toBe(undefined); diff --git a/spec/ParsePushAdapter.spec.js b/spec/ParsePushAdapter.spec.js index 4cc4f0f85f..e21a9dbb21 100644 --- a/spec/ParsePushAdapter.spec.js +++ b/spec/ParsePushAdapter.spec.js @@ -80,7 +80,7 @@ describe('ParsePushAdapter', () => { } ]; - var deviceMap = ParsePushAdapter.classifyInstallation(installations, validPushTypes); + var deviceMap = ParsePushAdapter.classifyInstallations(installations, validPushTypes); expect(deviceMap['android']).toEqual([makeDevice('androidToken')]); expect(deviceMap['ios']).toEqual([makeDevice('iosToken')]); expect(deviceMap['win']).toBe(undefined); diff --git a/src/Adapters/AdapterLoader.js b/src/Adapters/AdapterLoader.js index a0e0b877c6..cfe51ffd7e 100644 --- a/src/Adapters/AdapterLoader.js +++ b/src/Adapters/AdapterLoader.js @@ -1,39 +1,35 @@ -export class AdapterLoader { - static load(options, defaultAdapter) { - let adapter; +export function loadAdapter(options, defaultAdapter) { + let adapter; - // We have options and options have adapter key - if (options) { - // Pass an adapter as a module name, a function or an instance - if (typeof options == "string" || typeof options == "function" || options.constructor != Object) { - adapter = options; - } - if (options.adapter) { - adapter = options.adapter; - } + // We have options and options have adapter key + if (options) { + // Pass an adapter as a module name, a function or an instance + if (typeof options == "string" || typeof options == "function" || options.constructor != Object) { + adapter = options; } - - if (!adapter) { - adapter = defaultAdapter; + if (options.adapter) { + adapter = options.adapter; } + } + + if (!adapter) { + adapter = defaultAdapter; + } - // This is a string, require the module - if (typeof adapter === "string") { - adapter = require(adapter); - // If it's define as a module, get the default - if (adapter.default) { - adapter = adapter.default; - } - } - // From there it's either a function or an object - // if it's an function, instanciate and pass the options - if (typeof adapter === "function") { - var Adapter = adapter; - adapter = new Adapter(options); + // This is a string, require the module + if (typeof adapter === "string") { + adapter = require(adapter); + // If it's define as a module, get the default + if (adapter.default) { + adapter = adapter.default; } - return adapter; } + // From there it's either a function or an object + // if it's an function, instanciate and pass the options + if (typeof adapter === "function") { + var Adapter = adapter; + adapter = new Adapter(options); + } + return adapter; } - -export default AdapterLoader; diff --git a/src/Adapters/Push/OneSignalPushAdapter.js b/src/Adapters/Push/OneSignalPushAdapter.js index 2f832f82d6..fe2fcc0b84 100644 --- a/src/Adapters/Push/OneSignalPushAdapter.js +++ b/src/Adapters/Push/OneSignalPushAdapter.js @@ -3,6 +3,8 @@ // PushAdapter, it uses GCM for android push and APNS // for ios push. +import { classifyInstallations } from './PushAdapterUtils'; + const Parse = require('parse/node').Parse; var deepcopy = require('deepcopy'); import PushAdapter from './PushAdapter'; @@ -25,7 +27,7 @@ export class OneSignalPushAdapter extends PushAdapter { send(data, installations) { console.log("Sending notification to "+installations.length+" devices.") - let deviceMap = PushAdapter.classifyInstallation(installations, this.validPushTypes); + let deviceMap = classifyInstallations(installations, this.validPushTypes); let sendPromises = []; for (let pushType in deviceMap) { @@ -43,6 +45,14 @@ export class OneSignalPushAdapter extends PushAdapter { return Parse.Promise.when(sendPromises); } + static classifyInstallations(installations, validTypes) { + return classifyInstallations(installations, validTypes) + } + + getValidPushTypes() { + return this.validPushTypes; + } + sendToAPNS(data,tokens) { data= deepcopy(data['data']); diff --git a/src/Adapters/Push/ParsePushAdapter.js b/src/Adapters/Push/ParsePushAdapter.js index 00b1e9b416..3f554054ed 100644 --- a/src/Adapters/Push/ParsePushAdapter.js +++ b/src/Adapters/Push/ParsePushAdapter.js @@ -7,6 +7,7 @@ const Parse = require('parse/node').Parse; const GCM = require('../../GCM'); const APNS = require('../../APNS'); import PushAdapter from './PushAdapter'; +import { classifyInstallations } from './PushAdapterUtils'; export class ParsePushAdapter extends PushAdapter { constructor(pushConfig = {}) { @@ -31,8 +32,16 @@ export class ParsePushAdapter extends PushAdapter { } } + getValidPushTypes() { + return this.validPushTypes; + } + + static classifyInstallations(installations, validTypes) { + return classifyInstallations(installations, validTypes) + } + send(data, installations) { - let deviceMap = PushAdapter.classifyInstallation(installations, this.validPushTypes); + let deviceMap = classifyInstallations(installations, this.validPushTypes); let sendPromises = []; for (let pushType in deviceMap) { let sender = this.senderMap[pushType]; diff --git a/src/Adapters/Push/PushAdapter.js b/src/Adapters/Push/PushAdapter.js index e83ec62adb..846124b5af 100644 --- a/src/Adapters/Push/PushAdapter.js +++ b/src/Adapters/Push/PushAdapter.js @@ -16,39 +16,7 @@ export class PushAdapter { * Get an array of valid push types. * @returns {Array} An array of valid push types */ - getValidPushTypes() { - return this.validPushTypes; - } - - /**g - * Classify the device token of installations based on its device type. - * @param {Object} installations An array of installations - * @param {Array} validPushTypes An array of valid push types(string) - * @returns {Object} A map whose key is device type and value is an array of device - */ - static classifyInstallation(installations, validPushTypes) { - // Init deviceTokenMap, create a empty array for each valid pushType - let deviceMap = {}; - for (let validPushType of validPushTypes) { - deviceMap[validPushType] = []; - } - for (let installation of installations) { - // No deviceToken, ignore - if (!installation.deviceToken) { - continue; - } - let pushType = installation.deviceType; - if (deviceMap[pushType]) { - deviceMap[pushType].push({ - deviceToken: installation.deviceToken, - appIdentifier: installation.appIdentifier - }); - } else { - console.log('Unknown push type from installation %j', installation); - } - } - return deviceMap; - } + getValidPushTypes() {} } export default PushAdapter; diff --git a/src/Adapters/Push/PushAdapterUtils.js b/src/Adapters/Push/PushAdapterUtils.js new file mode 100644 index 0000000000..a78aab42fd --- /dev/null +++ b/src/Adapters/Push/PushAdapterUtils.js @@ -0,0 +1,30 @@ +/**g + * Classify the device token of installations based on its device type. + * @param {Object} installations An array of installations + * @param {Array} validPushTypes An array of valid push types(string) + * @returns {Object} A map whose key is device type and value is an array of device + */ +export function classifyInstallations(installations, validPushTypes) { + // Init deviceTokenMap, create a empty array for each valid pushType + let deviceMap = {}; + for (let validPushType of validPushTypes) { + deviceMap[validPushType] = []; + } + for (let installation of installations) { + // No deviceToken, ignore + if (!installation.deviceToken) { + continue; + } + let pushType = installation.deviceType; + if (deviceMap[pushType]) { + deviceMap[pushType].push({ + deviceToken: installation.deviceToken, + appIdentifier: installation.appIdentifier + }); + } else { + console.log('Unknown push type from installation %j', installation); + } + } + return deviceMap; +} + diff --git a/src/index.js b/src/index.js index 92523ea8b5..b812c8b10e 100644 --- a/src/index.js +++ b/src/index.js @@ -33,7 +33,7 @@ import { PushRouter } from './Routers/PushRouter'; import { FilesRouter } from './Routers/FilesRouter'; import { LogsRouter } from './Routers/LogsRouter'; -import { AdapterLoader } from './Adapters/AdapterLoader'; +import { loadAdapter } from './Adapters/AdapterLoader'; import { FileLoggerAdapter } from './Adapters/Logger/FileLoggerAdapter'; import { LoggerController } from './Controllers/LoggerController'; @@ -107,9 +107,9 @@ function ParseServer({ } - const filesControllerAdapter = AdapterLoader.load(filesAdapter, GridStoreAdapter); - const pushControllerAdapter = AdapterLoader.load(push, ParsePushAdapter); - const loggerControllerAdapter = AdapterLoader.load(loggerAdapter, FileLoggerAdapter); + const filesControllerAdapter = loadAdapter(filesAdapter, GridStoreAdapter); + const pushControllerAdapter = loadAdapter(push, ParsePushAdapter); + const loggerControllerAdapter = loadAdapter(loggerAdapter, FileLoggerAdapter); // We pass the options and the base class for the adatper, // Note that passing an instance would work too