app.coffee 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. express = require('express')
  2. http = require("http")
  3. Settings = require('settings-sharelatex')
  4. logger = require('logger-sharelatex')
  5. logger.initialize("documentupdater")
  6. RedisManager = require('./app/js/RedisManager.js')
  7. UpdateManager = require('./app/js/UpdateManager.js')
  8. Keys = require('./app/js/RedisKeyBuilder')
  9. redis = require('redis')
  10. metrics = require('./app/js/Metrics')
  11. Errors = require "./app/js/Errors"
  12. HttpController = require "./app/js/HttpController"
  13. redisConf = Settings.redis.web
  14. rclient = redis.createClient(redisConf.port, redisConf.host)
  15. rclient.auth(redisConf.password)
  16. app = express()
  17. app.configure ->
  18. app.use(express.logger(':remote-addr - [:date] - :user-agent ":method :url" :status - :response-time ms'));
  19. app.use express.bodyParser()
  20. app.use app.router
  21. app.configure 'development', ()->
  22. console.log "Development Enviroment"
  23. app.use express.errorHandler({ dumpExceptions: true, showStack: true })
  24. app.configure 'production', ()->
  25. console.log "Production Enviroment"
  26. app.use express.logger()
  27. app.use express.errorHandler()
  28. rclient.subscribe("pending-updates")
  29. rclient.on "message", (channel, doc_key)->
  30. [project_id, doc_id] = Keys.splitProjectIdAndDocId(doc_key)
  31. UpdateManager.processOutstandingUpdatesWithLock project_id, doc_id, (error) ->
  32. logger.error err: error, project_id: project_id, doc_id: doc_id, "error processing update" if error?
  33. UpdateManager.resumeProcessing()
  34. app.use (req, res, next)->
  35. metrics.inc "http-request"
  36. next()
  37. app.get '/project/:project_id/doc/:doc_id', HttpController.getDoc
  38. app.post '/project/:project_id/doc/:doc_id', HttpController.setDoc
  39. app.post '/project/:project_id/doc/:doc_id/flush', HttpController.flushDocIfLoaded
  40. app.delete '/project/:project_id/doc/:doc_id', HttpController.flushAndDeleteDoc
  41. app.delete '/project/:project_id', HttpController.deleteProject
  42. app.post '/project/:project_id/flush', HttpController.flushProject
  43. app.get '/total', (req, res)->
  44. timer = new metrics.Timer("http.allDocList")
  45. RedisManager.getCountOfDocsInMemory (err, count)->
  46. timer.done()
  47. res.send {total:count}
  48. app.get '/status', (req, res)->
  49. res.send('document updater is alive')
  50. app.use (error, req, res, next) ->
  51. logger.error err: error, "request errored"
  52. if error instanceof Errors.NotFoundError
  53. res.send 404
  54. else
  55. res.send(500, "Oops, something went wrong")
  56. port = Settings.internal?.documentupdater?.port or Settings.apis?.documentupdater?.port or 3003
  57. app.listen port, "localhost", ->
  58. logger.log("documentupdater-sharelatex server listening on port #{port}")