ticketman
Version:
A simple pull-based job/ticket system contians a centeral ticket dispatcher and distributed workers. This system is written in NodeJS, runing on MongoDB
36 lines (26 loc) • 1.19 kB
text/coffeescript
oauth = require "./utils/oauth"
EMPTY_ARRAY = []
mongoose = require('mongoose')
Worker = mongoose.model('Worker')
exports.authWorker = (req, res, next)->
signature = req.headers['ticketman-authenticate']
return next(new Error "signature checking failed") unless signature? and signature.indexOf("Ticketman") is 0
workerId = (signature.match(/Ticketman ([^:]+)/) || EMPTY_ARRAY)[1]
signature = (signature.match(/:([^:]+)/) || EMPTY_ARRAY)[1]
return next(new Error("invalid signature")) unless workerId? and signature?
Worker.findById workerId, (err, worker)->
return next err if err?
return next(new Error "missing worker #{workerId}") unless worker
if oauth.verify(signature, req.method, req.url, req.body, worker['consumer_secret']) and not worker.trashed_at?
req.worker = worker
next()
else
next(new Error "signature mismatch")
return
return
exports.updateWorkerAt = (req, res, next) ->
signature = req.headers['ticketman-authenticate']
workerId = (signature.match(/Ticketman ([^:]+)/) || EMPTY_ARRAY)[1]
Worker.findByIdAndUpdate workerId, {updated_at: Date.now()}, (err, worker) ->
return next err if err?
next()