share-links.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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 } = require('express-validator');
  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('../../middlewares/login-required')(crowi);
  18. const adminRequired = require('../../middlewares/admin-required')(crowi);
  19. const csrf = require('../../middlewares/csrf')(crowi);
  20. const apiV3FormValidator = require('../../middlewares/apiv3-form-validator')(crowi);
  21. const ShareLink = crowi.model('ShareLink');
  22. /**
  23. * @swagger
  24. *
  25. * paths:
  26. * /share-links/:
  27. * post:
  28. * tags: [ShareLink]
  29. * description: get share links
  30. * parameters:
  31. * - name: relatedPage
  32. * in: query
  33. * required: true
  34. * description: page id of share link
  35. * schema:
  36. * type: string
  37. * responses:
  38. * 200:
  39. * description: Succeeded to get share links
  40. */
  41. router.get('/', loginRequired, async(req, res) => {
  42. const { relatedPage } = req.query;
  43. try {
  44. const shareLinksResult = await ShareLink.find({ relatedPage: { $in: relatedPage } }).populate({ path: 'relatedPage', select: 'path' });
  45. return res.apiv3({ shareLinksResult });
  46. }
  47. catch (err) {
  48. const msg = 'Error occurred in get share link';
  49. logger.error('Error', err);
  50. return res.apiv3Err(new ErrorV3(msg, 'get-shareLink-failed'));
  51. }
  52. });
  53. validator.shareLinkStatus = [
  54. // validate the page id is null
  55. body('relatedPage').not().isEmpty().withMessage('Page Id is null'),
  56. // validate expireation date is not empty, is not before today and is date.
  57. body('expiredAt').if(value => value != null).isAfter(today.toString()).withMessage('Your Selected date is past'),
  58. // validate the length of description is max 100.
  59. body('description').isLength({ min: 0, max: 100 }).withMessage('Max length is 100'),
  60. ];
  61. /**
  62. * @swagger
  63. *
  64. * paths:
  65. * /share-links/:
  66. * post:
  67. * tags: [ShareLink]
  68. * description: Create new share link
  69. * parameters:
  70. * - name: relatedPage
  71. * in: query
  72. * required: true
  73. * description: page id of share link
  74. * schema:
  75. * type: string
  76. * - name: expiredAt
  77. * in: query
  78. * description: expiration date of share link
  79. * schema:
  80. * type: string
  81. * - name: description
  82. * in: query
  83. * description: description of share link
  84. * schema:
  85. * type: string
  86. * responses:
  87. * 200:
  88. * description: Succeeded to create one share link
  89. */
  90. router.post('/', loginRequired, csrf, validator.shareLinkStatus, apiV3FormValidator, async(req, res) => {
  91. const { relatedPage, expiredAt, description } = req.body;
  92. const ShareLink = crowi.model('ShareLink');
  93. try {
  94. const postedShareLink = await ShareLink.create({ relatedPage, expiredAt, description });
  95. return res.apiv3(postedShareLink);
  96. }
  97. catch (err) {
  98. const msg = 'Error occured in post share link';
  99. logger.error('Error', err);
  100. return res.apiv3Err(new ErrorV3(msg, 'post-shareLink-failed'));
  101. }
  102. });
  103. /**
  104. * @swagger
  105. *
  106. * /share-links/:
  107. * delete:
  108. * tags: [ShareLinks]
  109. * summary: /share-links/
  110. * description: delete all share links related one page
  111. * parameters:
  112. * - name: relatedPage
  113. * in: query
  114. * required: true
  115. * description: page id of share link
  116. * schema:
  117. * type: string
  118. * responses:
  119. * 200:
  120. * description: Succeeded to delete o all share links related one page
  121. */
  122. router.delete('/', loginRequired, csrf, async(req, res) => {
  123. const { relatedPage } = req.query;
  124. try {
  125. const deletedShareLink = await ShareLink.remove({ relatedPage });
  126. return res.apiv3(deletedShareLink);
  127. }
  128. catch (err) {
  129. const msg = 'Error occured in delete share link';
  130. logger.error('Error', err);
  131. return res.apiv3Err(new ErrorV3(msg, 'delete-shareLink-failed'));
  132. }
  133. });
  134. /**
  135. * @swagger
  136. *
  137. * /share-links/all:
  138. * delete:
  139. * tags: [ShareLinks]
  140. * description: delete all share links
  141. * responses:
  142. * 200:
  143. * description: Succeeded to remove all share links
  144. */
  145. router.delete('/all', loginRequired, adminRequired, csrf, async(req, res) => {
  146. try {
  147. const deletedShareLink = await ShareLink.deleteMany({});
  148. const { deletedCount } = deletedShareLink;
  149. return res.apiv3({ deletedCount });
  150. }
  151. catch (err) {
  152. const msg = 'Error occurred in delete all share link';
  153. logger.error('Error', err);
  154. return res.apiv3Err(new ErrorV3(msg, 'delete-all-shareLink-failed'));
  155. }
  156. });
  157. /**
  158. * @swagger
  159. *
  160. * /share-links/{id}:
  161. * delete:
  162. * tags: [ShareLinks]
  163. * description: delete one share link related one page
  164. * parameters:
  165. * - name: id
  166. * in: path
  167. * required: true
  168. * description: id of share link
  169. * schema:
  170. * type: string
  171. * responses:
  172. * 200:
  173. * description: Succeeded to delete one share link
  174. */
  175. router.delete('/:id', loginRequired, csrf, async(req, res) => {
  176. const { id } = req.params;
  177. try {
  178. const deletedShareLink = await ShareLink.findOneAndRemove({ _id: id });
  179. return res.apiv3({ deletedShareLink });
  180. }
  181. catch (err) {
  182. const msg = 'Error occurred in delete share link';
  183. logger.error('Error', err);
  184. return res.apiv3Err(new ErrorV3(msg, 'delete-shareLink-failed'));
  185. }
  186. });
  187. return router;
  188. };