EditorRouter.mjs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import EditorHttpController from './EditorHttpController.mjs'
  2. import AuthenticationController from '../Authentication/AuthenticationController.mjs'
  3. import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.mjs'
  4. import { RateLimiter } from '../../infrastructure/RateLimiter.js'
  5. import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
  6. const rateLimiters = {
  7. addDocToProject: new RateLimiter('add-doc-to-project', {
  8. points: 30,
  9. duration: 60,
  10. }),
  11. addFolderToProject: new RateLimiter('add-folder-to-project', {
  12. points: 60,
  13. duration: 60,
  14. }),
  15. joinProject: new RateLimiter('join-project', { points: 45, duration: 60 }),
  16. }
  17. export default {
  18. apply(webRouter, privateApiRouter) {
  19. webRouter.post(
  20. '/project/:Project_id/doc',
  21. AuthorizationMiddleware.ensureUserCanWriteProjectContent,
  22. RateLimiterMiddleware.rateLimit(rateLimiters.addDocToProject, {
  23. params: ['Project_id'],
  24. }),
  25. EditorHttpController.addDoc
  26. )
  27. webRouter.post(
  28. '/project/:Project_id/folder',
  29. AuthorizationMiddleware.ensureUserCanWriteProjectContent,
  30. RateLimiterMiddleware.rateLimit(rateLimiters.addFolderToProject, {
  31. params: ['Project_id'],
  32. }),
  33. EditorHttpController.addFolder
  34. )
  35. webRouter.post(
  36. '/project/:Project_id/:entity_type/:entity_id/rename',
  37. AuthorizationMiddleware.ensureUserCanWriteProjectContent,
  38. EditorHttpController.renameEntity
  39. )
  40. webRouter.post(
  41. '/project/:Project_id/:entity_type/:entity_id/move',
  42. AuthorizationMiddleware.ensureUserCanWriteProjectContent,
  43. EditorHttpController.moveEntity
  44. )
  45. webRouter.delete(
  46. '/project/:Project_id/file/:entity_id',
  47. AuthorizationMiddleware.ensureUserCanWriteProjectContent,
  48. EditorHttpController.deleteFile
  49. )
  50. webRouter.delete(
  51. '/project/:Project_id/doc/:entity_id',
  52. AuthorizationMiddleware.ensureUserCanWriteProjectContent,
  53. EditorHttpController.deleteDoc
  54. )
  55. webRouter.delete(
  56. '/project/:Project_id/folder/:entity_id',
  57. AuthorizationMiddleware.ensureUserCanWriteProjectContent,
  58. EditorHttpController.deleteFolder
  59. )
  60. // Called by the real-time API to load up the current project state.
  61. // This is a post request because it's more than just a getting of data. We take actions
  62. // whenever a user joins a project, like updating the deleted status.
  63. privateApiRouter.post(
  64. '/project/:Project_id/join',
  65. AuthenticationController.requirePrivateApiAuth(),
  66. RateLimiterMiddleware.rateLimit(rateLimiters.joinProject, {
  67. params: ['Project_id'],
  68. // keep schema in sync with controller
  69. getUserId: req => req.body.userId,
  70. }),
  71. EditorHttpController.joinProject
  72. )
  73. },
  74. }