mizozobu 7 лет назад
Родитель
Сommit
4b303ab3ff
3 измененных файлов с 65 добавлено и 20 удалено
  1. 43 0
      src/server/models/page.js
  2. 10 8
      src/server/models/user-group.js
  3. 12 12
      src/server/routes/admin.js

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

@@ -1308,6 +1308,49 @@ module.exports = function(crowi) {
     return pageData;
   };
 
+  pageSchema.statics.handlePrivatePagesForDeletedGroup = async function(deletedGroup, action, selectedGroupId) {
+    const Page = mongoose.model('Page');
+
+    const pages = await this.find({ grantedGroup: deletedGroup });
+
+    switch (action) {
+      case 'public':
+        await Promise.all(pages.map((page) => {
+          return Page.publicizePage(page);
+        }));
+        break;
+      case 'delete':
+        await Promise.all(pages.map((page) => {
+          return Page.completelyDeletePage(page);
+        }));
+        break;
+      case 'transfer':
+        await Promise.all(pages.map((page) => {
+          return Page.transferPageToGroup(page, selectedGroupId);
+        }));
+        break;
+      default:
+        throw new Error('Unknown action for private pages');
+    }
+  };
+
+  pageSchema.statics.publicizePage = async function(page) {
+    page.grantedGroup = null;
+    page.grant = GRANT_PUBLIC;
+    await page.save();
+  };
+
+  pageSchema.statics.transferPageToGroup = async function(page, selectedGroupId) {
+    const UserGroup = mongoose.model('UserGroup');
+
+    // check page existence
+    const isExist = await UserGroup.count({ _id: selectedGroupId }) > 0;
+    if (isExist) {
+      page.grantedGroup = selectedGroupId;
+      await page.save();
+    }
+  };
+
   /**
    * associate GROWI page and HackMD page
    * @param {Page} pageData

+ 10 - 8
src/server/models/user-group.js

@@ -90,30 +90,32 @@ class UserGroup {
   }
 
   // グループの完全削除
-  static removeCompletelyById(id) {
+  static removeCompletelyById(deleteGroupId, action, selectedGroupId) {
     const PageGroupRelation = mongoose.model('PageGroupRelation');
     const UserGroupRelation = mongoose.model('UserGroupRelation');
+    const Page = mongoose.model('Page');
 
-    let removed;
-    return this.findById(id)
+    let deletedGroup;
+    return this.findById(deleteGroupId)
       .then((userGroupData) => {
         if (userGroupData == null) {
-          throw new Error('UserGroup data is not exists. id:', id);
+          throw new Error('UserGroup data is not exists. id:', deleteGroupId);
         }
         return userGroupData.remove();
       })
       .then((removedUserGroupData) => {
-        removed = removedUserGroupData;
+        deletedGroup = removedUserGroupData;
       })
       // remove relations
       .then(() => {
         return Promise.all([
-          UserGroupRelation.removeAllByUserGroup(removed),
-          PageGroupRelation.removeAllByUserGroup(removed),
+          UserGroupRelation.removeAllByUserGroup(deletedGroup),
+          PageGroupRelation.removeAllByUserGroup(deletedGroup),
+          Page.handlePrivatePagesForDeletedGroup(deletedGroup, action, selectedGroupId),
         ]);
       })
       .then(() => {
-        return removed;
+        return deletedGroup;
       });
   }
 

+ 12 - 12
src/server/routes/admin.js

@@ -780,19 +780,19 @@ module.exports = function(crowi, app) {
 
 
   // app.post('/_api/admin/user-group/delete' , admin.userGroup.removeCompletely);
-  actions.userGroup.removeCompletely = function(req, res) {
-    const id = req.body.user_group_id;
+  actions.userGroup.removeCompletely = async(req, res) => {
+    const { deleteGroupId, actionForPages, selectedGroupId } = req.body;
 
-    UserGroup.removeCompletelyById(id)
-      .then(() => {
-        req.flash('successMessage', '削除しました');
-        return res.redirect('/admin/user-groups');
-      })
-      .catch((err) => {
-        debug('Error while removing userGroup.', err, id);
-        req.flash('errorMessage', '完全な削除に失敗しました。');
-        return res.redirect('/admin/user-groups');
-      });
+    try {
+      await UserGroup.removeCompletelyById(deleteGroupId, actionForPages, selectedGroupId);
+      req.flash('successMessage', '削除しました');
+    }
+    catch (err) {
+      debug('Error while removing userGroup.', err, deleteGroupId);
+      req.flash('errorMessage', '完全な削除に失敗しました。');
+    }
+
+    return res.redirect('/admin/user-groups');
   };
 
   actions.userGroupRelation = {};