app.js 3.9 KB

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