2
0

revision.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. /**
  2. * @swagger
  3. * tags:
  4. * name: Revisions
  5. */
  6. /**
  7. * @swagger
  8. *
  9. * components:
  10. * schemas:
  11. * Revision:
  12. * description: Revision
  13. * type: object
  14. * properties:
  15. * _id:
  16. * type: string
  17. * description: revision ID
  18. * example: 5e0734e472560e001761fa68
  19. * __v:
  20. * type: number
  21. * description: DB record version
  22. * example: 0
  23. * author:
  24. * $ref: '#/components/schemas/User/properties/_id'
  25. * body:
  26. * type: string
  27. * description: content body
  28. * example: |
  29. * # test
  30. *
  31. * test
  32. * format:
  33. * type: string
  34. * description: format
  35. * example: markdown
  36. * path:
  37. * type: string
  38. * description: path
  39. * example: /user/alice/test
  40. * createdAt:
  41. * type: string
  42. * description: date created at
  43. * example: 2010-01-01T00:00:00.000Z
  44. */
  45. module.exports = function(crowi, app) {
  46. const debug = require('debug')('growi:routes:revision');
  47. const logger = require('@alias/logger')('growi:routes:revision');
  48. const Page = crowi.model('Page');
  49. const Revision = crowi.model('Revision');
  50. const User = crowi.model('User');
  51. const ApiResponse = require('../util/apiResponse');
  52. const actions = {};
  53. actions.api = {};
  54. /**
  55. * @swagger
  56. *
  57. * /revisions.get:
  58. * get:
  59. * tags: [Revisions, CrowiCompatibles]
  60. * operationId: revisions.get
  61. * summary: /revisions.get
  62. * description: Get revision
  63. * parameters:
  64. * - in: query
  65. * name: page_id
  66. * schema:
  67. * $ref: '#/components/schemas/Page/properties/_id'
  68. * required: true
  69. * - in: query
  70. * name: revision_id
  71. * schema:
  72. * $ref: '#/components/schemas/Revision/properties/_id'
  73. * required: true
  74. * responses:
  75. * 200:
  76. * description: Succeeded to get revision.
  77. * content:
  78. * application/json:
  79. * schema:
  80. * properties:
  81. * ok:
  82. * $ref: '#/components/schemas/V1Response/properties/ok'
  83. * revision:
  84. * $ref: '#/components/schemas/Revision'
  85. * 403:
  86. * $ref: '#/components/responses/403'
  87. * 500:
  88. * $ref: '#/components/responses/500'
  89. */
  90. /**
  91. * @api {get} /revisions.get Get revision
  92. * @apiName GetRevision
  93. * @apiGroup Revision
  94. *
  95. * @apiParam {String} page_id Page Id.
  96. * @apiParam {String} revision_id Revision Id.
  97. */
  98. actions.api.get = async function(req, res) {
  99. const pageId = req.query.page_id;
  100. const revisionId = req.query.revision_id;
  101. const { isSharedPage } = req;
  102. if (!pageId || !revisionId) {
  103. return res.json(ApiResponse.error('Parameter page_id and revision_id are required.'));
  104. }
  105. // check whether accessible
  106. const isAccessible = await Page.isAccessiblePageByViewer(pageId, req.user);
  107. if (!isSharedPage && !isAccessible) {
  108. return res.json(ApiResponse.error('Current user is not accessible to this page.'));
  109. }
  110. try {
  111. const revision = await Revision.findById(revisionId).populate('author', User.USER_PUBLIC_FIELDS);
  112. return res.json(ApiResponse.success({ revision }));
  113. }
  114. catch (err) {
  115. logger.error('Error revisios.get', err);
  116. return res.json(ApiResponse.error(err));
  117. }
  118. };
  119. /**
  120. * @swagger
  121. *
  122. * /revisions.ids:
  123. * get:
  124. * tags: [Revisions, CrowiCompatibles]
  125. * operationId: revisions.ids
  126. * summary: /revisions.ids
  127. * description: Get revision id list of the page
  128. * parameters:
  129. * - in: query
  130. * name: page_id
  131. * schema:
  132. * $ref: '#/components/schemas/Page/properties/_id'
  133. * required: true
  134. * responses:
  135. * 200:
  136. * description: Succeeded to get revision id list of the page.
  137. * content:
  138. * application/json:
  139. * schema:
  140. * properties:
  141. * ok:
  142. * $ref: '#/components/schemas/V1Response/properties/ok'
  143. * revisions:
  144. * type: array
  145. * items:
  146. * $ref: '#/components/schemas/Revision'
  147. * 403:
  148. * $ref: '#/components/responses/403'
  149. * 500:
  150. * $ref: '#/components/responses/500'
  151. */
  152. /**
  153. * @api {get} /revisions.ids Get revision id list of the page
  154. * @apiName ids
  155. * @apiGroup Revision
  156. *
  157. * @apiParam {String} page_id Page Id.
  158. */
  159. actions.api.ids = function(req, res) {
  160. const pageId = req.query.page_id || null;
  161. if (pageId && crowi.isPageId(pageId)) {
  162. Page.findByIdAndViewer(pageId, req.user)
  163. .then((pageData) => {
  164. debug('Page found', pageData._id, pageData.path);
  165. return Revision.findRevisionList(pageData.path);
  166. })
  167. .then((revisions) => {
  168. return res.json(ApiResponse.success({ revisions }));
  169. })
  170. .catch((err) => {
  171. return res.json(ApiResponse.error(err));
  172. });
  173. }
  174. else {
  175. return res.json(ApiResponse.error('Parameter error.'));
  176. }
  177. };
  178. /**
  179. * @swagger
  180. *
  181. * /revisions.list:
  182. * get:
  183. * tags: [Revisions, CrowiCompatibles]
  184. * operationId: revisions.list
  185. * summary: /revisions.list
  186. * description: Get revisions
  187. * parameters:
  188. * - in: query
  189. * name: page_id
  190. * schema:
  191. * $ref: '#/components/schemas/Page/properties/_id'
  192. * - in: query
  193. * name: revision_ids
  194. * schema:
  195. * type: string
  196. * description: revision ids
  197. * example: 5e0734e472560e001761fa68,5e079a0a0afa6700170a75fb
  198. * responses:
  199. * 200:
  200. * description: Succeeded to get revisions.
  201. * content:
  202. * application/json:
  203. * schema:
  204. * properties:
  205. * ok:
  206. * $ref: '#/components/schemas/V1Response/properties/ok'
  207. * revisions:
  208. * type: array
  209. * items:
  210. * $ref: '#/components/schemas/Revision'
  211. * 403:
  212. * $ref: '#/components/responses/403'
  213. * 500:
  214. * $ref: '#/components/responses/500'
  215. */
  216. /**
  217. * @api {get} /revisions.list Get revisions
  218. * @apiName ListRevision
  219. * @apiGroup Revision
  220. *
  221. * @apiParam {String} revision_ids Revision Ids.
  222. * @apiParam {String} page_id Page Id.
  223. */
  224. actions.api.list = function(req, res) {
  225. const revisionIds = (req.query.revision_ids || '').split(',');
  226. const pageId = req.query.page_id || null;
  227. if (pageId) {
  228. Page.findByIdAndViewer(pageId, req.user)
  229. .then((pageData) => {
  230. debug('Page found', pageData._id, pageData.path);
  231. return Revision.findRevisionList(pageData.path, {});
  232. })
  233. .then((revisions) => {
  234. return res.json(ApiResponse.success(revisions));
  235. })
  236. .catch((err) => {
  237. return res.json(ApiResponse.error(err));
  238. });
  239. }
  240. else if (revisionIds.length > 0) {
  241. Revision.findRevisions(revisionIds)
  242. .then((revisions) => {
  243. return res.json(ApiResponse.success(revisions));
  244. })
  245. .catch((err) => {
  246. return res.json(ApiResponse.error(err));
  247. });
  248. }
  249. else {
  250. return res.json(ApiResponse.error('Parameter error.'));
  251. }
  252. };
  253. return actions;
  254. };