Browse Source

update page-tag-relations with setTagList

yusuketk 7 years ago
parent
commit
3817e439e9
3 changed files with 46 additions and 54 deletions
  1. 4 4
      src/server/models/page-tag-relation.js
  2. 6 6
      src/server/models/tag.js
  3. 36 44
      src/server/routes/page.js

+ 4 - 4
src/server/models/page-tag-relation.js

@@ -92,16 +92,16 @@ class PageTagRelation {
    *
    * @static
    * @param {page} page
-   * @returns {Tag[]}
+   * @returns {ObjectId}
    * @memberof PageTagRelation
    */
-  static findAllTagForPage(page) {
+  static findAllTagIdForPage(page) {
     return new Promise((resolve, reject) => {
-      this.find({relatedPage: page._id}, function(err, tags) {
+      this.find({relatedPage: page._id}, function(err, relations) {
         if (err) {
           reject(err);
         }
-        resolve(tags);
+        resolve(relations.map(rel => rel.relatedTag));
       });
     });
   }

+ 6 - 6
src/server/models/tag.js

@@ -46,20 +46,20 @@ module.exports = function (crowi) {
     });
   };
 
-  /**
-   * get a tag by Id (findById promise wrapper)
-   */
+  // get a tag by id (Promise wrpper)
   tagSchema.statics.getOneById = function(id) {
     return new Promise((resolve, reject) => {
-      resolve('hoge');
-      this.findById(id, function(err, tag) {
+      this.find({
+        _id: id
+      }, function(err, tags) {
         if (err) {
           reject(err);
         }
-        resolve(tag);
+        resolve(tags[0]);
       });
     });
   };
+
 //   commentSchema.statics.getCommentsByPageId = function (id) {
 //     var self = this;
 

+ 36 - 44
src/server/routes/page.js

@@ -108,56 +108,48 @@ module.exports = function(crowi, app) {
   }
 
   async function updateTags(page, user, newTags, updateOrCreate, previousRevision) {
-    // if (pageTags == null) {
-    //   Tag.removeTagById(tag.id);
-    // }
-    const tagList = [newTags]; // クライアント側でリスト化後、消去予定
-    const relations = await PageTagRelation.findAllTagForPage(page);
-
-    let newTagList;
-    if (relations) {
-      console.log(relations);
-      newTagList = await shaveTagList(relations, tagList);
-    }
-    if (newTagList) {
-      newTagList.map((newTag) => {
-        Tag.find({name: newTag}, async function(err, tag) {
-          let settingTag;
-          if (tag.length == 0) {
-            settingTag = await Tag.createTag(newTag);
+    const setTagList = ['On-On', 'Off-On']; // クライアント側でリスト化後、消去予定
+    const relatedTagIdList = await PageTagRelation.findAllTagIdForPage(page);
+    if (relatedTagIdList.length > 0) {
+      Promise.all(relatedTagIdList.map(async id => {
+        return await Tag.getOneById(id);
+      })
+      ).then(tags => {
+        const relatedTagList = tags.map(relatedTag => {
+          if (!setTagList.includes(relatedTag.name)) {
+            PageTagRelation.removeByTagId(relatedTag._id);
+            return;
           }
           else {
-            settingTag = tag[0];
+            return relatedTag.name;
           }
-          // Relation を作成
-          PageTagRelation.createRelation(page, settingTag);
         });
-      });
-    }
-  }
-
-  // 既存のタグを新規タグリストから削除、および外されるタグの削除
-  async function shaveTagList(relations, tagList) {
-    relations.map((relation) => {
-      const tagId = relation.relatedTag;
-      Tag.findById(tagId, async function(err, tag) {
-        if (tagList.indexOf(tag.name) >= 0) {
-          tagList = await tagListFilter(tagList, tag.name);
-        }
-        else {
-          PageTagRelation.removeByTagId(tag._id);
-          // 不要なタグ削除も走らせる
+        const newTagList = setTagList.map(setTag => {
+          if (!relatedTagList.includes(setTag)) {
+            return setTag;
+          }
+        });
+        if (newTagList.length > 0) {
+          newTagList.map((newTag) => {
+            if (newTag) {
+              Tag.find({
+                name: newTag
+              }, async function(err, tag) {
+                let settingTag;
+                if (tag.length == 0) {
+                  settingTag = await Tag.createTag(newTag);
+                }
+                else {
+                  settingTag = tag[0];
+                }
+                // Relation を作成
+                PageTagRelation.createRelation(page, settingTag);
+              });
+            }
+          });
         }
       });
-      console.log(tagList);
-    });
-  }
-
-  // array.filter promise wrapper
-  function tagListFilter(list, tag) {
-    return new Promise((resolve, reject) => {
-      resolve(list.filter(relatedTag => relatedTag !== tag));
-    });
+    }
   }
 
   function addRendarVarsForPage(renderVars, page) {