share-links.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. // TODO remove this setting after implemented all
  2. /* eslint-disable no-unused-vars */
  3. const loggerFactory = require('@alias/logger');
  4. const logger = loggerFactory('growi:routes:apiv3:share-links');
  5. const express = require('express');
  6. const router = express.Router();
  7. const { body, query } = require('express-validator/check');
  8. const ErrorV3 = require('../../models/vo/error-apiv3');
  9. const validator = {};
  10. const today = new Date();
  11. /**
  12. * @swagger
  13. * tags:
  14. * name: ShareLink
  15. */
  16. module.exports = (crowi) => {
  17. const loginRequired = require('../../middleware/login-required')(crowi);
  18. const csrf = require('../../middleware/csrf')(crowi);
  19. const { ApiV3FormValidator } = crowi.middlewares;
  20. const ShareLink = crowi.model('ShareLink');
  21. /**
  22. * @swagger
  23. *
  24. * paths:
  25. * /share-links/:
  26. * post:
  27. * tags: [ShareLink]
  28. * description: get share links
  29. * parameters:
  30. * - name: relatedPage
  31. * in: query
  32. * required: true
  33. * description: page id of share link
  34. * schema:
  35. * type: string
  36. * responses:
  37. * 200:
  38. * description: Succeeded to get share links
  39. */
  40. router.get('/', loginRequired, csrf, ApiV3FormValidator, async(req, res) => {
  41. const { relatedPage } = req.query;
  42. try {
  43. const paginateResult = await ShareLink.find({ relatedPage: { $in: relatedPage } });
  44. return res.apiv3({ paginateResult });
  45. }
  46. catch (err) {
  47. const msg = 'Error occurred in get share link';
  48. logger.error('Error', err);
  49. return res.apiv3Err(new ErrorV3(msg, 'get-shareLink-failed'));
  50. }
  51. });
  52. validator.shareLinkStatus = [
  53. // validate the page id is null
  54. body('relatedPage').not().isEmpty().withMessage('Page Id is null'),
  55. // validate expireation date is not empty, is not before today and is date.
  56. body('expiredAt').isAfter(today.toString()).withMessage('Your Selected date is past'),
  57. // validate the length of description is max 100.
  58. body('description').isLength({ min: 0, max: 100 }).withMessage('Max length is 100'),
  59. ];
  60. /**
  61. * @swagger
  62. *
  63. * paths:
  64. * /share-links/:
  65. * post:
  66. * tags: [ShareLink]
  67. * description: Create new share link
  68. * parameters:
  69. * - name: relatedPage
  70. * in: query
  71. * required: true
  72. * description: page id of share link
  73. * schema:
  74. * type: string
  75. * - name: expiredAt
  76. * in: query
  77. * description: expiration date of share link
  78. * schema:
  79. * type: string
  80. * - name: description
  81. * in: query
  82. * description: description of share link
  83. * schema:
  84. * type: string
  85. * responses:
  86. * 200:
  87. * description: Succeeded to create one share link
  88. */
  89. router.post('/', loginRequired, csrf, validator.shareLinkStatus, ApiV3FormValidator, async(req, res) => {
  90. const { relatedPage, expiredAt, description } = req.body;
  91. const ShareLink = crowi.model('ShareLink');
  92. try {
  93. const postedShareLink = await ShareLink.create({ relatedPage, expiredAt, description });
  94. return res.apiv3(postedShareLink);
  95. }
  96. catch (err) {
  97. const msg = 'Error occured in post share link';
  98. logger.error('Error', err);
  99. return res.apiv3Err(new ErrorV3(msg, 'post-shareLink-failed'));
  100. }
  101. });
  102. // TDOO write swagger
  103. router.delete('/all', loginRequired, async(req, res) => {
  104. const { relatedPage } = req.body;
  105. // TODO GW-2694 Delete all share links
  106. });
  107. /**
  108. * @swagger
  109. *
  110. * /share-links/{id}:
  111. * delete:
  112. * tags: [ShareLinks]
  113. * description: delete one share link related one page
  114. * parameters:
  115. * - name: id
  116. * in: path
  117. * required: true
  118. * description: id of share link
  119. * schema:
  120. * type: string
  121. * responses:
  122. * 200:
  123. * description: Succeeded to delete one share link
  124. */
  125. router.delete('/:id', loginRequired, csrf, async(req, res) => {
  126. const { id } = req.params;
  127. try {
  128. const deletedShareLink = await ShareLink.findOneAndRemove({ _id: id });
  129. return res.apiv3(deletedShareLink);
  130. }
  131. catch (err) {
  132. const msg = 'Error occurred in delete share link';
  133. logger.error('Error', err);
  134. return res.apiv3Err(new ErrorV3(msg, 'delete-shareLink-failed'));
  135. }
  136. });
  137. return router;
  138. };