app.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. const Events = require('events')
  2. const Metrics = require('@overleaf/metrics')
  3. Metrics.initialize(process.env.METRICS_APP_NAME || 'filestore')
  4. const logger = require('@overleaf/logger')
  5. logger.initialize(process.env.METRICS_APP_NAME || 'filestore')
  6. const settings = require('@overleaf/settings')
  7. const express = require('express')
  8. const bodyParser = require('body-parser')
  9. const fileController = require('./app/js/FileController')
  10. const keyBuilder = require('./app/js/KeyBuilder')
  11. const healthCheckController = require('./app/js/HealthCheckController')
  12. const RequestLogger = require('./app/js/RequestLogger')
  13. Events.setMaxListeners(20)
  14. const app = express()
  15. app.use(RequestLogger.middleware)
  16. if (settings.sentry && settings.sentry.dsn) {
  17. logger.initializeErrorReporting(settings.sentry.dsn)
  18. }
  19. Metrics.open_sockets.monitor(true)
  20. Metrics.memory.monitor(logger)
  21. if (Metrics.event_loop) {
  22. Metrics.event_loop.monitor(logger)
  23. }
  24. Metrics.leaked_sockets.monitor(logger)
  25. app.use(function (req, res, next) {
  26. Metrics.inc('http-request')
  27. next()
  28. })
  29. Metrics.injectMetricsRoute(app)
  30. app.head(
  31. '/project/:project_id/file/:file_id',
  32. keyBuilder.userFileKeyMiddleware,
  33. fileController.getFileHead
  34. )
  35. app.get(
  36. '/project/:project_id/file/:file_id',
  37. keyBuilder.userFileKeyMiddleware,
  38. fileController.getFile
  39. )
  40. app.post(
  41. '/project/:project_id/file/:file_id',
  42. keyBuilder.userFileKeyMiddleware,
  43. fileController.insertFile
  44. )
  45. app.put(
  46. '/project/:project_id/file/:file_id',
  47. keyBuilder.userFileKeyMiddleware,
  48. bodyParser.json(),
  49. fileController.copyFile
  50. )
  51. app.delete(
  52. '/project/:project_id/file/:file_id',
  53. keyBuilder.userFileKeyMiddleware,
  54. fileController.deleteFile
  55. )
  56. app.delete(
  57. '/project/:project_id',
  58. keyBuilder.userProjectKeyMiddleware,
  59. fileController.deleteProject
  60. )
  61. app.head(
  62. '/template/:template_id/v/:version/:format',
  63. keyBuilder.templateFileKeyMiddleware,
  64. fileController.getFileHead
  65. )
  66. app.get(
  67. '/template/:template_id/v/:version/:format',
  68. keyBuilder.templateFileKeyMiddleware,
  69. fileController.getFile
  70. )
  71. app.get(
  72. '/template/:template_id/v/:version/:format/:sub_type',
  73. keyBuilder.templateFileKeyMiddleware,
  74. fileController.getFile
  75. )
  76. app.post(
  77. '/template/:template_id/v/:version/:format',
  78. keyBuilder.templateFileKeyMiddleware,
  79. fileController.insertFile
  80. )
  81. app.head(
  82. '/project/:project_id/public/:public_file_id',
  83. keyBuilder.publicFileKeyMiddleware,
  84. fileController.getFileHead
  85. )
  86. app.get(
  87. '/project/:project_id/public/:public_file_id',
  88. keyBuilder.publicFileKeyMiddleware,
  89. fileController.getFile
  90. )
  91. app.post(
  92. '/project/:project_id/public/:public_file_id',
  93. keyBuilder.publicFileKeyMiddleware,
  94. fileController.insertFile
  95. )
  96. app.put(
  97. '/project/:project_id/public/:public_file_id',
  98. keyBuilder.publicFileKeyMiddleware,
  99. bodyParser.json(),
  100. fileController.copyFile
  101. )
  102. app.delete(
  103. '/project/:project_id/public/:public_file_id',
  104. keyBuilder.publicFileKeyMiddleware,
  105. fileController.deleteFile
  106. )
  107. app.get(
  108. '/project/:project_id/size',
  109. keyBuilder.publicProjectKeyMiddleware,
  110. fileController.directorySize
  111. )
  112. app.get(
  113. '/bucket/:bucket/key/*',
  114. keyBuilder.bucketFileKeyMiddleware,
  115. fileController.getFile
  116. )
  117. app.get('/status', function (req, res) {
  118. res.send('filestore sharelatex up')
  119. })
  120. app.get('/health_check', healthCheckController.check)
  121. app.use(RequestLogger.errorHandler)
  122. const port = settings.internal.filestore.port || 3009
  123. const host = settings.internal.filestore.host || '0.0.0.0'
  124. if (!module.parent) {
  125. // Called directly
  126. app.listen(port, host, error => {
  127. if (error) {
  128. logger.error('Error starting Filestore', error)
  129. throw error
  130. }
  131. logger.debug(`Filestore starting up, listening on ${host}:${port}`)
  132. })
  133. }
  134. process
  135. .on('unhandledRejection', (reason, p) => {
  136. logger.err(reason, 'Unhandled Rejection at Promise', p)
  137. })
  138. .on('uncaughtException', err => {
  139. logger.err(err, 'Uncaught Exception thrown')
  140. process.exit(1)
  141. })
  142. module.exports = app