From 1f660d9f7cf6f2dd86bc7f131ec07ab10d1c3b55 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Tue, 9 Feb 2016 20:45:02 -0800 Subject: [PATCH] Restructure ClassesRouter as a class. --- src/Routers/ClassesRouter.js | 87 ++++++++++++++++++++++++++++++ src/classes.js | 101 ----------------------------------- src/index.js | 34 ++++++------ src/users.js | 2 +- 4 files changed, 107 insertions(+), 117 deletions(-) create mode 100644 src/Routers/ClassesRouter.js delete mode 100644 src/classes.js diff --git a/src/Routers/ClassesRouter.js b/src/Routers/ClassesRouter.js new file mode 100644 index 00000000..11666b20 --- /dev/null +++ b/src/Routers/ClassesRouter.js @@ -0,0 +1,87 @@ + +import PromiseRouter from '../PromiseRouter'; +import rest from '../rest'; + +export class ClassesRouter { + // Returns a promise that resolves to a {response} object. + handleFind(req) { + let body = Object.assign(req.body, req.query); + let options = {}; + if (body.skip) { + options.skip = Number(body.skip); + } + if (body.limit) { + options.limit = Number(body.limit); + } + if (body.order) { + options.order = String(body.order); + } + if (body.count) { + options.count = true; + } + if (typeof body.keys == 'string') { + options.keys = body.keys; + } + if (body.include) { + options.include = String(body.include); + } + if (body.redirectClassNameForKey) { + options.redirectClassNameForKey = String(body.redirectClassNameForKey); + } + if (typeof body.where === 'string') { + body.where = JSON.parse(body.where); + } + return rest.find(req.config, req.auth, req.params.className, body.where, options) + .then((response) => { + if (response && response.results) { + for (let result of response.results) { + if (result.sessionToken) { + result.sessionToken = req.info.sessionToken || result.sessionToken; + } + } + } + return { response: response }; + }); + } + + // Returns a promise for a {response} object. + handleGet(req) { + return rest.find(req.config, req.auth, req.params.className, {objectId: req.params.objectId}) + .then((response) => { + if (!response.results || response.results.length == 0) { + throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Object not found.'); + } + return { response: response.results[0] }; + }); + } + + handleCreate(req) { + return rest.create(req.config, req.auth, req.params.className, req.body); + } + + handleUpdate(req) { + return rest.update(req.config, req.auth, req.params.className, req.params.objectId, req.body) + .then((response) => { + return {response: response}; + }); + } + + handleDelete(req) { + return rest.del(req.config, req.auth, req.params.className, req.params.objectId) + .then(() => { + return {response: {}}; + }); + } + + getExpressRouter() { + var router = new PromiseRouter(); + router.route('GET', '/classes/:className', (req) => { return this.handleFind(req); }); + router.route('GET', '/classes/:className/:objectId', (req) => { return this.handleGet(req); }); + router.route('POST', '/classes/:className', (req) => { return this.handleCreate(req); }); + router.route('PUT', '/classes/:className/:objectId', (req) => { return this.handleUpdate(req); }); + router.route('DELETE', '/classes/:className/:objectId', (req) => { return this.handleDelete(req); }); + return router; + } +} + +export default ClassesRouter; diff --git a/src/classes.js b/src/classes.js deleted file mode 100644 index f1400914..00000000 --- a/src/classes.js +++ /dev/null @@ -1,101 +0,0 @@ -// These methods handle the 'classes' routes. -// Methods of the form 'handleX' return promises and are intended to -// be used with the PromiseRouter. - -var Parse = require('parse/node').Parse, - PromiseRouter = require('./PromiseRouter'), - rest = require('./rest'); - -var router = new PromiseRouter(); - -// Returns a promise that resolves to a {response} object. -function handleFind(req) { - var body = Object.assign(req.body, req.query); - var options = {}; - if (body.skip) { - options.skip = Number(body.skip); - } - if (body.limit) { - options.limit = Number(body.limit); - } - if (body.order) { - options.order = String(body.order); - } - if (body.count) { - options.count = true; - } - if (typeof body.keys == 'string') { - options.keys = body.keys; - } - if (body.include) { - options.include = String(body.include); - } - if (body.redirectClassNameForKey) { - options.redirectClassNameForKey = String(body.redirectClassNameForKey); - } - - if(typeof body.where === 'string') { - body.where = JSON.parse(body.where); - } - - return rest.find(req.config, req.auth, - req.params.className, body.where, options) - .then((response) => { - if (response && response.results) { - for (var result of response.results) { - if (result.sessionToken) { - result.sessionToken = req.info.sessionToken || result.sessionToken; - } - } - response.results.sessionToken - } - return {response: response}; - }); -} - -// Returns a promise for a {status, response, location} object. -function handleCreate(req) { - return rest.create(req.config, req.auth, - req.params.className, req.body); -} - -// Returns a promise for a {response} object. -function handleGet(req) { - return rest.find(req.config, req.auth, - req.params.className, {objectId: req.params.objectId}) - .then((response) => { - if (!response.results || response.results.length == 0) { - throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, - 'Object not found.'); - } else { - return {response: response.results[0]}; - } - }); -} - -// Returns a promise for a {response} object. -function handleDelete(req) { - return rest.del(req.config, req.auth, - req.params.className, req.params.objectId) - .then(() => { - return {response: {}}; - }); -} - -// Returns a promise for a {response} object. -function handleUpdate(req) { - return rest.update(req.config, req.auth, - req.params.className, req.params.objectId, req.body) - .then((response) => { - return {response: response}; - }); -} - -router.route('GET', '/classes/:className', handleFind); -router.route('POST', '/classes/:className', handleCreate); -router.route('GET', '/classes/:className/:objectId', handleGet); -router.route('DELETE', '/classes/:className/:objectId', handleDelete); -router.route('PUT', '/classes/:className/:objectId', handleUpdate); - -module.exports = router; - diff --git a/src/index.js b/src/index.js index 16c15098..32ba636b 100644 --- a/src/index.js +++ b/src/index.js @@ -18,6 +18,7 @@ import { FilesController } from './Controllers/FilesController'; import ParsePushAdapter from './Adapters/Push/ParsePushAdapter'; import { PushController } from './Controllers/PushController'; +import { ClassesRouter } from './Routers/ClassesRouter'; // Mutate the Parse object to add the Cloud Code handlers addParseCloud(); @@ -125,25 +126,28 @@ function ParseServer(args) { api.use(middlewares.allowMethodOverride); api.use(middlewares.handleParseHeaders); - var router = new PromiseRouter(); - - router.merge(require('./classes')); - router.merge(require('./users')); - router.merge(require('./sessions')); - router.merge(require('./roles')); - router.merge(require('./analytics')); - router.merge(require('./installations')); - router.merge(require('./functions')); - router.merge(require('./schemas')); + let routers = [ + new ClassesRouter().getExpressRouter(), + require('./users'), + require('./sessions'), + require('./roles'), + require('./analytics'), + require('./installations'), + require('./functions'), + require('./schemas'), + new PushController(pushAdapter).getExpressRouter() + ]; if (process.env.PARSE_EXPERIMENTAL_CONFIG_ENABLED || process.env.TESTING) { - router.merge(require('./global_config')); + routers.push(require('./global_config')); } - let pushController = new PushController(pushAdapter); - router.merge(pushController.getExpressRouter()); - batch.mountOnto(router); + let appRouter = new PromiseRouter(); + routers.forEach((router) => { + appRouter.merge(router); + }); + batch.mountOnto(appRouter); - router.mountOnto(api); + appRouter.mountOnto(api); api.use(middlewares.handleParseErrors); diff --git a/src/users.js b/src/users.js index 788e0278..4205c666 100644 --- a/src/users.js +++ b/src/users.js @@ -91,7 +91,7 @@ function handleLogIn(req) { } // Returns a promise that resolves to a {response} object. -// TODO: share code with classes.js +// TODO: share code with ClassesRouter.js function handleFind(req) { var options = {}; if (req.body.skip) {