Просмотр исходного кода

Merge branch 'feat/export-single-page-for-merge' into feat/convert-md-file-to-pdf

# Conflicts:
#	src/client/js/components/Page/PageShareManagement.jsx
#	src/server/routes/apiv3/page.js
yusuketk 5 лет назад
Родитель
Сommit
3b1bade9e2

+ 1 - 1
src/client/js/components/Page/PageShareManagement.jsx

@@ -29,7 +29,7 @@ const PageShareManagement = (props) => {
 
   async function exportPageHundler(type) {
     try {
-      const { revisionId } = pageContainer.state;
+      const { pageId, revisionId } = pageContainer.state;
       const responseType = type === 'pdf' ? 'arraybuffer' : 'json';
       // const responseType = 'stream';
       const markdown = await appContainer.apiv3Get('/page/export', { revisionId, type, responseType });

+ 34 - 12
src/server/routes/apiv3/page.js

@@ -3,11 +3,11 @@ const loggerFactory = require('@alias/logger');
 const logger = loggerFactory('growi:routes:apiv3:page'); // eslint-disable-line no-unused-vars
 
 const express = require('express');
-const { body } = require('express-validator');
+const { body, query } = require('express-validator');
 
 const router = express.Router();
 
-// const ErrorV3 = require('../../models/vo/error-apiv3');
+const ErrorV3 = require('../../models/vo/error-apiv3');
 
 /**
  * @swagger
@@ -124,6 +124,10 @@ module.exports = (crowi) => {
       body('pageId').isString(),
       body('bool').isBoolean(),
     ],
+    export: [
+      query('pageId').isString(),
+      query('revisionId').isString(),
+    ],
   };
 
   /**
@@ -193,23 +197,41 @@ module.exports = (crowi) => {
   *          200:
   *            description: Return page's markdown
   */
-  router.get('/export', async(req, res) => {
+  router.get('/export', validator.export, async(req, res) => {
     try {
-      const { type, pageId = null, revisionId = null } = req.query;
-      let markdown;
+      const { pageId = null, revisionId = null } = req.query;
+
+      if (pageId == null) {
+        return res.apiv3Err(new ErrorV3('Should provided pageId or both pageId and revisionId.'));
+      }
+
+      const isPageExist = await Page.count({ _id: pageId }) > 0;
+      if (!isPageExist) {
+        return res.apiv3Err(new ErrorV3(`Page ${pageId} is not exist.`), 404);
+      }
 
-      // TODO: GW-3061
-      if (revisionId != null) {
-        markdown = '#Revision';
+      const isAccessible = await Page.isAccessiblePageByViewer(pageId, req.user);
+      if (!isAccessible) {
+        return res.apiv3Err(new ErrorV3(`Haven't the right to see the page ${pageId}.`), 403);
       }
-      else if (pageId != null) {
-        markdown = '#Page';
+
+
+      let revisionIdForFind;
+      if (revisionId == null) {
+        const Page = crowi.model('Page');
+        const page = await Page.findByIdAndViewer(pageId);
+        revisionIdForFind = page.revision;
       }
       else {
-        return res.apiv3Err('Should provided pageId or revisionId');
+        revisionIdForFind = revisionId;
       }
 
-      return await exportService.createExportStream(res, markdown, type);
+      
+      const Revision = crowi.model('Revision');
+      const revision = await Revision.findById(revisionIdForFind);
+
+      const markdown = revision.body;
+	  return await exportService.createExportStream(res, markdown, type);
     }
     catch (err) {
       logger.error('Failed to get markdown', err);