Przeglądaj źródła

refactor PageInfo and API

Yuki Takei 4 lat temu
rodzic
commit
41892a7bf8

+ 0 - 8
packages/app/src/interfaces/page-info.ts

@@ -1,8 +0,0 @@
-export type IPageInfo = {
-  sumOfLikers: number;
-  likerIds: string[];
-  seenUserIds: string[];
-  sumOfSeenUsers: number;
-  isSeen: boolean;
-  isLiked: boolean;
-};

+ 3 - 1
packages/app/src/interfaces/page.ts

@@ -41,7 +41,9 @@ export type IPageInfo = {
   likerIds: string[],
   sumOfSeenUsers: number,
   seenUserIds: string[],
-  isSeen?: boolean,
+  isDeletable: boolean,
+  isAbleToDeleteCompletely: boolean,
+  isBookmarked?: boolean,
   isLiked?: boolean,
 }
 

+ 26 - 11
packages/app/src/server/routes/apiv3/page.js

@@ -118,15 +118,11 @@ const ErrorV3 = require('../../models/vo/error-apiv3');
  *        description: PageInfo
  *        type: object
  *        required:
- *          - isSeen
  *          - sumOfLikers
  *          - likerIds
  *          - sumOfSeenUsers
  *          - seenUserIds
  *        properties:
- *          isSeen:
- *            type: boolean
- *            description: Whether the page has ever been seen
  *          isLiked:
  *            type: boolean
  *            description: Whether the page is liked by the logged in user
@@ -169,7 +165,7 @@ module.exports = (crowi) => {
 
   const globalNotificationService = crowi.getGlobalNotificationService();
   const socketIoService = crowi.socketIoService;
-  const { Page, GlobalNotificationSetting } = crowi.models;
+  const { Page, GlobalNotificationSetting, Bookmark } = crowi.models;
   const { pageService, exportService } = crowi;
 
   const validator = {
@@ -362,26 +358,45 @@ module.exports = (crowi) => {
    *            description: Internal server error.
    */
   router.get('/info', loginRequired, validator.info, apiV3FormValidator, async(req, res) => {
+    const { user } = req;
     const { pageId } = req.query;
 
     try {
-      const page = await Page.findById(pageId);
+      const page = await Page.findByIdAndViewer(pageId, user);
+
+      if (page == null) {
+        return res.apiv3Err(`Page '${pageId}' is not found or forbidden`);
+      }
 
-      const guestUserResponse = {
+      const bookmarkCount = await Bookmark.countByPageId(pageId);
+
+      const responseBodyForGuest = {
         sumOfLikers: page.liker.length,
         likerIds: page.liker.slice(0, 15),
         seenUserIds: page.seenUsers.slice(0, 15),
         sumOfSeenUsers: page.seenUsers.length,
-        isSeen: page.seenUsers.length > 0,
+        bookmarkCount,
+        isDeletable: Page.isDeletableName(page.path),
+        isAbleToDeleteCompletely: false,
       };
 
       const isGuestUser = !req.user;
       if (isGuestUser) {
-        return res.apiv3(guestUserResponse);
+        return res.apiv3(responseBodyForGuest);
       }
 
-      const userResponse = { ...guestUserResponse, isLiked: page.isLiked(req.user) };
-      return res.apiv3(userResponse);
+      const isBookmarked = await Bookmark.findByPageIdAndUserId(pageId, user._id);
+      const isLiked = page.isLiked(user);
+      const isAbleToDeleteCompletely = pageService.canDeleteCompletely(page.creator?._id, user);
+
+      const responseBody = {
+        ...responseBodyForGuest,
+        isAbleToDeleteCompletely,
+        isBookmarked,
+        isLiked,
+      };
+
+      return res.apiv3(responseBody);
     }
     catch (err) {
       logger.error('get-page-info', err);

+ 5 - 12
packages/app/src/stores/page.tsx

@@ -2,12 +2,11 @@ import useSWR, { SWRResponse } from 'swr';
 
 import { apiv3Get } from '~/client/util/apiv3-client';
 
-import { IPage, IPageHasId } from '~/interfaces/page';
+import { IPageInfo, IPageHasId } from '~/interfaces/page';
 import { IPagingResult } from '~/interfaces/paging-result';
 import { apiGet } from '../client/util/apiv1-client';
 
 import { IPageTagsInfo } from '../interfaces/pageTagsInfo';
-import { IPageInfo } from '../interfaces/page-info';
 import { useIsGuestUser } from './context';
 
 
@@ -49,16 +48,10 @@ export const useSWRxPageList = (
 };
 
 export const useSWRPageInfo = (pageId: string | null): SWRResponse<IPageInfo, Error> => {
-  return useSWR(pageId != null ? `/page/info?pageId=${pageId}` : null, endpoint => apiv3Get(endpoint).then((response) => {
-    return {
-      sumOfLikers: response.data.sumOfLikers,
-      likerIds: response.data.likerIds,
-      seenUserIds: response.data.seenUserIds,
-      sumOfSeenUsers: response.data.sumOfSeenUsers,
-      isSeen: response.data.isSeen,
-      isLiked: response.data?.isLiked,
-    };
-  }));
+  return useSWR(
+    pageId != null ? `/page/info?pageId=${pageId}` : null,
+    endpoint => apiv3Get<IPageInfo>(endpoint).then(response => response.data),
+  );
 };
 
 export const useSWRTagsInfo = (pageId: string | null | undefined): SWRResponse<IPageTagsInfo, Error> => {