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

rename path and imprv modularity

mizozobu 6 лет назад
Родитель
Сommit
035e331ff7
3 измененных файлов с 31 добавлено и 20 удалено
  1. 9 6
      src/server/routes/apiv3/export.js
  2. 1 1
      src/server/routes/apiv3/index.js
  3. 21 13
      src/server/service/export.js

+ 9 - 6
src/server/routes/apiv3/page.js → src/server/routes/apiv3/export.js

@@ -1,6 +1,6 @@
 const loggerFactory = require('@alias/logger');
 
-const logger = loggerFactory('growi:routes:apiv3:page'); // eslint-disable-line no-unused-vars
+const logger = loggerFactory('growi:routes:apiv3:export'); // eslint-disable-line no-unused-vars
 
 const express = require('express');
 
@@ -9,16 +9,17 @@ const router = express.Router();
 /**
  * @swagger
  *  tags:
- *    name: Page
+ *    name: Export
  */
 
 module.exports = (crowi) => {
   const { exportService } = crowi;
+  const { Page } = crowi.models;
 
   /**
    * @swagger
    *
-   *  /page/dump:
+   *  /export/pages:
    *    get:
    *      tags: [Page]
    *      description: generate a zipped json for page collection
@@ -30,13 +31,15 @@ module.exports = (crowi) => {
    *          content:
    *            application/json:
    */
-  router.get('/dump', async(req, res) => {
+  router.get('/pages', async(req, res) => {
+    // TODO: rename path to "/:collection" and add express validator
     try {
-      await exportService.exportPageCollection();
+      await exportService.exportCollection(Page);
+      // TODO:use res.apiv3
       return res.status(200).send({ status: 'DONE' });
     }
     catch (err) {
-      // TODO:user ApiV3Error
+      // TODO: use ApiV3Error
       logger.error(err);
       return res.status(500).send({ status: 'ERROR' });
     }

+ 1 - 1
src/server/routes/apiv3/index.js

@@ -9,7 +9,7 @@ const router = express.Router();
 module.exports = (crowi) => {
   router.use('/healthcheck', require('./healthcheck')(crowi));
 
-  router.use('/pages', require('./page')(crowi));
+  router.use('/export', require('./export')(crowi));
 
   return router;
 };

+ 21 - 13
src/server/service/export.js

@@ -2,19 +2,26 @@ const logger = require('@alias/logger')('growi:services:ExportService'); // esli
 
 const fs = require('fs');
 const path = require('path');
-const mongoose = require('mongoose');
-
-const Page = mongoose.model('Page');
 
 class ExportService {
 
   constructor(crowi) {
-    this.baseDir = crowi.tmpDir;
+    this.baseDir = path.join(crowi.tmpDir, 'downloads');
     this.limit = 100;
 
-    this.files = {
-      pages: path.join(this.baseDir, 'pages.json'),
-    };
+    this.files = {};
+    // populate this.files
+    // this.files = {
+    //   configs: path.join(this.baseDir, 'configs.json'),
+    //   pages: path.join(this.baseDir, 'pages.json'),
+    //   pagetagrelations: path.join(this.baseDir, 'pagetagrelations.json'),
+    //   ...
+    // };
+    // TODO: handle 3 globalnotificationsettings collection properly
+    Object.values(crowi.models).forEach((m) => {
+      const name = m.collection.collectionName;
+      this.files[name] = path.join(this.baseDir, `${name}.json`);
+    });
   }
 
   /**
@@ -87,26 +94,27 @@ class ExportService {
   }
 
   /**
-   * dump page collection
+   * dump a mongodb collection into json
    *
    * @memberOf ExportService
+   * @param {object} Model instance of mongoose model
    */
-  async exportPageCollection() {
-    const file = this.files.pages;
+  async exportCollection(Model) {
+    const file = this.files[Model.collection.collectionName];
 
     const getTotalFn = () => {
-      return Page.countDocuments();
+      return Model.countDocuments();
     };
 
     const paginatedQueryFn = (limit, pageNum) => {
-      return Page
+      return Model
         .find()
         .skip(limit * pageNum)
         .limit(limit);
     };
 
     await this.export(file, getTotalFn, paginatedQueryFn);
-    logger.debug(`exported page collection into ${file}`);
+    logger.debug(`exported ${Model.collection.collectionName} collection into ${file}`);
   }
 
 }