revisions.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. const loggerFactory = require('@alias/logger');
  2. const logger = loggerFactory('growi:routes:apiv3:pages');
  3. const express = require('express');
  4. const { query, param } = require('express-validator');
  5. const ErrorV3 = require('../../models/vo/error-apiv3');
  6. const router = express.Router();
  7. const PAGE_ITEMS = 30;
  8. /**
  9. * @swagger
  10. * tags:
  11. * name: Revisions
  12. */
  13. module.exports = (crowi) => {
  14. const certifySharedPage = require('../../middlewares/certify-shared-page')(crowi);
  15. const accessTokenParser = require('../../middlewares/access-token-parser')(crowi);
  16. const loginRequired = require('../../middlewares/login-required')(crowi, true);
  17. const apiV3FormValidator = require('../../middlewares/apiv3-form-validator')(crowi);
  18. const {
  19. Revision,
  20. Page,
  21. User,
  22. } = crowi.models;
  23. const validator = {
  24. retrieveRevisions: [
  25. query('pageId').isMongoId().withMessage('pageId is required'),
  26. query('selectedPage').isInt({ min: 0 }).withMessage('selectedPage must be int'),
  27. ],
  28. retrieveRevisionById: [
  29. query('pageId').isMongoId().withMessage('pageId is required'),
  30. param('id').isMongoId().withMessage('id is required'),
  31. ],
  32. };
  33. /**
  34. * @swagger
  35. *
  36. * /revisions/list:
  37. * get:
  38. * tags: [Revisions]
  39. * description: Get revisions by page id
  40. * parameters:
  41. * - in: query
  42. * name: pageId
  43. * schema:
  44. * type: string
  45. * description: page id
  46. * responses:
  47. * 200:
  48. * description: Return revisions belong to page
  49. *
  50. */
  51. router.get('/list', certifySharedPage, accessTokenParser, loginRequired, validator.retrieveRevisions, apiV3FormValidator, async(req, res) => {
  52. const pageId = req.query.pageId;
  53. const { isSharedPage } = req;
  54. const selectedPage = parseInt(req.query.selectedPage) || 1;
  55. // check whether accessible
  56. if (!isSharedPage && !(await Page.isAccessiblePageByViewer(pageId, req.user))) {
  57. return res.apiv3Err(new ErrorV3('Current user is not accessible to this page.', 'forbidden-page'), 403);
  58. }
  59. try {
  60. const page = await Page.findOne({ _id: pageId });
  61. const paginateResult = await Revision.paginate(
  62. { path: page.path },
  63. {
  64. page: selectedPage,
  65. limit: PAGE_ITEMS,
  66. sort: { createdAt: -1 },
  67. populate: {
  68. path: 'author',
  69. select: User.USER_PUBLIC_FIELDS,
  70. },
  71. },
  72. );
  73. return res.apiv3(paginateResult);
  74. }
  75. catch (err) {
  76. const msg = 'Error occurred in getting revisions by poge id';
  77. logger.error('Error', err);
  78. return res.apiv3Err(new ErrorV3(msg, 'faild-to-find-revisions'), 500);
  79. }
  80. });
  81. /**
  82. * @swagger
  83. *
  84. * /revisions/{id}:
  85. * get:
  86. * tags: [Revisions]
  87. * description: Get one revision by id
  88. * parameters:
  89. * - in: query
  90. * name: pageId
  91. * required: true
  92. * description: page id
  93. * schema:
  94. * type: string
  95. * - in: path
  96. * name: id
  97. * required: true
  98. * description: revision id
  99. * schema:
  100. * type: string
  101. * responses:
  102. * 200:
  103. * description: Return revision
  104. *
  105. */
  106. router.get('/:id', certifySharedPage, accessTokenParser, loginRequired, validator.retrieveRevisionById, apiV3FormValidator, async(req, res) => {
  107. const revisionId = req.params.id;
  108. const pageId = req.query.pageId;
  109. const { isSharedPage } = req;
  110. // check whether accessible
  111. if (!isSharedPage && !(await Page.isAccessiblePageByViewer(pageId, req.user))) {
  112. return res.apiv3Err(new ErrorV3('Current user is not accessible to this page.', 'forbidden-page'), 403);
  113. }
  114. try {
  115. const revision = await Revision.findById(revisionId).populate('author', User.USER_PUBLIC_FIELDS);
  116. return res.apiv3({ revision });
  117. }
  118. catch (err) {
  119. const msg = 'Error occurred in getting revision data by id';
  120. logger.error('Error', err);
  121. return res.apiv3Err(new ErrorV3(msg, 'faild-to-find-revision'), 500);
  122. }
  123. });
  124. return router;
  125. };