yohei0125 %!s(int64=4) %!d(string=hai) anos
pai
achega
b7b96c32d1

+ 4 - 5
packages/app/src/server/service/page.ts

@@ -261,12 +261,10 @@ class PageService {
   private shouldUseV4ProcessForRevert(page): boolean {
     const Page = mongoose.model('Page') as unknown as PageModel;
 
-    const isPageMigrated = page.parent != null;
     const isV5Compatible = this.crowi.configManager.getConfig('crowi', 'app:isV5Compatible');
-    const isRoot = isTopPage(page.path);
     const isPageRestricted = page.grant === Page.GRANT_RESTRICTED;
 
-    const shouldUseV4Process = !isRoot && !isPageRestricted && (!isV5Compatible || !isPageMigrated);
+    const shouldUseV4Process = !isPageRestricted && !isV5Compatible;
 
     return shouldUseV4Process;
   }
@@ -297,6 +295,8 @@ class PageService {
    * @param {User} viewer
    */
   private async generateReadStreamToOperateOnlyDescendants(targetPagePath, userToOperate) {
+    console.log('generateReadStreamToOperateOnlyDescendants');
+
     const Page = this.crowi.model('Page');
     const { PageQueryBuilder } = Page;
 
@@ -1525,13 +1525,12 @@ class PageService {
       },
     }, { new: true });
     await PageTagRelation.updateMany({ relatedPage: page._id }, { $set: { isPageTrashed: false } });
-
     if (isRecursively) {
       await this.updateDescendantCountOfAncestors(parent._id, 1, true);
     }
 
     // TODO: resume
-    if (!isRecursively) {
+    if (isRecursively) {
       // no await for revertDeletedDescendantsWithStream
       this.resumableRevertDeletedDescendants(page, user, options, shouldUseV4Process);
     }

+ 65 - 8
packages/app/test/integration/service/pagev5.test.ts

@@ -233,7 +233,12 @@ describe('PageService page operations with only public pages', () => {
 
 
     const pageIdForRevert1 = new mongoose.Types.ObjectId();
+    const pageIdForRevert2 = new mongoose.Types.ObjectId();
+    const pageIdForRevert3 = new mongoose.Types.ObjectId();
+
     const revisionIdForRevert1 = new mongoose.Types.ObjectId();
+    const revisionIdForRevert2 = new mongoose.Types.ObjectId();
+    const revisionIdForRevert3 = new mongoose.Types.ObjectId();
 
     await Page.insertMany([
       {
@@ -246,6 +251,24 @@ describe('PageService page operations with only public pages', () => {
         revision: revisionIdForRevert1,
         status: Page.STATUS_DELETED,
       },
+      {
+        _id: pageIdForRevert2,
+        path: '/trash/v5_revert2',
+        grant: Page.GRANT_PUBLIC,
+        creator: dummyUser1,
+        lastUpdateUser: dummyUser1._id,
+        revision: revisionIdForRevert2,
+        status: Page.STATUS_DELETED,
+      },
+      {
+        _id: pageIdForRevert3,
+        path: '/trash/v5_revert2/v5_revert3/v5_revert4',
+        grant: Page.GRANT_PUBLIC,
+        creator: dummyUser1,
+        lastUpdateUser: dummyUser1._id,
+        revision: revisionIdForRevert3,
+        status: Page.STATUS_DELETED,
+      },
     ]);
 
     await Revision.insertMany([
@@ -256,6 +279,20 @@ describe('PageService page operations with only public pages', () => {
         format: 'comment',
         author: dummyUser1,
       },
+      {
+        _id: revisionIdForRevert2,
+        pageId: pageIdForRevert2,
+        body: 'revert2',
+        format: 'comment',
+        author: dummyUser1,
+      },
+      {
+        _id: revisionIdForRevert3,
+        pageId: pageIdForRevert3,
+        body: 'revert3',
+        format: 'comment',
+        author: dummyUser1,
+      },
     ]);
 
     const tagIdRevert1 = new mongoose.Types.ObjectId();
@@ -430,21 +467,16 @@ describe('PageService page operations with only public pages', () => {
     const revertDeletedPage = async(page, user, options = {}, isRecursively = false) => {
       // mock return value
       const mockedResumableRevertDeletedDescendants = jest.spyOn(crowi.pageService, 'resumableRevertDeletedDescendants').mockReturnValue(null);
+      const revertedPage = await crowi.pageService.revertDeletedPage(page, user, options, isRecursively);
 
-      const updatedPage = await crowi.pageService.revertDeletedPage(page, user, options, isRecursively);
-
-      // retrieve the arguments passed when calling method resumableRenameDescendants inside renamePage method
       const argsForResumableRevertDeletedDescendants = mockedResumableRevertDeletedDescendants.mock.calls[0];
 
       // restores the original implementation
       mockedResumableRevertDeletedDescendants.mockRestore();
+      await crowi.pageService.resumableRevertDeletedDescendants(...argsForResumableRevertDeletedDescendants);
 
-      // revert descendants
-      if (isRecursively) {
-        await crowi.pageService.resumableRevertDeletedDescendants(...argsForResumableRevertDeletedDescendants);
-      }
+      return revertedPage;
 
-      return updatedPage;
     };
 
     test('revert single deleted page', async() => {
@@ -465,6 +497,31 @@ describe('PageService page operations with only public pages', () => {
       expect(pageTagRelation.isPageTrashed).toBe(false);
 
     });
+
+    // test('revert multiple deleted page (has non existent page in the middle)', async() => {
+    //   const deletedPage1 = await Page.findOne({ path: '/trash/v5_revert2' });
+    //   const deletedPage2 = await Page.findOne({ path: '/trash/v5_revert2/v5_revert3/v5_revert4' });
+    //   const revision1 = await Revision.findOne({ pageId: deletedPage1._id });
+    //   const revision2 = await Revision.findOne({ pageId: deletedPage2._id });
+
+    //   expectAllToBeTruthy([deletedPage1, deletedPage2, revision1, revision2]);
+    //   expect(deletedPage1.status).toBe(Page.STATUS_DELETED);
+    //   expect(deletedPage2.status).toBe(Page.STATUS_DELETED);
+
+    //   const revertedPage1 = await revertDeletedPage(deletedPage1, dummyUser1, {}, true);
+    //   const revertedPage2 = await Page.findOne({ _id: deletedPage2._id });
+    //   const newlyCreatedPage = await Page.findOne({ path: '/v5_revert2/v5_revert3' });
+
+    //   expectAllToBeTruthy([revertedPage1, revertedPage2, newlyCreatedPage]);
+    //   expect(revertedPage1.path).toBe('/v5_revert2');
+    //   expect(revertedPage2.path).toBe('/v5_revert2/v5_revert3/v5_revert4');
+    //   expect(newlyCreatedPage.parent).toBe(revertedPage1._id);
+    //   expect(revertedPage2.parent).toBe(newlyCreatedPage._id);
+    //   expect(revertedPage1.status).toBe(Page.STATUS_PUBLISHED);
+    //   expect(revertedPage2.status).toBe(Page.STATUS_PUBLISHED);
+    //   expect(newlyCreatedPage.status).toBe(Page.STATUS_PUBLISHED);
+
+    // });
   });
 
 });