From 32327b427acde02671795b640649d847ffd64e37 Mon Sep 17 00:00:00 2001 From: Daniel Saewitz Date: Mon, 18 Feb 2013 15:45:31 -0500 Subject: [PATCH] Move api and other routes into separate files --- src/server/api.coffee | 58 ++++++++++++++++++++++++++++ src/server/deprecated.coffee | 12 ++++++ src/server/index.coffee | 4 +- src/server/serverRoutes.coffee | 70 ---------------------------------- src/server/static.coffee | 16 ++++++++ 5 files changed, 89 insertions(+), 71 deletions(-) create mode 100644 src/server/api.coffee create mode 100644 src/server/deprecated.coffee delete mode 100644 src/server/serverRoutes.coffee create mode 100644 src/server/static.coffee diff --git a/src/server/api.coffee b/src/server/api.coffee new file mode 100644 index 0000000000..dc7ccc1282 --- /dev/null +++ b/src/server/api.coffee @@ -0,0 +1,58 @@ +express = require 'express' +router = new express.Router() + +scoring = require('../app/scoring') +_ = require('underscore') + +# ---------- /v1 API ------------ + +### + v1 API. Requires user-id and apiToken, task-id, direction. Test with: + curl -X POST -H "Content-Type:application/json" -d '{"apiToken":"{TOKEN}"}' localhost:3000/v1/users/{UID}/tasks/productivity/up +### + +router.post '/users/:uid/tasks/:taskId/:direction', (req, res) -> + {uid, taskId, direction} = req.params + {apiToken, title, service, icon} = req.body + console.log {params:req.params, body:req.body} if process.env.NODE_ENV == 'development' + + # Send error responses for improper API call + return res.send(500, 'request body "apiToken" required') unless apiToken + return res.send(500, ':uid required') unless uid + return res.send(500, ':taskId required') unless taskId + return res.send(500, ":direction must be 'up' or 'down'") unless direction in ['up','down'] + + model = req.getModel() + req._isServer = true + model.fetch model.query('users').withIdAndToken(uid, apiToken), (err, result) -> + return res.send(500, err) if err + user = result.at(0) + userObj = user.get() + if _.isEmpty(userObj) + return res.send(500, "User with uid=#{uid}, token=#{apiToken} not found. Make sure you're not using your username, but your User Id") + + model.ref('_user', user) + + # Create task if doesn't exist + # TODO add service & icon to task + unless model.get("_user.tasks.#{taskId}") + model.refList "_habitList", "_user.tasks", "_user.habitIds" + model.at('_habitList').push { + id: taskId + type: 'habit' + text: (title || taskId) + value: 0 + up: true + down: true + notes: "This task was created by a third-party service. Feel free to edit, it won't harm the connection to that service. Additionally, multiple services may piggy-back off this task." + }, (a,b,c) -> + console.log {a:a,b:b,c:c} + + + scoring.setModel(model) + delta = scoring.score(taskId, direction) + result = model.get ('_user.stats') + result.delta = delta + res.send(result) + +module.exports = router diff --git a/src/server/deprecated.coffee b/src/server/deprecated.coffee new file mode 100644 index 0000000000..e8a5fb7340 --- /dev/null +++ b/src/server/deprecated.coffee @@ -0,0 +1,12 @@ +express = require 'express' +router = new express.Router() + +# ---------- Deprecated Paths ------------ + +deprecatedMessage = 'This API is no longer supported, see https://github.com/lefnire/habitrpg/wiki/API for new protocol' + +router.get '/:uid/up/:score?', (req, res) -> res.send(500, deprecatedMessage) +router.get '/:uid/down/:score?', (req, res) -> res.send(500, deprecatedMessage) +router.post '/users/:uid/tasks/:taskId/:direction', (req, res) -> res.send(500, deprecatedMessage) + +module.exports = router diff --git a/src/server/index.coffee b/src/server/index.coffee index f9f5230d46..4a5e1ff72d 100644 --- a/src/server/index.coffee +++ b/src/server/index.coffee @@ -105,11 +105,13 @@ mongo_store = new MongoStore {url: process.env.NODE_DB_URI}, -> .use(auth(store, strategies, options)) # Creates an express middleware from the app's routes .use(app.router()) + .use('/v1', require('./api').middleware) + .use(require('./static').middleware) + .use(require('./deprecated').middleware) .use(expressApp.router) .use(serverError root) priv.routes(expressApp) - require('./serverRoutes')(expressApp, root, derby) # Errors expressApp.all '*', (req) -> diff --git a/src/server/serverRoutes.coffee b/src/server/serverRoutes.coffee deleted file mode 100644 index 7f53e8d186..0000000000 --- a/src/server/serverRoutes.coffee +++ /dev/null @@ -1,70 +0,0 @@ -scoring = require('../app/scoring') -_ = require('underscore') - -module.exports = (expressApp, root, derby) -> - - # ---------- Static Pages ------------ - staticPages = derby.createStatic root - - expressApp.get '/privacy', (req, res) -> - staticPages.render 'privacy', res - - expressApp.get '/terms', (req, res) -> - staticPages.render 'terms', res - - # ---------- Deprecated Paths ------------ - - deprecatedMessage = 'This API is no longer supported, see https://github.com/lefnire/habitrpg/wiki/API for new protocol' - expressApp.get '/:uid/up/:score?', (req, res) -> res.send(500, deprecatedMessage) - expressApp.get '/:uid/down/:score?', (req, res) -> res.send(500, deprecatedMessage) - expressApp.post '/users/:uid/tasks/:taskId/:direction', (req, res) -> res.send(500, deprecatedMessage) - - # ---------- v1 API ------------ - - ### - v1 API. Requires user-id and apiToken, task-id, direction. Test with: - curl -X POST -H "Content-Type:application/json" -d '{"apiToken":"{TOKEN}"}' localhost:3000/v1/users/{UID}/tasks/productivity/up - ### - expressApp.post '/v1/users/:uid/tasks/:taskId/:direction', (req, res) -> - {uid, taskId, direction} = req.params - {apiToken, title, service, icon} = req.body - console.log {params:req.params, body:req.body} if process.env.NODE_ENV == 'development' - - # Send error responses for improper API call - return res.send(500, 'request body "apiToken" required') unless apiToken - return res.send(500, ':uid required') unless uid - return res.send(500, ':taskId required') unless taskId - return res.send(500, ":direction must be 'up' or 'down'") unless direction in ['up','down'] - - model = req.getModel() - req._isServer = true - model.fetch model.query('users').withIdAndToken(uid, apiToken), (err, result) -> - return res.send(500, err) if err - user = result.at(0) - userObj = user.get() - if _.isEmpty(userObj) - return res.send(500, "User with uid=#{uid}, token=#{apiToken} not found. Make sure you're not using your username, but your User Id") - - model.ref('_user', user) - - # Create task if doesn't exist - # TODO add service & icon to task - unless model.get("_user.tasks.#{taskId}") - model.refList "_habitList", "_user.tasks", "_user.habitIds" - model.at('_habitList').push { - id: taskId - type: 'habit' - text: (title || taskId) - value: 0 - up: true - down: true - notes: "This task was created by a third-party service. Feel free to edit, it won't harm the connection to that service. Additionally, multiple services may piggy-back off this task." - }, (a,b,c) -> - console.log {a:a,b:b,c:c} - - - scoring.setModel(model) - delta = scoring.score(taskId, direction) - result = model.get ('_user.stats') - result.delta = delta - res.send(result) \ No newline at end of file diff --git a/src/server/static.coffee b/src/server/static.coffee new file mode 100644 index 0000000000..1d5124f35e --- /dev/null +++ b/src/server/static.coffee @@ -0,0 +1,16 @@ +express = require 'express' +router = new express.Router() + +path = require 'path' +derby = require 'derby' + +# ---------- Static Pages ------------ +staticPages = derby.createStatic path.dirname(path.dirname(__dirname)) + +router.get '/privacy', (req, res) -> + staticPages.render 'privacy', res + +router.get '/terms', (req, res) -> + staticPages.render 'terms', res + +module.exports = router