Mark push as enabled in serverInfo endpoint
This commit is contained in:
@@ -1,33 +1,9 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var features = require('../src/features');
|
|
||||||
const request = require("request");
|
const request = require("request");
|
||||||
|
|
||||||
describe('features', () => {
|
describe('features', () => {
|
||||||
it('set and get features', (done) => {
|
it('requires the master key to 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 => {
|
|
||||||
request.get({
|
request.get({
|
||||||
url: 'http://localhost:8378/1/serverInfo',
|
url: 'http://localhost:8378/1/serverInfo',
|
||||||
json: true,
|
json: true,
|
||||||
|
|||||||
@@ -18,12 +18,8 @@ export class AdaptableController {
|
|||||||
this.options = options;
|
this.options = options;
|
||||||
this.appId = appId;
|
this.appId = appId;
|
||||||
this.adapter = adapter;
|
this.adapter = adapter;
|
||||||
this.setFeature();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// sets features for Dashboard to consume from features router
|
|
||||||
setFeature() {}
|
|
||||||
|
|
||||||
set adapter(adapter) {
|
set adapter(adapter) {
|
||||||
this.validateAdapter(adapter);
|
this.validateAdapter(adapter);
|
||||||
this[_adapter] = adapter;
|
this[_adapter] = adapter;
|
||||||
|
|||||||
@@ -1,22 +1,17 @@
|
|||||||
import { Parse } from 'parse/node';
|
import { Parse } from 'parse/node';
|
||||||
import PromiseRouter from '../PromiseRouter';
|
import PromiseRouter from '../PromiseRouter';
|
||||||
import rest from '../rest';
|
import rest from '../rest';
|
||||||
import AdaptableController from './AdaptableController';
|
import AdaptableController from './AdaptableController';
|
||||||
import { PushAdapter } from '../Adapters/Push/PushAdapter';
|
import { PushAdapter } from '../Adapters/Push/PushAdapter';
|
||||||
import deepcopy from 'deepcopy';
|
import deepcopy from 'deepcopy';
|
||||||
import features from '../features';
|
import RestQuery from '../RestQuery';
|
||||||
import RestQuery from '../RestQuery';
|
import pushStatusHandler from '../pushStatusHandler';
|
||||||
import pushStatusHandler from '../pushStatusHandler';
|
|
||||||
|
|
||||||
const FEATURE_NAME = 'push';
|
const FEATURE_NAME = 'push';
|
||||||
const UNSUPPORTED_BADGE_KEY = "unsupported";
|
const UNSUPPORTED_BADGE_KEY = "unsupported";
|
||||||
|
|
||||||
export class PushController extends AdaptableController {
|
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.
|
* Check whether the deviceType parameter in qury condition is valid or not.
|
||||||
* @param {Object} where A query condition
|
* @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) {
|
sendPush(body = {}, where = {}, config, auth, wait) {
|
||||||
var pushAdapter = this.adapter;
|
var pushAdapter = this.adapter;
|
||||||
if (!pushAdapter) {
|
if (!this.pushIsAvailable()) {
|
||||||
throw new Parse.Error(Parse.Error.PUSH_MISCONFIGURED,
|
throw new Parse.Error(Parse.Error.PUSH_MISCONFIGURED,
|
||||||
'Push adapter is not available');
|
'Push adapter is not available');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,49 @@
|
|||||||
import { version } from '../../package.json';
|
import { version } from '../../package.json';
|
||||||
import PromiseRouter from '../PromiseRouter';
|
import PromiseRouter from '../PromiseRouter';
|
||||||
import * as middleware from "../middlewares";
|
import * as middleware from "../middlewares";
|
||||||
import { getFeatures } from '../features';
|
|
||||||
|
|
||||||
export class FeaturesRouter extends PromiseRouter {
|
export class FeaturesRouter extends PromiseRouter {
|
||||||
mountRoutes() {
|
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: {
|
return { response: {
|
||||||
features: getFeatures(),
|
features: features,
|
||||||
parseServerVersion: version,
|
parseServerVersion: version,
|
||||||
} };
|
} };
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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,
|
|
||||||
};
|
|
||||||
Reference in New Issue
Block a user