Refactors PushController and FilesController to support multiple apps

This commit is contained in:
Florent Vilmart
2016-02-18 23:19:21 -05:00
parent 8aaf8f2ff2
commit 067946c66c
4 changed files with 37 additions and 14 deletions

View File

@@ -24,8 +24,9 @@ function Config(applicationId, mount) {
this.database = DatabaseAdapter.getDatabaseConnection(applicationId);
this.filesController = cacheInfo.filesController;
this.pushController = cacheInfo.pushController;
this.oauth = cacheInfo.oauth;
this.mount = mount;
}

View File

@@ -13,6 +13,13 @@ export class FilesController {
this._filesAdapter = filesAdapter;
}
static getHandler() {
return (req, res) => {
let config = new Config(req.params.appId);
return config.filesController.getHandler()(req, res);
}
}
getHandler() {
return (req, res) => {
let config = new Config(req.params.appId);
@@ -30,6 +37,13 @@ export class FilesController {
};
}
static createHandler() {
return (req, res, next) => {
let config = req.config;
return config.filesController.createHandler()(req, res, next);
}
}
createHandler() {
return (req, res, next) => {
if (!req.body || !req.body.length) {
@@ -50,6 +64,7 @@ export class FilesController {
return;
}
const filesController = req.config.filesController;
// If a content-type is included, we'll add an extension so we can
// return the same content-type.
let extension = '';
@@ -60,9 +75,9 @@ export class FilesController {
}
let filename = randomHexString(32) + '_' + req.params.filename + extension;
this._filesAdapter.createFile(req.config, filename, req.body).then(() => {
filesController._filesAdapter.createFile(req.config, filename, req.body).then(() => {
res.status(201);
var location = this._filesAdapter.getFileLocation(req.config, filename);
var location = filesController._filesAdapter.getFileLocation(req.config, filename);
res.set('Location', location);
res.json({ url: location, name: filename });
}).catch((error) => {
@@ -72,6 +87,13 @@ export class FilesController {
};
}
static deleteHandler() {
return (req, res, next) => {
let config = req.config;
return config.filesController.deleteHandler()(req, res, next);
}
}
deleteHandler() {
return (req, res, next) => {
this._filesAdapter.deleteFile(req.config, req.params.filename).then(() => {
@@ -114,9 +136,9 @@ export class FilesController {
}
}
getExpressRouter() {
static getExpressRouter() {
let router = express.Router();
router.get('/files/:appId/:filename', this.getHandler());
router.get('/files/:appId/:filename', FilesController.getHandler());
router.post('/files', function(req, res, next) {
next(new Parse.Error(Parse.Error.INVALID_FILE_NAME,
@@ -127,14 +149,14 @@ export class FilesController {
Middlewares.allowCrossDomain,
BodyParser.raw({type: '*/*', limit: '20mb'}),
Middlewares.handleParseHeaders,
this.createHandler()
FilesController.createHandler()
);
router.delete('/files/:filename',
Middlewares.allowCrossDomain,
Middlewares.handleParseHeaders,
Middlewares.enforceMasterKeyAccess,
this.deleteHandler()
FilesController.deleteHandler()
);
return router;

View File

@@ -31,11 +31,11 @@ export class PushController {
}
});
}
getExpressRouter() {
static getExpressRouter() {
var router = new PromiseRouter();
router.route('POST','/push', (req) => {
return this.handlePOST(req);
return req.config.pushController.handlePOST(req);
});
return router;
}

View File

@@ -106,7 +106,7 @@ function ParseServer({
}
let filesController = new FilesController(filesAdapter);
cache.apps[appId] = {
masterKey: masterKey,
collectionPrefix: collectionPrefix,
@@ -119,7 +119,7 @@ function ParseServer({
filesController: filesController,
enableAnonymousUsers: enableAnonymousUsers,
oauth: oauth,
};
};
// To maintain compatibility. TODO: Remove in v2.1
if (process.env.FACEBOOK_APP_ID) {
@@ -135,7 +135,7 @@ function ParseServer({
var api = express();
// File handling needs to be before default middlewares are applied
api.use('/', filesController.getExpressRouter());
api.use('/', FilesController.getExpressRouter());
// TODO: separate this from the regular ParseServer object
if (process.env.TESTING == 1) {
@@ -156,7 +156,7 @@ function ParseServer({
new InstallationsRouter().getExpressRouter(),
require('./functions'),
require('./schemas'),
new PushController(pushAdapter).getExpressRouter(),
PushController.getExpressRouter(),
new LoggerController(loggerAdapter).getExpressRouter(),
require('./validate_purchase')
];