Browse Source

refactor user homepage deletion

ryoji-s 2 years ago
parent
commit
27f53b0a98
1 changed files with 23 additions and 44 deletions
  1. 23 44
      apps/app/src/server/routes/apiv3/pages.js

+ 23 - 44
apps/app/src/server/routes/apiv3/pages.js

@@ -241,6 +241,24 @@ module.exports = (crowi) => {
     return [];
     return [];
   }
   }
 
 
+  const processCanBeUserHomepageDeletion = async(canDeleteFunction, userHomepages, pagesCanBeDeleted) => {
+    const isUsersHomepageDeletionEnabled = configManager.getConfig('crowi', 'security:user-homepage-deletion:isEnabled');
+    if (isUsersHomepageDeletionEnabled) {
+      const User = mongoose.model('User');
+      const usernameList = userHomepages.map(page => getUsernameByPath(page.path));
+      const existingUsernames = await User.distinct('username', { username: { $in: usernameList } });
+
+      const isUserHomepageDeletable = (page) => {
+        const username = getUsernameByPath(page.path);
+        return !existingUsernames.includes(username) && canDeleteFunction(page);
+      };
+
+      const deletableUserHomepages = userHomepages.filter(isUserHomepageDeletable);
+
+      pagesCanBeDeleted.push(...deletableUserHomepages);
+    }
+  };
+
   /**
   /**
    * @swagger
    * @swagger
    *
    *
@@ -908,8 +926,6 @@ module.exports = (crowi) => {
       return res.apiv3Err(new ErrorV3('The grant of the retrieved page is not restricted'), 500);
       return res.apiv3Err(new ErrorV3('The grant of the retrieved page is not restricted'), 500);
     }
     }
 
 
-    const pagesCanBeDeleted = [];
-
     // Since the decision to delete or not a user's homepage is an asynchronous process,
     // Since the decision to delete or not a user's homepage is an asynchronous process,
     // filtering is done here on the user homepages and other pages for performance optimization.
     // filtering is done here on the user homepages and other pages for performance optimization.
     const { filteredPages, userHomepages } = pagesToDelete.reduce((result, page) => {
     const { filteredPages, userHomepages } = pagesToDelete.reduce((result, page) => {
@@ -923,53 +939,16 @@ module.exports = (crowi) => {
     },
     },
     { filteredPages: [], userHomepages: [] });
     { filteredPages: [], userHomepages: [] });
 
 
-    /*
-     * Delete Completely
-     */
+    const pagesCanBeDeleted = [];
     if (isCompletely) {
     if (isCompletely) {
       pagesCanBeDeleted.push(...crowi.pageService.filterPagesByCanDeleteCompletely(filteredPages, req.user, isRecursively));
       pagesCanBeDeleted.push(...crowi.pageService.filterPagesByCanDeleteCompletely(filteredPages, req.user, isRecursively));
-
-      const isUsersHomepageDeletionEnabled = configManager.getConfig('crowi', 'security:user-homepage-deletion:isEnabled');
-      if (isUsersHomepageDeletionEnabled) {
-        const User = mongoose.model('User');
-        const usernameList = userHomepages.map(page => getUsernameByPath(page.path));
-        const existingUsernames = await User.distinct('username', { username: { $in: usernameList } });
-
-        const isUserHomepageDeletable = (page) => {
-          const username = getUsernameByPath(page.path);
-          if (existingUsernames.includes(username)) return false;
-
-          return page.isEmpty || crowi.pageService.canDeleteCompletely(page.path, page.creator, req.user, isRecursively);
-        };
-
-        const deletableUserHomepages = userHomepages.filter(page => isUserHomepageDeletable(page));
-
-        pagesCanBeDeleted.push(...deletableUserHomepages);
-      }
+      const canDeleteCompletely = page => page.isEmpty || crowi.pageService.canDeleteCompletely(page.path, page.creator, req.user, isRecursively);
+      await processCanBeUserHomepageDeletion(canDeleteCompletely, userHomepages, pagesCanBeDeleted);
     }
     }
-    /*
-     * Trash
-     */
     else {
     else {
       pagesCanBeDeleted.push(...crowi.pageService.filterPagesByCanDelete(filteredPages, req.user, isRecursively));
       pagesCanBeDeleted.push(...crowi.pageService.filterPagesByCanDelete(filteredPages, req.user, isRecursively));
-
-      const isUsersHomepageDeletionEnabled = configManager.getConfig('crowi', 'security:user-homepage-deletion:isEnabled');
-      if (isUsersHomepageDeletionEnabled) {
-        const User = mongoose.model('User');
-        const usernameList = userHomepages.map(page => getUsernameByPath(page.path));
-        const existingUsernames = await User.distinct('username', { username: { $in: usernameList } });
-
-        const isUserHomepageDeletable = (page) => {
-          const username = getUsernameByPath(page.path);
-          if (existingUsernames.includes(username)) return false;
-
-          return page.isEmpty || crowi.pageService.canDelete(page.path, page.creator, req.user, isRecursively);
-        };
-
-        const deletableUserHomepages = userHomepages.filter(page => isUserHomepageDeletable(page));
-
-        pagesCanBeDeleted.push(...deletableUserHomepages);
-      }
+      const canDelete = page => page.isEmpty || crowi.pageService.canDelete(page.path, page.creator, req.user, isRecursively);
+      await processCanBeUserHomepageDeletion(canDelete, userHomepages, pagesCanBeDeleted);
     }
     }
 
 
     if (pagesCanBeDeleted.length === 0) {
     if (pagesCanBeDeleted.length === 0) {