app.coffee 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. express = require('express')
  2. logger = require('logger-sharelatex')
  3. logger.initialize("filestore")
  4. metrics = require("./app/js/metrics")
  5. settings = require("settings-sharelatex")
  6. request = require("request")
  7. fileController = require("./app/js/FileController")
  8. keyBuilder = require("./app/js/KeyBuilder")
  9. domain = require("domain")
  10. appIsOk = true
  11. app = express()
  12. streamBuffers = require("stream-buffers")
  13. app.configure ->
  14. app.use express.bodyParser()
  15. app.configure 'development', ->
  16. console.log "Development Enviroment"
  17. app.use express.errorHandler({ dumpExceptions: true, showStack: true })
  18. app.configure 'production', ->
  19. console.log "Production Enviroment"
  20. app.use express.logger()
  21. app.use express.errorHandler()
  22. metrics.inc "startup"
  23. app.use (req, res, next)->
  24. metrics.inc "http-request"
  25. next()
  26. app.use (req, res, next) ->
  27. requestDomain = domain.create()
  28. requestDomain.add req
  29. requestDomain.add res
  30. requestDomain.on "error", (err)->
  31. res.send 500
  32. logger = require('logger-sharelatex')
  33. req =
  34. body:req.body
  35. headers:req.headers
  36. url:req.url
  37. key: req.key
  38. statusCode: req.statusCode
  39. err =
  40. message: err.message
  41. stack: err.stack
  42. name: err.name
  43. type: err.type
  44. arguments: err.arguments
  45. logger.err err:err, req:req, res:res, "uncaught exception thrown on request"
  46. requestDomain.run next
  47. app.get "/project/:project_id/file/:file_id", keyBuilder.userFileKey, fileController.getFile
  48. app.post "/project/:project_id/file/:file_id", keyBuilder.userFileKey, fileController.insertFile
  49. app.put "/project/:project_id/file/:file_id", keyBuilder.userFileKey, fileController.copyFile
  50. app.del "/project/:project_id/file/:file_id", keyBuilder.userFileKey, fileController.deleteFile
  51. app.get "/template/:template_id/v/:version/:format", keyBuilder.templateFileKey, fileController.getFile
  52. app.post "/template/:template_id/v/:version/:format", keyBuilder.templateFileKey, fileController.insertFile
  53. app.post "/shutdown", (req, res)->
  54. appIsOk = false
  55. res.send()
  56. app.get '/status', (req, res)->
  57. if appIsOk
  58. res.send('filestore sharelatex up')
  59. else
  60. logger.log "app is not ok - shutting down"
  61. res.send("server is being shut down", 500)
  62. app.get "/health_check", (req, res)->
  63. req.params.project_id = settings.health_check.project_id
  64. req.params.file_id = settings.health_check.file_id
  65. myWritableStreamBuffer = new streamBuffers.WritableStreamBuffer(initialSize: 100)
  66. keyBuilder.userFileKey req, res, ->
  67. fileController.getFile req, myWritableStreamBuffer
  68. myWritableStreamBuffer.on "close", ->
  69. if myWritableStreamBuffer.size() > 0
  70. res.send(200)
  71. else
  72. res.send(503)
  73. app.get '*', (req, res)->
  74. res.send 404
  75. serverDomain = domain.create()
  76. serverDomain.run ->
  77. server = require('http').createServer(app)
  78. port = settings.internal.filestore.port or 3009
  79. host = settings.internal.filestore.host or "localhost"
  80. server.listen port, host, ->
  81. logger.log("filestore store listening on #{host}:#{port}")
  82. serverDomain.on "error", (err)->
  83. logger.log err:err, "top level uncaught exception"