Skip to content

Commit 5e9ca02

Browse files
committed
Adds settings endpoint to configure loglevel
1 parent 4072734 commit 5e9ca02

File tree

5 files changed

+97
-12
lines changed

5 files changed

+97
-12
lines changed

spec/SettingsRouter.spec.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
var request = require('request');
2+
3+
var headers = {
4+
'X-Parse-Application-Id': 'test',
5+
'X-Parse-Master-Key': 'test'
6+
};
7+
8+
9+
describe('SettingsRouter', () => {
10+
11+
it('should set the loglevel', (done) => {
12+
request.post({
13+
headers: headers,
14+
json: {
15+
'logLevel': 'silly'
16+
},
17+
url: 'http://localhost:8378/1/settings'
18+
}, (err, res, body) => {
19+
request.get({
20+
url: 'http://localhost:8378/1/settings',
21+
headers: headers
22+
}, (err, res, body)=> {
23+
body = JSON.parse(body);
24+
expect(body.logLevel).toBe('silly');
25+
done();
26+
});
27+
});
28+
});
29+
30+
it('should not access without masterKey', (done) => {
31+
request.post({
32+
headers: {
33+
'X-Parse-Application-Id': 'test',
34+
'X-Parse-Master-Key': 'invalid'
35+
},
36+
json: {
37+
'logLevel': 'silly'
38+
},
39+
url: 'http://localhost:8378/1/settings'
40+
}, (err, res, body) => {
41+
expect(body.error).not.toBeUndefined();
42+
expect(body.error).toBe('unauthorized');
43+
request.get({
44+
url: 'http://localhost:8378/1/settings',
45+
headers: {
46+
'X-Parse-Application-Id': 'test',
47+
'X-Parse-Master-Key': 'invalid'
48+
}
49+
}, (err, res, body)=> {
50+
body = JSON.parse(body);
51+
expect(body.error).toBe('unauthorized');
52+
done();
53+
});
54+
});
55+
})
56+
57+
})

src/ParseServer.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ import { SchemasRouter } from './Routers/SchemasRouter';
4646
import { SessionsRouter } from './Routers/SessionsRouter';
4747
import { UserController } from './Controllers/UserController';
4848
import { UsersRouter } from './Routers/UsersRouter';
49-
49+
import { SettingsRouter } from './Routers/SettingsRouter';
5050
import ParsePushAdapter from 'parse-server-push-adapter';
51-
import winston from 'winston';
51+
5252
// Mutate the Parse object to add the Cloud Code handlers
5353
addParseCloud();
5454

@@ -152,7 +152,7 @@ class ParseServer {
152152
}
153153

154154
if (verbose || process.env.VERBOSE || process.env.VERBOSE_PARSE_SERVER) {
155-
winston.level = 'silly';
155+
configureLogger({level: 'silly'});
156156
}
157157

158158
const filesControllerAdapter = loadAdapter(filesAdapter, () => {
@@ -247,6 +247,7 @@ class ParseServer {
247247
new IAPValidationRouter(),
248248
new FeaturesRouter(),
249249
new GlobalConfigRouter(),
250+
new SettingsRouter(),
250251
];
251252

252253
if (process.env.PARSE_EXPERIMENTAL_HOOKS_ENABLED || process.env.TESTING) {

src/Routers/LogsRouter.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { Parse } from 'parse/node';
22
import PromiseRouter from '../PromiseRouter';
33
import * as middleware from "../middlewares";
4+
import winston from 'winston';
5+
import { logger, configureLogger } from '../logger';
46

57
export class LogsRouter extends PromiseRouter {
6-
8+
79
mountRoutes() {
810
this.route('GET','/scriptlog', middleware.promiseEnforceMasterKeyAccess, this.validateRequest, (req) => {
911
return this.handleGET(req);
@@ -30,9 +32,9 @@ export class LogsRouter extends PromiseRouter {
3032
const until = req.query.until;
3133
let size = req.query.size;
3234
if (req.query.n) {
33-
size = req.query.n;
35+
size = req.query.n;
3436
}
35-
37+
3638
const order = req.query.order
3739
const level = req.query.level;
3840
const options = {

src/Routers/SettingsRouter.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import PromiseRouter from '../PromiseRouter';
2+
import * as middleware from "../middlewares";
3+
import { logger, configureLogger } from '../logger';
4+
import winston from 'winston';
5+
6+
export class SettingsRouter extends PromiseRouter {
7+
mountRoutes() {
8+
this.route('GET', '/settings', middleware.promiseEnforceMasterKeyAccess, (req) => {
9+
return Promise.resolve({
10+
response: {
11+
logLevel: winston.level
12+
}
13+
})
14+
});
15+
this.route('POST','/settings', middleware.promiseEnforceMasterKeyAccess, (req) => {
16+
let body = req.body;
17+
let logLevel = body.logLevel;
18+
if (logLevel) {
19+
configureLogger({level: logLevel});
20+
}
21+
return Promise.resolve({
22+
response: body
23+
})
24+
});
25+
}
26+
}

src/logger.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') {
1111

1212
let currentLogsFolder = LOGS_FOLDER;
1313

14-
function generateTransports() {
15-
let level = process.env.VERBOSE ? 'verbose': 'info';
14+
function generateTransports(level) {
1615
let transports = [
1716
new (DailyRotateFile)({
1817
filename: 'parse-server.info',
@@ -38,7 +37,8 @@ function generateTransports() {
3837

3938
const logger = new winston.Logger();
4039

41-
export function configureLogger({logsFolder}) {
40+
export function configureLogger({logsFolder, level = winston.level}) {
41+
winston.level = level;
4242
logsFolder = logsFolder || currentLogsFolder;
4343

4444
if (!path.isAbsolute(logsFolder)) {
@@ -50,15 +50,14 @@ export function configureLogger({logsFolder}) {
5050
currentLogsFolder = logsFolder;
5151

5252
logger.configure({
53-
transports: generateTransports()
53+
transports: generateTransports(level)
5454
})
5555
}
5656

5757
configureLogger({logsFolder: LOGS_FOLDER});
5858

5959
export function addGroup(groupName) {
60-
let level = process.env.VERBOSE ? 'verbose': 'info';
61-
60+
let level = winston.level;
6261
let transports = generateTransports().concat(new (DailyRotateFile)({
6362
filename: groupName,
6463
dirname: currentLogsFolder,

0 commit comments

Comments
 (0)