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

Merge pull request #2461 from weseek/feat/export-page-as-markdown

Feat/export page as markdown
N1koge 5 лет назад
Родитель
Сommit
81b084ef1a

+ 10 - 11
src/client/js/components/Page/PageShareManagement.jsx

@@ -27,25 +27,24 @@ const PageShareManagement = (props) => {
     setIsOutsideShareLinkModalShown(false);
   }
 
-
-  async function getExportPageFile(type) {
-    const pageId = pageContainer.state.pageId;
+  async function getMarkdown() {
+    const { revisionId } = pageContainer.state;
     try {
-      const res = await appContainer.apiv3Get('/pages/export', { pageId, type });
-      return res;
+      const res = await appContainer.apiv3Get('/page/export', { revisionId });
+      return res.data.markdown;
     }
     catch (err) {
       toastError(Error(t('export_bulk.failed_to_export')));
     }
   }
 
-  function exportPage(exportPageFile) {
-    // TODO implement
+  async function exportPage(markdown, type) {
+    // TODO: GW-3063
   }
 
-  function exportPageHundler(type) {
-    const exportPageFile = getExportPageFile(type);
-    exportPage(exportPageFile);
+  async function exportPageHundler(type) {
+    const markdown = await getMarkdown();
+    await exportPage(markdown, type);
   }
 
   function renderModals() {
@@ -99,7 +98,7 @@ const PageShareManagement = (props) => {
           <i className="icon-fw icon-link"></i>{t('Shere this page link to public')}
           <span className="ml-2 badge badge-info badge-pill">{pageContainer.state.shareLinksNumber}</span>
         </button>
-        <button type="button" className="dropdown-item" onClick={() => { exportPageHundler('markdown') }}>
+        <button type="button" className="dropdown-item" onClick={() => { exportPageHundler('md') }}>
           <span>{t('export_bulk.export_page_markdown')}</span>
         </button>
         <button type="button" className="dropdown-item" onClick={() => { exportPageHundler('pdf') }}>

+ 35 - 0
src/server/routes/apiv3/page.js

@@ -183,5 +183,40 @@ module.exports = (crowi) => {
     return res.apiv3({ result });
   });
 
+  /**
+  * @swagger
+  *
+  *    /pages/export:
+  *      get:
+  *        tags: [Export]
+  *        description: return page's markdown
+  *        responses:
+  *          200:
+  *            description: Return page's markdown
+  */
+  router.get('/export', async(req, res) => {
+    try {
+      const { pageId, revisionId } = req.query;
+      let markdown;
+
+      // TODO: GW-3061
+      if (revisionId) {
+        markdown = '#Revision';
+      }
+      else if (pageId) {
+        markdown = '#Page';
+      }
+      else {
+        return res.apiv3Err('Should provided pageId or revisionId');
+      }
+
+      return res.apiv3({ markdown });
+    }
+    catch (err) {
+      logger.error('Failed to get markdown', err);
+      return res.apiv3Err(err, 500);
+    }
+  });
+
   return router;
 };

+ 0 - 16
src/server/routes/apiv3/pages.js

@@ -84,21 +84,5 @@ module.exports = (crowi) => {
     }
   });
 
-  /**
-  * @swagger
-  *
-  *    /pages/export:
-  *      get:
-  *        tags: [Export]
-  *        description: get currently page file as md or pdf
-  *        responses:
-  *          200:
-  *            description: Return currently page file
-  */
-  router.get('/export', async(req, res) => {
-    // TODO use res.apiv3
-    return res.json({ ok: true });
-  });
-
   return router;
 };