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

support not found and forbidden by metadata

Yuki Takei 7 месяцев назад
Родитель
Сommit
9a26853899

+ 3 - 3
apps/app/src/server/routes/apiv3/page/index.ts

@@ -217,9 +217,9 @@ module.exports = (crowi) => {
       // not found or forbidden
       if (page == null && (pages == null || pages.length === 0)) {
         if (isIPageNotFoundInfo(meta) && meta.isForbidden) {
-          return res.apiv3Err('Page is forbidden', 403, meta);
+          return res.apiv3Err(new ErrorV3('Page is forbidden', 'page-not-found', undefined, meta), 403);
         }
-        return res.apiv3Err('Page is not found', 404, meta);
+        return res.apiv3Err(new ErrorV3('Page is not found', 'page-not-found', undefined, meta), 404);
       }
 
       if (page != null) {
@@ -231,7 +231,7 @@ module.exports = (crowi) => {
         }
         catch (err) {
           logger.error('populate-page-failed', err);
-          return res.apiv3Err(err, 500, meta);
+          return res.apiv3Err(new ErrorV3('Failed to populate page', 'populate-page-failed', undefined, { err, meta }), 500);
         }
       }
 

+ 4 - 2
apps/app/src/server/service/page/index.ts

@@ -425,11 +425,13 @@ class PageService implements IPageService {
     }
 
     if (page == null) {
+      const count = pageId != null ? await Page.count({ _id: pageId }) : await Page.count({ path });
+      const isForbidden = count > 0;
       return {
         data: null,
         meta: {
           isNotFound: true,
-          isForbidden: false,
+          isForbidden,
         },
       };
     }
@@ -438,7 +440,7 @@ class PageService implements IPageService {
       return {
         data: page,
         meta: {
-          isNotFound: false,
+          isNotFound: page.isEmpty,
           isV5Compatible: isTopPage(page.path) || page.parent != null,
           isEmpty: page.isEmpty,
           isMovable: false,

+ 20 - 7
apps/app/src/states/page/use-fetch-current-page.ts

@@ -1,7 +1,7 @@
-import type { IPagePopulatedToShowRevision } from '@growi/core';
+import { isIPageNotFoundInfo, type IPagePopulatedToShowRevision } from '@growi/core';
 import { isClient } from '@growi/core/dist/utils';
+import { isErrorV3 } from '@growi/core/dist/models';
 import {
-  isCreatablePage,
   isPermalink,
 } from '@growi/core/dist/utils/page-path-utils';
 import { removeHeadingSlash } from '@growi/core/dist/utils/path-utils';
@@ -14,11 +14,17 @@ import { apiv3Get } from '~/client/util/apiv3-client';
 import {
   currentPageDataAtom,
   currentPageIdAtom,
+  isForbiddenAtom,
   pageErrorAtom,
   pageLoadingAtom,
   pageNotFoundAtom,
   shareLinkIdAtom,
 } from './internal-atoms';
+import loggerFactory from '~/utils/logger';
+
+
+const logger = loggerFactory('growi:states:page:useFetchCurrentPage');
+
 
 type FetchPageArgs = {
   path?: string;
@@ -139,11 +145,18 @@ export const useFetchCurrentPage = (): {
 
           return newData;
         } catch (err) {
-          set(pageErrorAtom, err as Error);
-
-          const apiError = err as any; // eslint-disable-line @typescript-eslint/no-explicit-any
-          if (apiError.response?.status === 404) {
-            set(pageNotFoundAtom, true);
+          if (Array.isArray(err) && err.length > 0 && isErrorV3(err[0])) {
+            const error = err[0];
+            set(pageErrorAtom, error);
+
+            if (isIPageNotFoundInfo(error.args)) {
+              set(pageNotFoundAtom, true);
+              set(isForbiddenAtom, error.args.isForbidden ?? false);
+              set(currentPageDataAtom, undefined);
+            }
+          }
+          else {
+            logger.error('Unhandled error when fetching current page:', err);
           }
         } finally {
           set(pageLoadingAtom, false);