Browse Source

create stram

itizawa 5 năm trước cách đây
mục cha
commit
aa8b57f675
3 tập tin đã thay đổi với 53 bổ sung15 xóa
  1. 1 7
      src/server/routes/apiv3/pages.js
  2. 1 6
      src/server/routes/page.js
  3. 51 2
      src/server/service/page.js

+ 1 - 7
src/server/routes/apiv3/pages.js

@@ -395,13 +395,7 @@ module.exports = (crowi) => {
       if (!page.isUpdatable(revisionId)) {
         return res.apiv3Err(new ErrorV3('Someone could update this page, so couldn\'t delete.', 'notfound_or_forbidden'), 409);
       }
-
-      if (isRecursively) {
-        page = await Page.renameRecursively(page, newPagePath, req.user, options);
-      }
-      else {
-        page = await crowi.pageService.rename(page, newPagePath, req.user, options);
-      }
+      page = await crowi.pageService.renamePage(page, newPagePath, req.user, options, isRecursively);
     }
     catch (err) {
       logger.error(err);

+ 1 - 6
src/server/routes/page.js

@@ -1343,12 +1343,7 @@ module.exports = function(crowi, app) {
         return res.json(ApiResponse.error('Someone could update this page, so couldn\'t delete.', 'outdated'));
       }
 
-      if (isRecursively) {
-        page = await Page.renameRecursively(page, newPagePath, req.user, options);
-      }
-      else {
-        page = await Page.rename(page, newPagePath, req.user, options);
-      }
+      page = await crowi.pageService.renamePage(page, newPagePath, req.user, options, isRecursively);
     }
     catch (err) {
       logger.error(err);

+ 51 - 2
src/server/service/page.js

@@ -22,9 +22,9 @@ class PageService {
   }
 
 
-  async renamePage(page, newPagePath, user, options) {
+  async renamePage(page, newPagePath, user, options, isRecursively = false) {
 
-    const Page = this;
+    const Page = this.crowi.model('Page');
     const Revision = this.crowi.model('Revision');
     const path = page.path;
     const createRedirectPage = options.createRedirectPage || false;
@@ -51,12 +51,61 @@ class PageService {
       await Page.create(path, body, user, { redirectTo: newPagePath });
     }
 
+    if (isRecursively) {
+      this.renameDescendantsWithStream(page, user, options);
+    }
+
     this.pageEvent.emit('delete', page, user, socketClientId);
     this.pageEvent.emit('create', renamedPage, user, socketClientId);
 
     return renamedPage;
   }
 
+  /**
+   * Create rename stream
+   */
+  async renameDescendantsWithStream(targetPage, user, options = {}) {
+    const Page = this.crowi.model('Page');
+    const { PageQueryBuilder } = Page;
+
+    const readStream = new PageQueryBuilder(Page.find())
+      .addConditionToExcludeRedirect()
+      .addConditionToListOnlyDescendants(targetPage.path)
+      .addConditionToFilteringByViewer(user)
+      .query
+      .lean()
+      .cursor();
+
+    // const deleteDescendants = this.deleteDescendants.bind(this);
+    let count = 0;
+    const writeStream = new Writable({
+      objectMode: true,
+      async write(batch, encoding, callback) {
+        try {
+          count += batch.length;
+          console.log(batch.length);
+          // deleteDescendants(batch, user);
+          logger.debug(`Reverting pages progressing: (count=${count})`);
+        }
+        catch (err) {
+          logger.error('revertPages error on add anyway: ', err);
+        }
+
+        callback();
+      },
+      final(callback) {
+        logger.debug(`Reverting pages has completed: (totalCount=${count})`);
+
+        callback();
+      },
+    });
+
+    readStream
+      .pipe(createBatchStream(BULK_REINDEX_SIZE))
+      .pipe(writeStream);
+  }
+
+
   async deleteCompletelyOperation(pageIds, pagePaths) {
     // Delete Bookmarks, Attachments, Revisions, Pages and emit delete
     const Bookmark = this.crowi.model('Bookmark');