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

Merge pull request #864 from weseek/feat/control-tag-model

Feat/control tag model
Yuki Takei 7 лет назад
Родитель
Сommit
4f932ffc07
3 измененных файлов с 36 добавлено и 67 удалено
  1. 7 0
      src/server/models/page-tag-relation.js
  2. 20 65
      src/server/models/page.js
  3. 9 2
      src/server/models/tag.js

+ 7 - 0
src/server/models/page-tag-relation.js

@@ -30,6 +30,13 @@ schema.plugin(mongoosePaginate);
  * @class PageTagRelation
  */
 class PageTagRelation {
+
+  static async createIfNotExist(pageId, tagId) {
+    if (!await this.findOne({ relatedPage: pageId, relatedTag: tagId })) {
+      this.create({ relatedPage: pageId, relatedTag: tagId });
+    }
+  }
+
 }
 
 module.exports = function() {

+ 20 - 65
src/server/models/page.js

@@ -301,71 +301,26 @@ module.exports = function(crowi) {
     return false;
   };
 
-  pageSchema.methods.updateTags = async function(newTagsName) {
-    // const page = this;
-    // const PageTagRelation = mongoose.model('PageTagRelation');
-    // const Tag = mongoose.model('Tag');
-
-    // const newTagNameList = [newTagsName]; // [TODO] listing requested Tags on client side
-
-    // // get tags relate this page
-    // const relations = await PageTagRelation.find({relatedPage: page._id}).populate('relatedTag').select('-_id relatedTag');
-    // console.log(relations);
-    // // relations.populate(...)
-    // // const relatedTagNameList = await Promise.all(relations.map(async function(relation) {
-    // //   const relatedTag =  await Tag.findOne({_id: relation.relatedTag});
-    // //   return relatedTag.name;
-    // // }));
-
-    // const relatedTags = ...;
-
-    // // creat unlinked tag list
-    // // TODO use filter and includes
-    // const unlinkedTagNameList = [];
-    // relatedTagNameList.map(function(relatedTagName) {
-    //   if (!newTagNameList.includes(relatedTagName)) {
-    //     return relatedTagName;
-    //   }
-    // });
-
-    // relatedTagTags.forEach(tag => {
-    //   // await つかえないかも
-    //   await tag.remove();
-    // })
-    // // unlinked page-tag-relations
-    // // unlinkedTagNameList.map(function(tagName) {
-    // //   Tag.findOne({name: tagName}, function(err, tag) {
-    // //     PageTagRelation.remove({relatedPage: page._id, relatedTag: tag._id}, function(err, relation) {
-    // //       if (err) {
-    // //         throw new Error(err);
-    // //       }
-    // //       debug('remove tag relation: ', tag.name);
-    // //     });
-    // //   });
-    // // });
-
-    // // creat set tag list
-    // const setTagNameList = [];
-    // newTagNameList.map(function(newTagName) {
-    //   if (!relatedTagNameList.includes(newTagName)) {
-    //     setTagNameList.push(newTagName);
-    //   }
-    // });
-    // // set tags
-    // setTagNameList.map((tagName) => {
-    //   Tag.findOne({name: tagName}, async function(err, tag) {
-    //     if (tag == null) {
-    //       tag = await Tag.create({name: tagName});
-    //     }
-    //     // make a relation
-    //     PageTagRelation.create({relatedPage: page._id, relatedTag: tag._id}, function(err, relation) {
-    //       if (err) {
-    //         throw new Error(err);
-    //       }
-    //       debug('tag linked this page: ', tag.name);
-    //     });
-    //   });
-    // });
+  pageSchema.methods.updateTags = async function(newTags) {
+    const page = this;
+    const PageTagRelation = mongoose.model('PageTagRelation');
+    const Tag = mongoose.model('Tag');
+
+    // get tags relate this page
+    const relatedTags = await PageTagRelation.find({ relatedPage: page._id }).populate('relatedTag').select('-_id relatedTag');
+
+    // unlink relations
+    const unlinkTagRelations = relatedTags.filter((tag) => { return !newTags.includes(tag.relatedTag.name) });
+    await PageTagRelation.deleteMany({
+      relatedPage: page._id,
+      relatedTag: { $in: unlinkTagRelations.map((relation) => { return relation.relatedTag._id }) },
+    });
+
+    // create tag and relations
+    newTags.forEach(async(tag) => {
+      const setTag = await Tag.findOrCreate(tag);
+      PageTagRelation.createIfNotExist(page._id, setTag._id);
+    });
   };
 
 

+ 9 - 2
src/server/models/tag.js

@@ -21,8 +21,15 @@ schema.plugin(mongoosePaginate);
  * @class Tag
  */
 class Tag {
-  // async findOrCreate(tagName) {
-  // }
+
+  static async findOrCreate(tagName) {
+    const tag = await this.findOne({ name: tagName });
+    if (!tag) {
+      return await this.create({ name: tagName });
+    }
+    return tag;
+  }
+
 }
 
 module.exports = function() {