app.js 3.8 KB

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