itizawa 6 lat temu
rodzic
commit
e37471d9e9

+ 5 - 17
src/client/js/components/LikeButton.jsx

@@ -20,24 +20,12 @@ class LikeButton extends React.Component {
   async handleClick() {
   async handleClick() {
     const { appContainer, pageId } = this.props;
     const { appContainer, pageId } = this.props;
     const { isLiked } = this.state;
     const { isLiked } = this.state;
-
-    if (!isLiked) {
-      try {
-        await appContainer.apiPost('/likes.add', { page_id: pageId });
-        this.setState({ isLiked: true });
-      }
-      catch (err) {
-        toastError(err);
-      }
+    try {
+      await appContainer.apiv3.put('/page/likes', { pageId, isLiked });
+      this.setState({ isLiked: !isLiked });
     }
     }
-    else {
-      try {
-        await appContainer.apiPost('/likes.remove', { page_id: pageId });
-        this.setState({ isLiked: false });
-      }
-      catch (err) {
-        toastError(err);
-      }
+    catch (err) {
+      toastError(err);
     }
     }
   }
   }
 
 

+ 1 - 1
src/client/js/components/Navbar/GrowiSubNavigation.jsx

@@ -48,7 +48,7 @@ const GrowiSubNavigation = (props) => {
 
 
       {/* Header Button */}
       {/* Header Button */}
       <div className="mr-2">
       <div className="mr-2">
-        <LikeButton pageId={pageId} />
+        <LikeButton pageId={pageId} isLiked={pageContainer.state.isLiked} />
       </div>
       </div>
       <div>
       <div>
         <BookmarkButton pageId={pageId} crowi={appContainer} />
         <BookmarkButton pageId={pageId} crowi={appContainer} />

+ 1 - 1
src/client/js/services/PageContainer.js

@@ -41,7 +41,7 @@ export default class PageContainer extends Container {
       revisionAuthor: JSON.parse(mainContent.getAttribute('data-page-revision-author')),
       revisionAuthor: JSON.parse(mainContent.getAttribute('data-page-revision-author')),
       path: mainContent.getAttribute('data-path'),
       path: mainContent.getAttribute('data-path'),
       tocHtml: '',
       tocHtml: '',
-      isLiked: mainContent.getAttribute('data-page-is-liked'),
+      isLiked: JSON.parse(mainContent.getAttribute('data-page-is-liked')),
       seenUserIds: [],
       seenUserIds: [],
       likerUserIds: [],
       likerUserIds: [],
       createdAt: mainContent.getAttribute('data-page-created-at'),
       createdAt: mainContent.getAttribute('data-page-created-at'),

+ 1 - 1
src/server/models/page.js

@@ -372,7 +372,7 @@ module.exports = function(crowi) {
         });
         });
       }
       }
       else {
       else {
-        this.logger.warn('liker not updated');
+        debug('liker not updated');
         return reject(self);
         return reject(self);
       }
       }
     }));
     }));

+ 2 - 2
src/server/routes/apiv3/index.js

@@ -18,9 +18,7 @@ module.exports = (crowi) => {
   router.use('/markdown-setting', require('./markdown-setting')(crowi));
   router.use('/markdown-setting', require('./markdown-setting')(crowi));
   router.use('/app-settings', require('./app-settings')(crowi));
   router.use('/app-settings', require('./app-settings')(crowi));
   router.use('/customize-setting', require('./customize-setting')(crowi));
   router.use('/customize-setting', require('./customize-setting')(crowi));
-
   router.use('/notification-setting', require('./notification-setting')(crowi));
   router.use('/notification-setting', require('./notification-setting')(crowi));
-
   router.use('/users', require('./users')(crowi));
   router.use('/users', require('./users')(crowi));
   router.use('/user-groups', require('./user-group')(crowi));
   router.use('/user-groups', require('./user-group')(crowi));
   router.use('/export', require('./export')(crowi));
   router.use('/export', require('./export')(crowi));
@@ -39,5 +37,7 @@ module.exports = (crowi) => {
 
 
   router.use('/search', require('./search')(crowi));
   router.use('/search', require('./search')(crowi));
 
 
+  router.use('/page', require('./page')(crowi));
+
   return router;
   return router;
 };
 };

+ 62 - 0
src/server/routes/apiv3/page.js

@@ -0,0 +1,62 @@
+const loggerFactory = require('@alias/logger');
+
+const logger = loggerFactory('growi:routes:apiv3:page'); // eslint-disable-line no-unused-vars
+
+const express = require('express');
+// const { body } = require('express-validator');
+
+const router = express.Router();
+
+// const ErrorV3 = require('../../models/vo/error-apiv3');
+
+/**
+ * @swagger
+ *  tags:
+ *    name: Page
+ */
+module.exports = (crowi) => {
+  const accessTokenParser = require('../../middleware/access-token-parser')(crowi);
+  const loginRequired = require('../../middleware/login-required')(crowi);
+  const csrf = require('../../middleware/csrf')(crowi);
+
+  const globalNotificationService = crowi.getGlobalNotificationService();
+  const { Page, GlobalNotificationSetting } = crowi.models;
+  // const { ApiV3FormValidator } = crowi.middlewares;
+
+  // TODO swagger
+  router.put('/likes', accessTokenParser, loginRequired, csrf, async(req, res) => {
+    const { pageId, isLiked } = req.body;
+
+    let page;
+    try {
+      page = await Page.findByIdAndViewer(pageId, req.user);
+      if (page == null) {
+        return res.apiv3Err(`Page '${pageId}' is not found or forbidden`);
+      }
+      if (isLiked) {
+        page = await page.unlike(req.user);
+      }
+      else {
+        page = await page.like(req.user);
+      }
+    }
+    catch (err) {
+      logger.error('update-like-failed', err);
+      return res.apiv3Err(err, 500);
+    }
+
+    try {
+      // global notification
+      await globalNotificationService.fire(GlobalNotificationSetting.EVENT.PAGE_LIKE, page, req.user);
+    }
+    catch (err) {
+      logger.error('Like notification failed', err);
+    }
+
+    const result = { page };
+    result.seenUser = page.seenUsers;
+    return res.apiv3({ result });
+  });
+
+  return router;
+};