Skip to content

Commit 7fc0d45

Browse files
oallouchdplewis
authored andcommitted
Database version in features (#5627)
* adding database.version in the serverInfo (only MongoDB, it gives undefined when using Postgres) * . correction of old 'features' tests . adding engine and database in the StorageAdapter interface and implementations * . version retrieval done in performInitialization . PostgreSQL version * performInitialization now returns a Promise
1 parent 266d632 commit 7fc0d45

File tree

5 files changed

+60
-11
lines changed

5 files changed

+60
-11
lines changed

spec/features.spec.js

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,41 @@
33
const request = require('../lib/request');
44

55
describe('features', () => {
6-
it('requires the master key to get features', done => {
7-
request({
6+
it('should return the serverInfo', async () => {
7+
const response = await request({
88
url: 'http://localhost:8378/1/serverInfo',
99
json: true,
1010
headers: {
1111
'X-Parse-Application-Id': 'test',
1212
'X-Parse-REST-API-Key': 'rest',
13+
'X-Parse-Master-Key': 'test',
1314
},
14-
}).then(fail, response => {
15-
expect(response.status).toEqual(403);
16-
expect(response.data.error).toEqual(
17-
'unauthorized: master key is required'
15+
});
16+
const data = response.data;
17+
expect(data).toBeDefined();
18+
expect(data.features).toBeDefined();
19+
expect(data.parseServerVersion).toBeDefined();
20+
expect(data.database).toBeDefined();
21+
expect(['MongoDB', 'PostgreSQL']).toContain(data.database.engine);
22+
});
23+
24+
it('requires the master key to get features', async done => {
25+
try {
26+
await request({
27+
url: 'http://localhost:8378/1/serverInfo',
28+
json: true,
29+
headers: {
30+
'X-Parse-Application-Id': 'test',
31+
'X-Parse-REST-API-Key': 'rest',
32+
},
33+
});
34+
done.fail(
35+
'The serverInfo request should be rejected without the master key'
1836
);
37+
} catch (error) {
38+
expect(error.status).toEqual(403);
39+
expect(error.data.error).toEqual('unauthorized: master key is required');
1940
done();
20-
});
41+
}
2142
});
2243
});

src/Adapters/Storage/Mongo/MongoStorageAdapter.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ export class MongoStorageAdapter implements StorageAdapter {
126126
client: MongoClient;
127127
_maxTimeMS: ?number;
128128
canSortOnJoinTables: boolean;
129+
databaseVersion: string;
130+
engine: string;
129131

130132
constructor({
131133
uri = defaults.DefaultMongoURI,
@@ -136,6 +138,7 @@ export class MongoStorageAdapter implements StorageAdapter {
136138
this._collectionPrefix = collectionPrefix;
137139
this._mongoOptions = mongoOptions;
138140
this._mongoOptions.useNewUrlParser = true;
141+
this.engine = 'MongoDB';
139142

140143
// MaxTimeMS is not a global MongoDB client option, it is applied per operation.
141144
this._maxTimeMS = mongoOptions.maxTimeMS;
@@ -959,7 +962,15 @@ export class MongoStorageAdapter implements StorageAdapter {
959962
}
960963

961964
performInitialization(): Promise<void> {
962-
return Promise.resolve();
965+
// databaseVersion
966+
return this.connect()
967+
.then(() => {
968+
const adminDb = this.database.admin();
969+
return adminDb.serverStatus();
970+
})
971+
.then(status => {
972+
this.databaseVersion = status.version;
973+
});
963974
}
964975

965976
createIndex(className: string, index: any) {

src/Adapters/Storage/Postgres/PostgresStorageAdapter.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,8 @@ const buildWhereClause = ({ schema, query, index }): WhereClause => {
778778

779779
export class PostgresStorageAdapter implements StorageAdapter {
780780
canSortOnJoinTables: boolean;
781+
databaseVersion: string;
782+
engine: string;
781783

782784
// Private
783785
_collectionPrefix: string;
@@ -790,6 +792,7 @@ export class PostgresStorageAdapter implements StorageAdapter {
790792
this._client = client;
791793
this._pgp = pgp;
792794
this.canSortOnJoinTables = false;
795+
this.engine = 'PostgreSQL';
793796
}
794797

795798
handleShutdown() {
@@ -2276,6 +2279,12 @@ export class PostgresStorageAdapter implements StorageAdapter {
22762279
})
22772280
.then(data => {
22782281
debug(`initializationDone in ${data.duration}`);
2282+
// databaseVersion
2283+
return this._client.query('SHOW server_version');
2284+
})
2285+
.then(versionData => {
2286+
// versionData is like [ { server_version: '11.3' } ]
2287+
this.databaseVersion = versionData[0].server_version;
22792288
})
22802289
.catch(error => {
22812290
/* eslint-disable no-console */

src/Adapters/Storage/StorageAdapter.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ export type FullQueryOptions = QueryOptions & UpdateQueryOptions;
2525

2626
export interface StorageAdapter {
2727
canSortOnJoinTables: boolean;
28+
databaseVersion: string;
29+
engine: string;
2830

2931
classExists(className: string): Promise<boolean>;
3032
setClassLevelPermissions(className: string, clps: any): Promise<void>;

src/Routers/FeaturesRouter.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export class FeaturesRouter extends PromiseRouter {
99
'/serverInfo',
1010
middleware.promiseEnforceMasterKeyAccess,
1111
req => {
12+
const { config } = req;
1213
const features = {
1314
globalConfig: {
1415
create: true,
@@ -33,9 +34,9 @@ export class FeaturesRouter extends PromiseRouter {
3334
from: true,
3435
},
3536
push: {
36-
immediatePush: req.config.hasPushSupport,
37-
scheduledPush: req.config.hasPushScheduledSupport,
38-
storedPushData: req.config.hasPushSupport,
37+
immediatePush: config.hasPushSupport,
38+
scheduledPush: config.hasPushScheduledSupport,
39+
storedPushData: config.hasPushSupport,
3940
pushAudiences: true,
4041
localization: true,
4142
},
@@ -51,10 +52,15 @@ export class FeaturesRouter extends PromiseRouter {
5152
},
5253
};
5354

55+
const dbAdapter = config.database.adapter;
5456
return {
5557
response: {
5658
features: features,
5759
parseServerVersion: version,
60+
database: {
61+
engine: dbAdapter.engine,
62+
version: dbAdapter.databaseVersion,
63+
},
5864
},
5965
};
6066
}

0 commit comments

Comments
 (0)