From 19e62936385cdba538e4993717c6ee3f84934150 Mon Sep 17 00:00:00 2001 From: Drew Gross Date: Wed, 23 Mar 2016 12:33:26 -0700 Subject: [PATCH 1/3] Mark push as enabled in serverInfo endpoint --- spec/features.spec.js | 26 +------- src/Controllers/AdaptableController.js | 4 -- src/Controllers/PushController.js | 25 ++++--- src/Routers/FeaturesRouter.js | 42 +++++++++++- src/features.js | 92 -------------------------- 5 files changed, 52 insertions(+), 137 deletions(-) delete mode 100644 src/features.js diff --git a/spec/features.spec.js b/spec/features.spec.js index 9d18adf7..c2a60ebd 100644 --- a/spec/features.spec.js +++ b/spec/features.spec.js @@ -1,33 +1,9 @@ 'use strict'; -var features = require('../src/features'); const request = require("request"); describe('features', () => { - it('set and get features', (done) => { - features.setFeature('push', { - testOption1: true, - testOption2: false - }); - - var _features = features.getFeatures(); - - var expected = { - testOption1: true, - testOption2: false - }; - - expect(_features.push).toEqual(expected); - done(); - }); - - it('get features that does not exist', (done) => { - var _features = features.getFeatures(); - expect(_features.test).toBeUndefined(); - done(); - }); - - it('requires the master key to get all schemas', done => { + it('requires the master key to get features', done => { request.get({ url: 'http://localhost:8378/1/serverInfo', json: true, diff --git a/src/Controllers/AdaptableController.js b/src/Controllers/AdaptableController.js index 7ff8ce29..a7cf4e9b 100644 --- a/src/Controllers/AdaptableController.js +++ b/src/Controllers/AdaptableController.js @@ -18,12 +18,8 @@ export class AdaptableController { this.options = options; this.appId = appId; this.adapter = adapter; - this.setFeature(); } - // sets features for Dashboard to consume from features router - setFeature() {} - set adapter(adapter) { this.validateAdapter(adapter); this[_adapter] = adapter; diff --git a/src/Controllers/PushController.js b/src/Controllers/PushController.js index efe9a750..57770de2 100644 --- a/src/Controllers/PushController.js +++ b/src/Controllers/PushController.js @@ -1,22 +1,17 @@ -import { Parse } from 'parse/node'; -import PromiseRouter from '../PromiseRouter'; -import rest from '../rest'; +import { Parse } from 'parse/node'; +import PromiseRouter from '../PromiseRouter'; +import rest from '../rest'; import AdaptableController from './AdaptableController'; -import { PushAdapter } from '../Adapters/Push/PushAdapter'; -import deepcopy from 'deepcopy'; -import features from '../features'; -import RestQuery from '../RestQuery'; -import pushStatusHandler from '../pushStatusHandler'; +import { PushAdapter } from '../Adapters/Push/PushAdapter'; +import deepcopy from 'deepcopy'; +import RestQuery from '../RestQuery'; +import pushStatusHandler from '../pushStatusHandler'; const FEATURE_NAME = 'push'; const UNSUPPORTED_BADGE_KEY = "unsupported"; export class PushController extends AdaptableController { - setFeature() { - features.setFeature(FEATURE_NAME, this.adapter.feature || {}); - } - /** * Check whether the deviceType parameter in qury condition is valid or not. * @param {Object} where A query condition @@ -39,9 +34,13 @@ export class PushController extends AdaptableController { } } + pushIsAvailable() { + return !!this.adapter; + } + sendPush(body = {}, where = {}, config, auth, wait) { var pushAdapter = this.adapter; - if (!pushAdapter) { + if (!this.pushIsAvailable()) { throw new Parse.Error(Parse.Error.PUSH_MISCONFIGURED, 'Push adapter is not available'); } diff --git a/src/Routers/FeaturesRouter.js b/src/Routers/FeaturesRouter.js index f0cdb3ea..f75af722 100644 --- a/src/Routers/FeaturesRouter.js +++ b/src/Routers/FeaturesRouter.js @@ -1,13 +1,49 @@ import { version } from '../../package.json'; import PromiseRouter from '../PromiseRouter'; import * as middleware from "../middlewares"; -import { getFeatures } from '../features'; export class FeaturesRouter extends PromiseRouter { mountRoutes() { - this.route('GET','/serverInfo', middleware.promiseEnforceMasterKeyAccess, () => { + this.route('GET','/serverInfo', middleware.promiseEnforceMasterKeyAccess, req => { + const features = { + globalConfig: { + create: false, + read: false, + update: false, + delete: false, + }, + hooks: { + create: false, + read: false, + update: false, + delete: false, + }, + logs: { + level: false, + size: false, + order: false, + until: false, + from: false, + }, + push: { + immediatePush: req.config.pushController.pushIsAvailable(), + scheduledPush: false, + storedPushData: false, + pushAudiences: false, + }, + schemas: { + addField: true, + removeField: true, + addClass: true, + removeClass: true, + clearAllDataFromClass: false, + exportClass: false, + editClassLevelPermissions: true, + }, + }; + return { response: { - features: getFeatures(), + features: features, parseServerVersion: version, } }; }); diff --git a/src/features.js b/src/features.js deleted file mode 100644 index c4b7f3f5..00000000 --- a/src/features.js +++ /dev/null @@ -1,92 +0,0 @@ -/** - * features.js - * Feature config file that holds information on the features that are currently - * available on Parse Server. This is primarily created to work with an UI interface - * like the web dashboard. The list of features will change depending on the your - * app, choice of adapter as well as Parse Server version. This approach will enable - * the dashboard to be built independently and still support these use cases. - * - * - * Default features and feature options are listed in the features object. - * - * featureSwitch is a convenient way to turn on/off features without changing the config - * - * Features that use Adapters should specify the feature options through - * the setFeature method in your controller and feature - * Reference PushController and ParsePushAdapter as an example. - * - * NOTE: When adding new endpoints be sure to update this list both (features, featureSwitch) - * if you are planning to have a UI consume it. - */ - -// default features -let features = { - globalConfig: { - create: false, - read: false, - update: false, - delete: false, - }, - hooks: { - create: false, - read: false, - update: false, - delete: false, - }, - logs: { - level: false, - size: false, - order: false, - until: false, - from: false, - }, - push: { - immediatePush: false, - scheduledPush: false, - storedPushData: false, - pushAudiences: false, - }, - schemas: { - addField: true, - removeField: true, - addClass: true, - removeClass: true, - clearAllDataFromClass: false, - exportClass: false, - editClassLevelPermissions: true, - }, -}; - -// master switch for features -let featuresSwitch = { - globalConfig: true, - hooks: true, - logs: true, - push: true, - schemas: true, -}; - -/** - * set feature config options - */ -function setFeature(key, value) { - features[key] = value; -} - -/** - * get feature config options - */ -function getFeatures() { - let result = {}; - Object.keys(features).forEach((key) => { - if (featuresSwitch[key] && features[key]) { - result[key] = features[key]; - } - }); - return result; -} - -module.exports = { - getFeatures, - setFeature, -}; From ec35c39724ddf68a592807456ad7b6ab9d224460 Mon Sep 17 00:00:00 2001 From: Drew Gross Date: Thu, 24 Mar 2016 19:39:54 -0700 Subject: [PATCH 2/3] Fix bad rebase --- src/ParseServer.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ParseServer.js b/src/ParseServer.js index cf33b616..b4edc8ec 100644 --- a/src/ParseServer.js +++ b/src/ParseServer.js @@ -42,7 +42,6 @@ import { randomString } from './cryptoUtils'; import { RolesRouter } from './Routers/RolesRouter'; import { SchemasRouter } from './Routers/SchemasRouter'; import { SessionsRouter } from './Routers/SessionsRouter'; -import { setFeature } from './features'; import { UserController } from './Controllers/UserController'; import { UsersRouter } from './Routers/UsersRouter'; @@ -111,7 +110,6 @@ class ParseServer { }, liveQuery = {} }) { - setFeature('serverVersion', parseServerPackage.version); // Initialize the node client SDK automatically Parse.initialize(appId, javascriptKey || 'unused', masterKey); Parse.serverURL = serverURL; From 7cdf85b3677d7a2096c34af74126822f732abb97 Mon Sep 17 00:00:00 2001 From: Drew Gross Date: Thu, 24 Mar 2016 20:59:50 -0700 Subject: [PATCH 3/3] Use getter --- src/Controllers/PushController.js | 4 ++-- src/Routers/FeaturesRouter.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Controllers/PushController.js b/src/Controllers/PushController.js index 57770de2..33e5570d 100644 --- a/src/Controllers/PushController.js +++ b/src/Controllers/PushController.js @@ -34,13 +34,13 @@ export class PushController extends AdaptableController { } } - pushIsAvailable() { + get pushIsAvailable() { return !!this.adapter; } sendPush(body = {}, where = {}, config, auth, wait) { var pushAdapter = this.adapter; - if (!this.pushIsAvailable()) { + if (!this.pushIsAvailable) { throw new Parse.Error(Parse.Error.PUSH_MISCONFIGURED, 'Push adapter is not available'); } diff --git a/src/Routers/FeaturesRouter.js b/src/Routers/FeaturesRouter.js index f75af722..db9a77d7 100644 --- a/src/Routers/FeaturesRouter.js +++ b/src/Routers/FeaturesRouter.js @@ -26,7 +26,7 @@ export class FeaturesRouter extends PromiseRouter { from: false, }, push: { - immediatePush: req.config.pushController.pushIsAvailable(), + immediatePush: req.config.pushController.pushIsAvailable, scheduledPush: false, storedPushData: false, pushAudiences: false,