Yuki Takei 6 лет назад
Родитель
Сommit
f18a8cc787

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

@@ -53,6 +53,36 @@ class PageTagRelation {
     return { list, totalCount };
   }
 
+  static async listTagsByPage(pageId) {
+    return this.find({ relatedPage: pageId }).populate('relatedTag').select('-_id relatedTag');
+  }
+
+  static async listTagNamesByPage(pageId) {
+    const tags = await this.listTagsByPage(pageId);
+    return tags.map((tag) => { return tag.relatedTag.name });
+  }
+
+  static async updatePageTags(pageId, tags) {
+    const Tag = mongoose.model('Tag');
+
+    // get tags relate this page
+    const relatedTags = await this.listTagsByPage(pageId);
+
+    // unlink relations
+    const unlinkTagRelations = relatedTags.filter((tag) => { return !tags.includes(tag.relatedTag.name) });
+    await this.deleteMany({
+      relatedPage: pageId,
+      relatedTag: { $in: unlinkTagRelations.map((relation) => { return relation.relatedTag._id }) },
+    });
+
+    // create tag and relations
+    /* eslint-disable no-await-in-loop */
+    for (const tag of tags) {
+      const setTag = await Tag.findOrCreate(tag);
+      await this.createIfNotExist(pageId, setTag._id);
+    }
+  }
+
 }
 
 module.exports = function() {

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

@@ -310,30 +310,6 @@ module.exports = function(crowi) {
     return false;
   };
 
-  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
-    /* eslint-disable no-await-in-loop */
-    for (const tag of newTags) {
-      const setTag = await Tag.findOrCreate(tag);
-      await PageTagRelation.createIfNotExist(page._id, setTag._id);
-    }
-  };
-
-
   pageSchema.methods.isPortal = function() {
     return isPortalPath(this.path);
   };
@@ -993,7 +969,6 @@ module.exports = function(crowi) {
     const redirectTo = options.redirectTo || null;
     const grantUserGroupId = options.grantUserGroupId || null;
     const socketClientId = options.socketClientId || null;
-    const pageTags = options.pageTags || null;
 
     // sanitize path
     path = crowi.xss.process(path); // eslint-disable-line no-param-reassign
@@ -1027,10 +1002,6 @@ module.exports = function(crowi) {
       .populate('revision')
       .populate('creator');
 
-    if (pageTags != null) {
-      await page.updateTags(pageTags);
-    }
-
     if (socketClientId != null) {
       pageEvent.emit('create', savedPage, user, socketClientId);
     }
@@ -1045,7 +1016,6 @@ module.exports = function(crowi) {
     const grantUserGroupId = options.grantUserGroupId || null;
     const isSyncRevisionToHackmd = options.isSyncRevisionToHackmd;
     const socketClientId = options.socketClientId || null;
-    const pageTags = options.pageTags || null;
 
     await validateAppliedScope(user, grant, grantUserGroupId);
     pageData.applyScope(user, grant, grantUserGroupId);
@@ -1062,10 +1032,6 @@ module.exports = function(crowi) {
       savedPage = await this.syncRevisionToHackmd(savedPage);
     }
 
-    if (pageTags != null) {
-      await savedPage.updateTags(pageTags);
-    }
-
     if (socketClientId != null) {
       pageEvent.emit('update', savedPage, user, socketClientId);
     }

+ 16 - 5
src/server/routes/page.js

@@ -572,7 +572,13 @@ module.exports = function(crowi, app) {
     };
     const createdPage = await Page.create(pagePath, body, req.user, options);
 
-    const result = { page: serializeToObj(createdPage) };
+    let savedTags;
+    if (pageTags != null) {
+      await PageTagRelation.updatePageTags(createdPage.id, pageTags);
+      savedTags = await PageTagRelation.listTagNamesByPage(createdPage.id);
+    }
+
+    const result = { page: serializeToObj(createdPage), tags: savedTags };
     result.page.lastUpdateUser = User.filterToPublicFields(createdPage.lastUpdateUser);
     result.page.creator = User.filterToPublicFields(createdPage.creator);
     res.json(ApiResponse.success(result));
@@ -639,7 +645,7 @@ module.exports = function(crowi, app) {
       return res.json(ApiResponse.error('Posted param "revisionId" is outdated.', 'outdated'));
     }
 
-    const options = { isSyncRevisionToHackmd, socketClientId, pageTags };
+    const options = { isSyncRevisionToHackmd, socketClientId };
     if (grant != null) {
       options.grant = grant;
     }
@@ -657,7 +663,13 @@ module.exports = function(crowi, app) {
       return res.json(ApiResponse.error(err));
     }
 
-    const result = { page: serializeToObj(page) };
+    let savedTags;
+    if (pageTags != null) {
+      await PageTagRelation.updatePageTags(pageId, pageTags);
+      savedTags = await PageTagRelation.listTagNamesByPage(pageId);
+    }
+
+    const result = { page: serializeToObj(page), tags: savedTags };
     result.page.lastUpdateUser = User.filterToPublicFields(page.lastUpdateUser);
     res.json(ApiResponse.success(result));
 
@@ -758,8 +770,7 @@ module.exports = function(crowi, app) {
   api.getPageTag = async function(req, res) {
     const result = {};
     try {
-      const tags = await PageTagRelation.find({ relatedPage: req.query.pageId }).populate('relatedTag').select('-_id relatedTag');
-      result.tags = tags.map((tag) => { return tag.relatedTag.name });
+      result.tags = await PageTagRelation.listTagNamesByPage(req.query.pageId);
     }
     catch (err) {
       return res.json(ApiResponse.error(err));

+ 6 - 2
src/server/routes/tag.js

@@ -35,20 +35,24 @@ module.exports = function(crowi, app) {
    */
   api.update = async function(req, res) {
     const Page = crowi.model('Page');
+    const PageTagRelation = crowi.model('PageTagRelation');
     const tagEvent = crowi.event('tag');
     const pageId = req.body.pageId;
     const tags = req.body.tags;
 
+    const result = {};
     try {
+      // TODO GC-1921 consider permission
       const page = await Page.findById(pageId);
-      await page.updateTags(tags);
+      await PageTagRelation.updatePageTags(pageId, tags);
+      result.tags = await PageTagRelation.listTagNamesByPage(pageId);
 
       tagEvent.emit('update', page, tags);
     }
     catch (err) {
       return res.json(ApiResponse.error(err));
     }
-    return res.json(ApiResponse.success());
+    return res.json(ApiResponse.success(result));
   };
 
   /**