app.js 3.8 KB

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