yuto-o 4 лет назад
Родитель
Сommit
6749d2d2d6

+ 57 - 0
packages/app/src/migrations/20210921173042-add-is-trashed-field.js

@@ -0,0 +1,57 @@
+import mongoose from 'mongoose';
+
+import config from '^/config/migrate';
+import loggerFactory from '~/utils/logger';
+
+const logger = loggerFactory('growi:migrate:add-column-is-trashed');
+const Page = require('~/server/models/page')();
+
+module.exports = {
+  async up(db) {
+    logger.info('Apply migration');
+    mongoose.connect(config.mongoUri, config.mongodb.options);
+
+    const pages = await Page.find({});
+
+    // create requests for bulkWrite
+    const requests = pages.map((page) => {
+      return {
+        updateMany: {
+          filter: { relatedPage: page._id },
+          update: { $set: { isPageTrashed: page.status === Page.STATUS_DELETED } },
+        },
+      };
+    });
+
+    if (requests.length > 0) {
+      await db.collection('pagetagrelations').bulkWrite(requests);
+      // throw new Error('error!');
+    }
+
+    logger.info('Migration has successfully applied');
+  },
+
+  async down(db) {
+    logger.info('Rollback migration');
+    mongoose.connect(config.mongoUri, config.mongodb.options);
+
+    const pages = await Page.find({});
+
+    // create requests for bulkWrite
+    const requests = pages.map((page) => {
+      return {
+        updateMany: {
+          filter: { relatedPage: page._id },
+          update: { $unset: { isPageTrashed: '' } },
+        },
+      };
+    });
+
+    if (requests.length > 0) {
+      await db.collection('pagetagrelations').bulkWrite(requests);
+    }
+
+    logger.info('Migration has been successfully rollbacked');
+
+  },
+};

+ 6 - 1
packages/app/src/server/models/page-tag-relation.js

@@ -25,6 +25,11 @@ const schema = new mongoose.Schema({
     ref: 'Tag',
     ref: 'Tag',
     required: true,
     required: true,
   },
   },
+  isPageTrashed: {
+    type: Boolean,
+    default: false,
+    required: true,
+  },
 });
 });
 // define unique compound index
 // define unique compound index
 schema.index({ relatedPage: 1, relatedTag: 1 }, { unique: true });
 schema.index({ relatedPage: 1, relatedTag: 1 }, { unique: true });
@@ -47,7 +52,7 @@ class PageTagRelation {
 
 
     const existTagIds = await Tag.find().distinct('_id');
     const existTagIds = await Tag.find().distinct('_id');
     const tags = await this.aggregate()
     const tags = await this.aggregate()
-      .match({ relatedTag: { $in: existTagIds } })
+      .match({ relatedTag: { $in: existTagIds }, isPageTrashed: false })
       .group({ _id: '$relatedTag', count: { $sum: 1 } })
       .group({ _id: '$relatedTag', count: { $sum: 1 } })
       .sort(sortOpt);
       .sort(sortOpt);
 
 

+ 4 - 0
packages/app/src/server/service/page.js

@@ -405,6 +405,7 @@ class PageService {
 
 
   async deletePage(page, user, options = {}, isRecursively = false) {
   async deletePage(page, user, options = {}, isRecursively = false) {
     const Page = this.crowi.model('Page');
     const Page = this.crowi.model('Page');
+    const PageTagRelation = this.crowi.model('PageTagRelation');
     const Revision = this.crowi.model('Revision');
     const Revision = this.crowi.model('Revision');
 
 
     const newPath = Page.getDeletedPageName(page.path);
     const newPath = Page.getDeletedPageName(page.path);
@@ -429,6 +430,7 @@ class PageService {
         path: newPath, status: Page.STATUS_DELETED, deleteUser: user._id, deletedAt: Date.now(),
         path: newPath, status: Page.STATUS_DELETED, deleteUser: user._id, deletedAt: Date.now(),
       },
       },
     }, { new: true });
     }, { new: true });
+    await PageTagRelation.updateMany({ relatedPage: page._id }, { $set: { isPageTrashed: true } });
     const body = `redirect ${newPath}`;
     const body = `redirect ${newPath}`;
     await Page.create(page.path, body, user, { redirectTo: newPath });
     await Page.create(page.path, body, user, { redirectTo: newPath });
 
 
@@ -642,6 +644,7 @@ class PageService {
 
 
   async revertDeletedPage(page, user, options = {}, isRecursively = false) {
   async revertDeletedPage(page, user, options = {}, isRecursively = false) {
     const Page = this.crowi.model('Page');
     const Page = this.crowi.model('Page');
+    const PageTagRelation = this.crowi.model('PageTagRelation');
     const Revision = this.crowi.model('Revision');
     const Revision = this.crowi.model('Revision');
 
 
     const newPath = Page.getRevertDeletedPageName(page.path);
     const newPath = Page.getRevertDeletedPageName(page.path);
@@ -668,6 +671,7 @@ class PageService {
         path: newPath, status: Page.STATUS_PUBLISHED, lastUpdateUser: user._id, deleteUser: null, deletedAt: null,
         path: newPath, status: Page.STATUS_PUBLISHED, lastUpdateUser: user._id, deleteUser: null, deletedAt: null,
       },
       },
     }, { new: true });
     }, { new: true });
+    await PageTagRelation.updateMany({ relatedPage: page._id }, { $set: { isPageTrashed: false } });
     await Revision.updateMany({ path: page.path }, { $set: { path: newPath } });
     await Revision.updateMany({ path: page.path }, { $set: { path: newPath } });
 
 
     return updatedPage;
     return updatedPage;