From 067946c66c5be12769ab862d5c1d4a2cd5495588 Mon Sep 17 00:00:00 2001 From: Florent Vilmart Date: Thu, 18 Feb 2016 23:19:21 -0500 Subject: [PATCH] Refactors PushController and FilesController to support multiple apps --- src/Config.js | 3 ++- src/Controllers/FilesController.js | 34 ++++++++++++++++++++++++------ src/Controllers/PushController.js | 6 +++--- src/index.js | 8 +++---- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/Config.js b/src/Config.js index aeb25a61..3b9188a4 100644 --- a/src/Config.js +++ b/src/Config.js @@ -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; } diff --git a/src/Controllers/FilesController.js b/src/Controllers/FilesController.js index 6fde54b7..f1238694 100644 --- a/src/Controllers/FilesController.js +++ b/src/Controllers/FilesController.js @@ -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; diff --git a/src/Controllers/PushController.js b/src/Controllers/PushController.js index 9f9252dc..e87e6f76 100644 --- a/src/Controllers/PushController.js +++ b/src/Controllers/PushController.js @@ -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; } diff --git a/src/index.js b/src/index.js index 4b43e2ee..9691c656 100644 --- a/src/index.js +++ b/src/index.js @@ -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') ];