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

WIP: refactor models/page.js

* refactor Page.revertDeleted*
Yuki Takei 7 лет назад
Родитель
Сommit
043bb4ad52
2 измененных файлов с 41 добавлено и 51 удалено
  1. 24 39
      src/server/models/page.js
  2. 17 12
      src/server/routes/page.js

+ 24 - 39
src/server/models/page.js

@@ -1039,55 +1039,40 @@ module.exports = function(crowi) {
 
   };
 
-  pageSchema.statics.revertDeletedPage = function(pageData, user, options) {
-    const Page = this
-      , newPath = Page.getRevertDeletedPageName(pageData.path)
-      ;
+  pageSchema.statics.revertDeletedPage = async function(page, user, options) {
+    const newPath = this.getRevertDeletedPageName(page.path);
 
     // 削除時、元ページの path には必ず redirectTo 付きで、ページが作成される。
     // そのため、そいつは削除してOK
     // が、redirectTo ではないページが存在している場合それは何かがおかしい。(データ補正が必要)
-    return new Promise(function(resolve, reject) {
-      Page.findPageByPath(newPath)
-      .then(function(originPageData) {
-        if (originPageData.redirectTo !== pageData.path) {
-          throw new Error('The new page of to revert is exists and the redirect path of the page is not the deleted page.');
-        }
+    const originPage = await this.findPageByPath(newPath);
+    if (originPage.redirectTo !== page.path) {
+      throw new Error('The new page of to revert is exists and the redirect path of the page is not the deleted page.');
+    }
 
-        return Page.completelyDeletePage(originPageData, options);
-      }).then(function(done) {
-        return Page.updatePageProperty(pageData, {status: STATUS_PUBLISHED, lastUpdateUser: user});
-      }).then(function(done) {
-        pageData.status = STATUS_PUBLISHED;
+    await this.completelyDeletePage(originPage, options);
+    await this.updatePageProperty(page, {status: STATUS_PUBLISHED, lastUpdateUser: user});
 
-        debug('Revert deleted the page, and rename again it', pageData, newPath);
-        return Page.rename(pageData, newPath, user, {});
-      }).then(function(done) {
-        pageData.path = newPath;
-        resolve(pageData);
-      }).catch(reject);
-    });
+    page.status = STATUS_PUBLISHED;
+
+    debug('Revert deleted the page, and rename again it', page, newPath);
+    await this.rename(page, newPath, user, {});
+    page.path = newPath;
+
+    return page;
   };
 
-  pageSchema.statics.revertDeletedPageRecursively = function(pageData, user, options = {}) {
-    const Page = this
-      , path = pageData.path
-      ;
+  pageSchema.statics.revertDeletedPageRecursively = async function(page, user, options = {}) {
     options = Object.assign({ includeDeletedPage: true }, options);
 
-    return new Promise(function(resolve, reject) {
-      Page
-        .generateQueryToListWithDescendants(path, user, options)
-        .exec()
-        .then(function(pages) {
-          Promise.all(pages.map(function(page) {
-            return Page.revertDeletedPage(page, user, options);
-          }))
-          .then(function(data) {
-            return resolve(data[0]);
-          });
-        });
-    });
+    const pages = await this.generateQueryToListWithDescendants(page.path, user, options).exec();
+    const revertedPages = await Promise.all(
+      pages.map(p => {
+        return this.revertDeletedPage(p, user, options);
+      })
+    );
+
+    return revertedPages[0];
   };
 
   /**

+ 17 - 12
src/server/routes/page.js

@@ -904,31 +904,36 @@ module.exports = function(crowi, app) {
    *
    * @apiParam {String} page_id Page Id.
    */
-  api.revertRemove = function(req, res, options) {
+  api.revertRemove = async function(req, res, options) {
     const pageId = req.body.page_id;
     const socketClientId = req.body.socketClientId || undefined;
 
     // get recursively flag
     const isRecursively = (req.body.recursively !== undefined);
 
-    Page.findPageByIdAndGrantedUser(pageId, req.user)
-    .then(function(pageData) {
+    let page;
+    try {
+      page = await Page.findOneByIdAndViewer(pageId, req.user);
+      if (page == null) {
+        throw new Error('The page is not found or the user does not have permission');
+      }
 
       if (isRecursively) {
-        return Page.revertDeletedPageRecursively(pageData, req.user, {socketClientId});
+        page = await Page.revertDeletedPageRecursively(page, req.user, {socketClientId});
       }
       else {
-        return Page.revertDeletedPage(pageData, req.user, {socketClientId});
+        page = await Page.revertDeletedPage(page, req.user, {socketClientId});
       }
-    }).then(function(data) {
-      const result = {};
-      result.page = data;   // TODO consider to use serializeToObj method -- 2018.08.06 Yuki Takei
-
-      return res.json(ApiResponse.success(result));
-    }).catch(function(err) {
+    }
+    catch (err) {
       logger.error('Error occured while get setting', err, err.stack);
       return res.json(ApiResponse.error('Failed to revert deleted page.'));
-    });
+    }
+
+    const result = {};
+    result.page = page;   // TODO consider to use serializeToObj method -- 2018.08.06 Yuki Takei
+
+    return res.json(ApiResponse.success(result));
   };
 
   /**