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

Merge pull request #4790 from weseek/fix/82069-82909-fix-error-about-recent-change-component-when-delete-tag-by-db

fix: fix shown exception on browser when tag document is deleted from data…
Yuki Takei 4 лет назад
Родитель
Сommit
e93eb0a4b0

+ 10 - 7
packages/app/src/components/Sidebar/RecentChanges.jsx

@@ -57,13 +57,16 @@ function LargePageItem({ page }) {
   }
   }
 
 
   const tags = page.tags;
   const tags = page.tags;
-  const tagElements = tags.map((tag) => {
-    return (
-      <a key={tag.name} href={`/_search?q=tag:${tag.name}`} className="grw-tag-label badge badge-secondary mr-2 small">
-        {tag.name}
-      </a>
-    );
-  });
+  // when tag document is deleted from database directly tags includes null
+  const tagElements = tags.includes(null)
+    ? <></>
+    : tags.map((tag) => {
+      return (
+        <a key={tag.name} href={`/_search?q=tag:${tag.name}`} className="grw-tag-label badge badge-secondary mr-2 small">
+          {tag.name}
+        </a>
+      );
+    });
 
 
   return (
   return (
     <li className="list-group-item py-3 px-0">
     <li className="list-group-item py-3 px-0">

+ 20 - 13
packages/app/src/server/models/page-tag-relation.js

@@ -70,9 +70,10 @@ class PageTagRelation {
     return { data: tags, totalCount };
     return { data: tags, totalCount };
   }
   }
 
 
-  static async findByPageId(pageId) {
-    const relations = await this.find({ relatedPage: pageId }).populate('relatedTag').select('-_id relatedTag');
-    return relations.filter((relation) => { return relation.relatedTag !== null });
+  static async findByPageId(pageId, options = {}) {
+    const isAcceptRelatedTagNull = options.nullable || null;
+    const relations = await this.find({ relatedPage: pageId }).populate('relatedTag').select('relatedTag');
+    return isAcceptRelatedTagNull ? relations : relations.filter((relation) => { return relation.relatedTag !== null });
   }
   }
 
 
   static async listTagNamesByPage(pageId) {
   static async listTagNamesByPage(pageId) {
@@ -138,17 +139,23 @@ class PageTagRelation {
     const Tag = mongoose.model('Tag');
     const Tag = mongoose.model('Tag');
 
 
     // get relations for this page
     // get relations for this page
-    const relations = await this.findByPageId(pageId);
-
-    // unlink relations
-    const unlinkTagRelations = relations.filter((relation) => { return !tags.includes(relation.relatedTag.name) });
-    const bulkDeletePromise = this.deleteMany({
-      relatedPage: pageId,
-      relatedTag: { $in: unlinkTagRelations.map((relation) => { return relation.relatedTag._id }) },
+    const relations = await this.findByPageId(pageId, { nullable: true });
+
+    const unlinkTagRelationIds = [];
+    const relatedTagNames = [];
+
+    relations.forEach((relation) => {
+      if (relation.relatedTag == null) {
+        unlinkTagRelationIds.push(relation._id);
+      }
+      else {
+        relatedTagNames.push(relation.relatedTag.name);
+        if (!tags.includes(relation.relatedTag.name)) {
+          unlinkTagRelationIds.push(relation._id);
+        }
+      }
     });
     });
-
-    // filter tags to create
-    const relatedTagNames = relations.map((relation) => { return relation.relatedTag.name });
+    const bulkDeletePromise = this.deleteMany({ _id: { $in: unlinkTagRelationIds } });
     // find or create tags
     // find or create tags
     const tagsToCreate = tags.filter((tag) => { return !relatedTagNames.includes(tag) });
     const tagsToCreate = tags.filter((tag) => { return !relatedTagNames.includes(tag) });
     const tagEntities = await Tag.findOrCreateMany(tagsToCreate);
     const tagEntities = await Tag.findOrCreateMany(tagsToCreate);