app.js 4.1 KB

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