Skip to content

Commit d70e87f

Browse files
committed
Merge pull request #748 from drew-gross/touch-up-features-endpoint
Touch up features endpoint
2 parents 1bfee45 + ccc2a1a commit d70e87f

File tree

5 files changed

+62
-61
lines changed

5 files changed

+62
-61
lines changed

spec/features.spec.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const request = require("request");
55

66
describe('features', () => {
77
it('set and get features', (done) => {
8-
features.setFeature('users', {
8+
features.setFeature('push', {
99
testOption1: true,
1010
testOption2: false
1111
});
@@ -14,10 +14,10 @@ describe('features', () => {
1414

1515
var expected = {
1616
testOption1: true,
17-
testOption2: false
17+
testOption2: false
1818
};
1919

20-
expect(_features.users).toEqual(expected);
20+
expect(_features.push).toEqual(expected);
2121
done();
2222
});
2323

@@ -29,7 +29,7 @@ describe('features', () => {
2929

3030
it('requires the master key to get all schemas', done => {
3131
request.get({
32-
url: 'http://localhost:8378/1/features',
32+
url: 'http://localhost:8378/1/serverInfo',
3333
json: true,
3434
headers: {
3535
'X-Parse-Application-Id': 'test',

spec/index.spec.js

+15
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var request = require('request');
2+
var parseServerPackage = require('../package.json');
23
var MockEmailAdapterWithOptions = require('./MockEmailAdapterWithOptions');
34

45
describe('server', () => {
@@ -153,4 +154,18 @@ describe('server', () => {
153154
})).toThrow('SimpleMailgunAdapter requires an API Key and domain.');
154155
done();
155156
});
157+
158+
it('can report the server version', done => {
159+
request.get({
160+
url: 'http://localhost:8378/1/serverInfo',
161+
headers: {
162+
'X-Parse-Application-Id': 'test',
163+
'X-Parse-Master-Key': 'test',
164+
},
165+
json: true,
166+
}, (error, response, body) => {
167+
expect(body.parseServerVersion).toEqual(parseServerPackage.version);
168+
done();
169+
})
170+
});
156171
});

src/Routers/FeaturesRouter.js

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1-
import PromiseRouter from '../PromiseRouter';
1+
import { version } from '../../package.json';
2+
import PromiseRouter from '../PromiseRouter';
23
import * as middleware from "../middlewares";
34
import { getFeatures } from '../features';
45

56
export class FeaturesRouter extends PromiseRouter {
67
mountRoutes() {
7-
this.route('GET','/features', middleware.promiseEnforceMasterKeyAccess, () => {
8+
this.route('GET','/serverInfo', middleware.promiseEnforceMasterKeyAccess, () => {
89
return { response: {
9-
results: [getFeatures()]
10-
} };
10+
features: getFeatures(),
11+
parseServerVersion: version,
12+
} };
1113
});
1214
}
1315
}

src/features.js

+18-34
Original file line numberDiff line numberDiff line change
@@ -14,42 +14,38 @@
1414
* Features that use Adapters should specify the feature options through
1515
* the setFeature method in your controller and feature
1616
* Reference PushController and ParsePushAdapter as an example.
17-
*
17+
*
1818
* NOTE: When adding new endpoints be sure to update this list both (features, featureSwitch)
19-
* if you are planning to have a UI consume it.
19+
* if you are planning to have a UI consume it.
2020
*/
2121

2222
// default features
2323
let features = {
24-
analytics: {
25-
slowQueries: false,
26-
performanceAnalysis: false,
27-
retentionAnalysis: false,
28-
},
29-
classes: {},
30-
files: {},
31-
functions: {},
3224
globalConfig: {
33-
create: true,
34-
read: true,
35-
update: true,
36-
delete: true,
25+
create: false,
26+
read: false,
27+
update: false,
28+
delete: false,
3729
},
3830
hooks: {
3931
create: false,
4032
read: false,
4133
update: false,
4234
delete: false,
4335
},
44-
iapValidation: {},
45-
installations: {},
4636
logs: {
47-
info: true,
48-
error: true,
37+
level: false,
38+
size: false,
39+
order: false,
40+
until: false,
41+
from: false,
42+
},
43+
push: {
44+
immediatePush: false,
45+
scheduledPush: false,
46+
storedPushData: false,
47+
pushAudiences: false,
4948
},
50-
publicAPI: {},
51-
push: {},
52-
roles: {},
5349
schemas: {
5450
addField: true,
5551
removeField: true,
@@ -58,27 +54,15 @@ let features = {
5854
clearAllDataFromClass: false,
5955
exportClass: false,
6056
},
61-
sessions: {},
62-
users: {},
6357
};
6458

6559
// master switch for features
6660
let featuresSwitch = {
67-
analytics: true,
68-
classes: true,
69-
files: true,
70-
functions: true,
7161
globalConfig: true,
7262
hooks: true,
73-
iapValidation: true,
74-
installations: true,
7563
logs: true,
76-
publicAPI: true,
7764
push: true,
78-
roles: true,
7965
schemas: true,
80-
sessions: true,
81-
users: true,
8266
};
8367

8468
/**
@@ -94,7 +78,7 @@ function setFeature(key, value) {
9478
function getFeatures() {
9579
let result = {};
9680
Object.keys(features).forEach((key) => {
97-
if (featuresSwitch[key]) {
81+
if (featuresSwitch[key] && features[key]) {
9882
result[key] = features[key];
9983
}
10084
});

src/index.js

+19-19
Original file line numberDiff line numberDiff line change
@@ -10,41 +10,41 @@ var batch = require('./batch'),
1010
multer = require('multer'),
1111
Parse = require('parse/node').Parse;
1212

13+
//import passwordReset from './passwordReset';
1314
import cache from './cache';
1415
import Config from './Config';
15-
16+
import parseServerPackage from '../package.json';
1617
import ParsePushAdapter from './Adapters/Push/ParsePushAdapter';
17-
//import passwordReset from './passwordReset';
1818
import PromiseRouter from './PromiseRouter';
19+
import requiredParameter from './requiredParameter';
1920
import { AnalyticsRouter } from './Routers/AnalyticsRouter';
2021
import { ClassesRouter } from './Routers/ClassesRouter';
2122
import { FeaturesRouter } from './Routers/FeaturesRouter';
2223
import { FileLoggerAdapter } from './Adapters/Logger/FileLoggerAdapter';
2324
import { FilesController } from './Controllers/FilesController';
2425
import { FilesRouter } from './Routers/FilesRouter';
2526
import { FunctionsRouter } from './Routers/FunctionsRouter';
26-
import { GridStoreAdapter } from './Adapters/Files/GridStoreAdapter';
27-
import { IAPValidationRouter } from './Routers/IAPValidationRouter';
28-
import { LogsRouter } from './Routers/LogsRouter';
29-
import { HooksRouter } from './Routers/HooksRouter';
30-
import { PublicAPIRouter } from './Routers/PublicAPIRouter';
3127
import { GlobalConfigRouter } from './Routers/GlobalConfigRouter';
32-
28+
import { GridStoreAdapter } from './Adapters/Files/GridStoreAdapter';
3329
import { HooksController } from './Controllers/HooksController';
34-
import { UserController } from './Controllers/UserController';
30+
import { HooksRouter } from './Routers/HooksRouter';
31+
import { IAPValidationRouter } from './Routers/IAPValidationRouter';
3532
import { InstallationsRouter } from './Routers/InstallationsRouter';
3633
import { loadAdapter } from './Adapters/AdapterLoader';
3734
import { LoggerController } from './Controllers/LoggerController';
35+
import { LogsRouter } from './Routers/LogsRouter';
36+
import { PublicAPIRouter } from './Routers/PublicAPIRouter';
3837
import { PushController } from './Controllers/PushController';
3938
import { PushRouter } from './Routers/PushRouter';
39+
import { randomString } from './cryptoUtils';
4040
import { RolesRouter } from './Routers/RolesRouter';
4141
import { S3Adapter } from './Adapters/Files/S3Adapter';
4242
import { SchemasRouter } from './Routers/SchemasRouter';
4343
import { SessionsRouter } from './Routers/SessionsRouter';
44+
import { setFeature } from './features';
45+
import { UserController } from './Controllers/UserController';
4446
import { UsersRouter } from './Routers/UsersRouter';
4547

46-
import requiredParameter from './requiredParameter';
47-
import { randomString } from './cryptoUtils';
4848
// Mutate the Parse object to add the Cloud Code handlers
4949
addParseCloud();
5050

@@ -106,11 +106,11 @@ function ParseServer({
106106
passwordResetSuccess: undefined
107107
},
108108
}) {
109-
109+
setFeature('serverVersion', parseServerPackage.version);
110110
// Initialize the node client SDK automatically
111111
Parse.initialize(appId, javascriptKey || 'unused', masterKey);
112112
Parse.serverURL = serverURL;
113-
113+
114114
if (databaseAdapter) {
115115
DatabaseAdapter.setAdapter(databaseAdapter);
116116
}
@@ -144,7 +144,7 @@ function ParseServer({
144144
const hooksController = new HooksController(appId, collectionPrefix);
145145
const userController = new UserController(emailControllerAdapter, appId, { verifyUserEmails });
146146

147-
147+
148148
cache.apps.set(appId, {
149149
masterKey: masterKey,
150150
serverURL: serverURL,
@@ -173,7 +173,7 @@ function ParseServer({
173173
if (process.env.FACEBOOK_APP_ID) {
174174
cache.apps.get(appId)['facebookAppIds'].push(process.env.FACEBOOK_APP_ID);
175175
}
176-
176+
177177
Config.validate(cache.apps.get(appId));
178178

179179
// This app serves the Parse API directly.
@@ -186,7 +186,7 @@ function ParseServer({
186186
}));
187187

188188
api.use('/', bodyParser.urlencoded({extended: false}), new PublicAPIRouter().expressApp());
189-
189+
190190
// TODO: separate this from the regular ParseServer object
191191
if (process.env.TESTING == 1) {
192192
api.use('/', require('./testing-routes').router);
@@ -215,17 +215,17 @@ function ParseServer({
215215
if (process.env.PARSE_EXPERIMENTAL_CONFIG_ENABLED || process.env.TESTING) {
216216
routers.push(new GlobalConfigRouter());
217217
}
218-
218+
219219
if (process.env.PARSE_EXPERIMENTAL_HOOKS_ENABLED || process.env.TESTING) {
220220
routers.push(new HooksRouter());
221221
}
222-
222+
223223
let routes = routers.reduce((memo, router) => {
224224
return memo.concat(router.routes);
225225
}, []);
226226

227227
let appRouter = new PromiseRouter(routes);
228-
228+
229229
batch.mountOnto(appRouter);
230230

231231
api.use(appRouter.expressApp());

0 commit comments

Comments
 (0)