Taichi Masuyama пре 4 година
родитељ
комит
2294b6de82
2 измењених фајлова са 21 додато и 36 уклоњено
  1. 14 17
      packages/app/src/server/models/page.ts
  2. 7 19
      packages/app/src/server/service/page.ts

+ 14 - 17
packages/app/src/server/models/page.ts

@@ -500,41 +500,38 @@ schema.statics.findAncestorsUsingParentRecursively = async function(pageId: Obje
 schema.statics.removeLeafEmptyPagesRecursively = async function(pageId: ObjectIdLike): Promise<void> {
 schema.statics.removeLeafEmptyPagesRecursively = async function(pageId: ObjectIdLike): Promise<void> {
   const self = this;
   const self = this;
 
 
-  const initialLeafPage = await this.findById(pageId);
+  const initialPage = await this.findById(pageId);
 
 
-  if (initialLeafPage == null) {
+  if (initialPage == null) {
     return;
     return;
   }
   }
 
 
-  if (!initialLeafPage.isEmpty) {
+  if (!initialPage.isEmpty) {
     return;
     return;
   }
   }
 
 
-  async function generatePageIdsToRemove(page, pageIds: ObjectIdLike[]): Promise<ObjectIdLike[]> {
-    const nextPage = await self.findById(page.parent);
-
-    if (nextPage == null) {
+  async function generatePageIdsToRemove(childPage, page, pageIds: ObjectIdLike[] = []): Promise<ObjectIdLike[]> {
+    if (!page.isEmpty) {
       return pageIds;
       return pageIds;
     }
     }
 
 
-    // delete leaf empty pages
-    const isNextPageEmpty = nextPage.isEmpty;
-
-    if (!isNextPageEmpty) {
+    const isChildrenOtherThanTargetExist = await self.exists({ _id: { $ne: childPage?._id }, parent: page._id });
+    if (isChildrenOtherThanTargetExist) {
       return pageIds;
       return pageIds;
     }
     }
 
 
-    const isSiblingsExist = await self.exists({ parent: nextPage.parent, _id: { $ne: nextPage._id } });
-    if (isSiblingsExist) {
+    pageIds.push(page._id);
+
+    const nextPage = await self.findById(page.parent);
+
+    if (nextPage == null) {
       return pageIds;
       return pageIds;
     }
     }
 
 
-    return generatePageIdsToRemove(nextPage, [...pageIds, nextPage._id]);
+    return generatePageIdsToRemove(page, nextPage, pageIds);
   }
   }
 
 
-  const initialPageIdsToRemove = [initialLeafPage._id];
-
-  const pageIdsToRemove = await generatePageIdsToRemove(initialLeafPage, initialPageIdsToRemove);
+  const pageIdsToRemove = await generatePageIdsToRemove(null, initialPage);
 
 
   await this.deleteMany({ _id: { $in: pageIdsToRemove } });
   await this.deleteMany({ _id: { $in: pageIdsToRemove } });
 };
 };

+ 7 - 19
packages/app/src/server/service/page.ts

@@ -226,7 +226,7 @@ class PageService {
     let page: PageModel & PageDocument & HasObjectId;
     let page: PageModel & PageDocument & HasObjectId;
     if (pageId != null) { // prioritized
     if (pageId != null) { // prioritized
       page = await Page.findByIdAndViewer(pageId, user);
       page = await Page.findByIdAndViewer(pageId, user);
-      pagePath = page.path;
+      pagePath = page?.path;
     }
     }
     else {
     else {
       page = await Page.findByPathAndViewer(pagePath, user);
       page = await Page.findByPathAndViewer(pagePath, user);
@@ -316,20 +316,6 @@ class PageService {
     return page.grant !== Page.GRANT_RESTRICTED && page.grant !== Page.GRANT_SPECIFIED;
     return page.grant !== Page.GRANT_RESTRICTED && page.grant !== Page.GRANT_SPECIFIED;
   }
   }
 
 
-  /**
-   * Remove all empty pages at leaf position by page whose parent will change or which will be deleted.
-   * @param page Page whose parent will change or which will be deleted
-   */
-  async removeLeafEmptyPages(page): Promise<void> {
-    const Page = mongoose.model('Page') as unknown as PageModel;
-
-    // delete leaf empty pages
-    const isSiblingsOrChildrenExist = await Page.exists({ parent: { $in: [page.parent, page._id] }, _id: { $ne: page._id } });
-    if (!isSiblingsOrChildrenExist) {
-      await Page.removeLeafEmptyPagesRecursively(page.parent);
-    }
-  }
-
   /**
   /**
    * Generate read stream to operate descendants of the specified page path
    * Generate read stream to operate descendants of the specified page path
    * @param {string} targetPagePath
    * @param {string} targetPagePath
@@ -455,6 +441,10 @@ class PageService {
       update.updatedAt = new Date();
       update.updatedAt = new Date();
     }
     }
     const renamedPage = await Page.findByIdAndUpdate(page._id, { $set: update }, { new: true });
     const renamedPage = await Page.findByIdAndUpdate(page._id, { $set: update }, { new: true });
+
+    // remove empty pages at leaf position
+    await Page.removeLeafEmptyPagesRecursively(page.parent);
+
     this.pageEvent.emit('rename', page, user);
     this.pageEvent.emit('rename', page, user);
 
 
     // Set to Sub
     // Set to Sub
@@ -1208,8 +1198,7 @@ class PageService {
       await this.updateDescendantCountOfAncestors(page.parent, -1, true);
       await this.updateDescendantCountOfAncestors(page.parent, -1, true);
     }
     }
     // 2. Delete leaf empty pages
     // 2. Delete leaf empty pages
-    const parent = await Page.findById(page.parent);
-    await this.removeLeafEmptyPages(parent);
+    await Page.removeLeafEmptyPagesRecursively(page.parent);
 
 
     if (isRecursively) {
     if (isRecursively) {
       const newPath = Page.getDeletedPageName(page.path);
       const newPath = Page.getDeletedPageName(page.path);
@@ -1528,8 +1517,7 @@ class PageService {
     await this.deleteCompletelyOperation(ids, paths);
     await this.deleteCompletelyOperation(ids, paths);
 
 
     // delete leaf empty pages
     // delete leaf empty pages
-    const parent = await Page.findById(page.parent);
-    await this.removeLeafEmptyPages(parent);
+    await Page.removeLeafEmptyPagesRecursively(page.parent);
 
 
     if (!page.isEmpty && !preventEmitting) {
     if (!page.isEmpty && !preventEmitting) {
       this.pageEvent.emit('deleteCompletely', page, user);
       this.pageEvent.emit('deleteCompletely', page, user);