Explorar el Código

create deleteDescendants

itizawa hace 5 años
padre
commit
418f5ca748
Se han modificado 2 ficheros con 42 adiciones y 18 borrados
  1. 1 0
      src/server/models/page.js
  2. 41 18
      src/server/service/page.js

+ 1 - 0
src/server/models/page.js

@@ -1305,6 +1305,7 @@ module.exports = function(crowi) {
 
 
   };
   };
 
 
+  pageSchema.statics.STATUS_PUBLISHED = STATUS_PUBLISHED;
   pageSchema.statics.STATUS_DELETED = STATUS_DELETED;
   pageSchema.statics.STATUS_DELETED = STATUS_DELETED;
   pageSchema.statics.GRANT_PUBLIC = GRANT_PUBLIC;
   pageSchema.statics.GRANT_PUBLIC = GRANT_PUBLIC;
   pageSchema.statics.GRANT_RESTRICTED = GRANT_RESTRICTED;
   pageSchema.statics.GRANT_RESTRICTED = GRANT_RESTRICTED;

+ 41 - 18
src/server/service/page.js

@@ -7,7 +7,6 @@ const { createBatchStream } = require('@server/util/batch-stream');
 const { isTrashPage } = require('@commons/util/path-utils');
 const { isTrashPage } = require('@commons/util/path-utils');
 const { serializePageSecurely } = require('../models/serializers/page-serializer');
 const { serializePageSecurely } = require('../models/serializers/page-serializer');
 
 
-const STATUS_PUBLISHED = 'published';
 const BULK_REINDEX_SIZE = 100;
 const BULK_REINDEX_SIZE = 100;
 
 
 class PageService {
 class PageService {
@@ -242,21 +241,45 @@ class PageService {
   }
   }
 
 
   async deleteDescendants(pages, user) {
   async deleteDescendants(pages, user) {
-    // const Page = this.crowi.model('Page');
-    console.log(pages);
-
-    // const isTrashed = isTrashPage(targetPage.path);
-    // const newPath = Page.getDeletedPageName(targetPage.path);
-    // if (isTrashed) {
-    //   throw new Error('This method does NOT supports deleting trashed pages.');
-    // }
-
-    // if (!Page.isDeletableName(targetPage.path)) {
-    //   throw new Error('Page is not deletable');
-    // }
-    // const socketClientId = options.socketClientId || null;
-    // targetPage.status = Page.STATUS_DELETED;
-    // return Page.renameRecursively(targetPage, newPath, user, { socketClientId, createRedirectPage: true });
+    const Page = this.crowi.model('Page');
+
+    const pageCollection = mongoose.connection.collection('pages');
+    const revisionCollection = mongoose.connection.collection('revisions');
+
+    const deletePageBulkOp = pageCollection.initializeUnorderedBulkOp();
+    const updateRevisionListOp = revisionCollection.initializeUnorderedBulkOp();
+    const newPagesForRedirect = [];
+
+    pages.forEach((page) => {
+      const newPath = Page.getDeletedPageName(page.path);
+      const body = `redirect ${newPath}`;
+
+      deletePageBulkOp.find({ _id: page._id }).update({ $set: { path: newPath, status: Page.STATUS_DELETED, lastUpdateUser: user._id } });
+      updateRevisionListOp.find({ path: page.path }).update({ $set: { path: newPath } });
+
+      newPagesForRedirect.push({
+        path: page.path,
+        body,
+        creator: user._id,
+        grant: page.grant,
+        grantedGroup: page.grantedGroup,
+        grantedUsers: page.grantedUsers,
+        lastUpdateUser: user._id,
+        redirectTo: newPath,
+        revision: null,
+      });
+    });
+
+    try {
+      await deletePageBulkOp.execute();
+      await updateRevisionListOp.execute();
+      await Page.insertMany(newPagesForRedirect, { ordered: false });
+    }
+    catch (err) {
+      if (err.code !== 11000) {
+        throw new Error('Failed to revert pages: ', err);
+      }
+    }
   }
   }
 
 
   /**
   /**
@@ -410,7 +433,7 @@ class PageService {
           removePageBulkOp.find({ path: toPath }).remove();
           removePageBulkOp.find({ path: toPath }).remove();
         }
         }
       }
       }
-      revertPageBulkOp.find({ _id: page._id }).update({ $set: { path: toPath, status: STATUS_PUBLISHED, lastUpdateUser: user._id } });
+      revertPageBulkOp.find({ _id: page._id }).update({ $set: { path: toPath, status: Page.STATUS_PUBLISHED, lastUpdateUser: user._id } });
       revertRevisionBulkOp.find({ path: page.path }).update({ $set: { path: toPath } }, { multi: true });
       revertRevisionBulkOp.find({ path: page.path }).update({ $set: { path: toPath } }, { multi: true });
     });
     });
 
 
@@ -444,7 +467,7 @@ class PageService {
       this.revertDeletedDescendantsWithStream(page, user, options);
       this.revertDeletedDescendantsWithStream(page, user, options);
     }
     }
 
 
-    page.status = STATUS_PUBLISHED;
+    page.status = Page.STATUS_PUBLISHED;
     page.lastUpdateUser = user;
     page.lastUpdateUser = user;
     debug('Revert deleted the page', page, newPath);
     debug('Revert deleted the page', page, newPath);
     const updatedPage = await Page.rename(page, newPath, user, {});
     const updatedPage = await Page.rename(page, newPath, user, {});