UNPKG

spincycle

Version:

A reactive message router and object manager that lets clients subscribe to object property changes on the server

147 lines (126 loc) 5.06 kB
uuid = require('node-uuid') url = require('url') basicAuth = require('basic-auth') cookie = require('cookie') bodyParser = require('body-parser') debug = process.env["DEBUG"] class HttpMethod @httproutes = [] @props = {} constructor: (messageRouter, app, basePath) -> #console.log 'HttpMethod called for path '+basePath' @app = app app.use(bodyParser.json()) @restPath = '/rest/' doSend = (req, res, url_parts)-> user = basicAuth(req) if user console.log 'basic auth user detected' console.dir user if HttpMethod.props and HttpMethod.props.user and HttpMethod.props.user.name if HttpMethod.props.user.name isnt user.name and HttpMethod.props.user.pass isnt user.pass console.log 'wrong username or password provided' res.json({status: e.general.NOT_ALLOWED, info: 'wrong basic auth username or pass.', payload: {error: 'Basic Auth Failure'}}) return ip = req.connection.remoteAddress port = req.connection.remotePort cookies = cookie.parse(req.headers.cookie or '') #console.dir req.query target = HttpMethod.httproutes[req.query.target] if target console.log 'Express request from '+ip+':'+port+' target is "'+req.query.target+'" cookies are '+req.headers.cookie message = { client: ip+':'+port, target: req.query.target, messageId: url_parts.messageId || uuid.v4(), sessionId: cookies.sid } for p, part of url_parts message[p] = part # TODO: Guard against hax0r dataz #console.log 'message is now' #console.dir message message.replyFunc = (reply) -> if reply.statuscode then res.status(reply.statuscode) if reply.status == 'FAILURE' then res.status(404) res.json(reply) if debug then console.log 'HttpMethod calling target '+target target(message) else res.json({error:'target not found'}) @doSend = doSend app.get basePath, (req, res) -> url_parts = req.query doSend(req, res, url_parts) app.post basePath, (req, res) -> url_parts = req.query for k,v of req.body url_parts[k] = v doSend(req, res, url_parts) """ app.put basePath, (req, res) -> if debug then console.log 'Alternate PUT handler. params are' if debug then console.dir req.params if debug then console.log 'query is' if debug then console.dir req.query url_parts = req.body doSend(req, res, url_parts) """ messageRouter.addMethod 'express', @ registrationFunc: (targetName, targetFunc, @props) -> #console.log 'express registering http route for target '+targetName HttpMethod.httproutes[targetName] = targetFunc makeRESTful: (type) => #console.log 'HttpMethod.makeRESTful called for type '+type+' restpath is '+@restPath listall = (req,res) => #console.log 'listall' url_parts = req.query req.query.type = type req.query.target = '_list'+type+'s' @doSend(req, res, url_parts) createone = (req,res) => #console.log 'createone' url_parts = req.query req.query.type = type req.query.obj = {type: req.query.type} req.query.target = '_create'+type @doSend(req, res, url_parts) getone = (req,res) => #console.log 'getone' url_parts = req.query req.query.id = req.params.id req.query.type = type req.query.target = '_get'+type @doSend(req, res, url_parts) updateone = (req,res) => #console.log 'updateone' if debug then console.log 'PUT handler. params are' if debug then console.dir req.params if debug then console.log 'query is' if debug then console.dir req.query if debug then console.log 'body is' if debug then console.dir req.body #console.dir req url_parts = req.body #console.dir url_parts req.query.id = req.params.id url_parts.apitoken = req.query.apitoken url_parts.sessionId = req.query.sessionId req.query.type = type req.query.obj = req.body.obj if typeof url_parts.obj == 'string' then url_parts.obj = JSON.parse(url_parts.obj) req.query.target = '_update'+type @doSend(req, res, url_parts) deleteone = (req,res) => #console.log 'deleteone' url_parts = req.query req.query.id = req.params.id req.query.type = type req.query.obj = {id: req.query.id, type: req.query.type} req.query.target = '_delete'+type @doSend(req, res, url_parts) console.log 'adding REST paths for "'+(@restPath+type)+'"' @app.route(@restPath+type).get(listall).post(createone) @app.route(@restPath+type+'/:id').get(getone) @app.route(@restPath+type+'/:id').put(updateone) @app.route(@restPath+type+'/:id').delete(deleteone) @app.get('/foo', (req,res,next)-> console.log 'foo' ,(req,res,next)-> console.log 'reject foo' ) module.exports = HttpMethod