Просмотр исходного кода

delete completely user home page and subpages

ryoji-s 2 лет назад
Родитель
Сommit
83ae580b8a
2 измененных файлов с 40 добавлено и 13 удалено
  1. 3 10
      apps/app/src/server/routes/apiv3/users.js
  2. 37 3
      apps/app/src/server/service/page.ts

+ 3 - 10
apps/app/src/server/routes/apiv3/users.js

@@ -757,7 +757,7 @@ module.exports = (crowi) => {
    *        tags: [Users]
    *        tags: [Users]
    *        operationId: removeUser
    *        operationId: removeUser
    *        summary: /users/{id}/remove
    *        summary: /users/{id}/remove
-   *        description: Delete user and if isUsersHomePageDeletionEnabled delete user home page and sub pages
+   *        description: Delete user and if isUsersHomePageDeletionEnabled delete user home page and subpages
    *        parameters:
    *        parameters:
    *          - name: id
    *          - name: id
    *            in: path
    *            in: path
@@ -767,7 +767,7 @@ module.exports = (crowi) => {
    *              type: string
    *              type: string
    *        responses:
    *        responses:
    *          200:
    *          200:
-   *            description: Deleting user success and if isUsersHomePageDeletionEnabled delete user home page and sub pages success
+   *            description: Deleting user success and if isUsersHomePageDeletionEnabled delete user home page and subpages success
    *            content:
    *            content:
    *              application/json:
    *              application/json:
    *                schema:
    *                schema:
@@ -801,14 +801,7 @@ module.exports = (crowi) => {
       activityEvent.emit('update', res.locals.activity._id, { action: SupportedAction.ACTION_ADMIN_USERS_REMOVE });
       activityEvent.emit('update', res.locals.activity._id, { action: SupportedAction.ACTION_ADMIN_USERS_REMOVE });
 
 
       if (isUsersHomePageDeletionEnabled) {
       if (isUsersHomePageDeletionEnabled) {
-        crowi.pageService.deleteUserHomePageAndSubPages(
-          userHomePagePath,
-          req.user,
-          {
-            ip: req.ip,
-            endpoint: req.originalUrl,
-          },
-        );
+        crowi.pageService.deleteCompletelyUserHomePageAndSubpages(req.user, userHomePagePath);
       }
       }
 
 
       return res.apiv3({
       return res.apiv3({

+ 37 - 3
apps/app/src/server/service/page.ts

@@ -1962,16 +1962,50 @@ class PageService {
     }
     }
   }
   }
 
 
-  async deleteUserHomePageAndSubPages(userHomePagePath, user, activityParameters): Promise<void> {
+  async deleteCompletelyUserHomePageAndSubpages(user, userHomePagePath, options = {}): Promise<void> {
     const Page = this.crowi.model('Page');
     const Page = this.crowi.model('Page');
     const userHomePage = await Page.findByPath(userHomePagePath, user);
     const userHomePage = await Page.findByPath(userHomePagePath, user);
 
 
     if (userHomePage == null) {
     if (userHomePage == null) {
       logger.error('user home page is not found.');
       logger.error('user home page is not found.');
-      throw new Error('user collection deleted but user home page is not found');
+      return;
     }
     }
 
 
-    this.deleteCompletely(userHomePage, user, {}, true, false, activityParameters);
+    const ids = [userHomePage._id];
+    const paths = [userHomePage.path];
+
+    let pageOp;
+    try {
+      // 1. update descendantCount
+      const inc = userHomePage.isEmpty ? -userHomePage.descendantCount : -(userHomePage.descendantCount + 1);
+      await this.updateDescendantCountOfAncestors(userHomePage.parent, inc, true);
+      // 2. delete target completely
+      await this.deleteCompletelyOperation(ids, paths);
+      // 3. delete leaf empty pages
+      await Page.removeLeafEmptyPagesRecursively(userHomePage.parent);
+
+      if (!userHomePage.isEmpty) {
+        this.pageEvent.emit('deleteCompletely', userHomePage, user);
+      }
+
+      pageOp = await PageOperation.create({
+        actionType: PageActionType.DeleteCompletely,
+        actionStage: PageActionStage.Main,
+        page: userHomePage,
+        user,
+        fromPath: userHomePage.path,
+        options,
+      });
+
+      await this.deleteCompletelyRecursivelyMainOperation(userHomePage, user, options, pageOp._id);
+    }
+    catch (err) {
+      logger.error('Error occurred while deleting user home page and subpages.', err);
+      if (pageOp != null) {
+        await PageOperation.deleteOne({ _id: pageOp._id });
+      }
+      throw err;
+    }
   }
   }
 
 
   // use the same process in both v4 and v5
   // use the same process in both v4 and v5