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

Incrementing the seen count in server-side-props.ts

Shun Miyazawa 3 месяцев назад
Родитель
Сommit
2e09157ddf

+ 11 - 20
apps/app/src/pages/[[...path]]/page-data-props.ts

@@ -15,7 +15,7 @@ import assert from 'assert';
 import type { HydratedDocument, model } from 'mongoose';
 
 import type { CrowiRequest } from '~/interfaces/crowi-request';
-import type { PageModel } from '~/server/models/page';
+import type { PageDocument, PageModel } from '~/server/models/page';
 import type {
   IPageRedirect,
   PageRedirectModel,
@@ -193,11 +193,6 @@ export async function getPageDataForInitial(
       };
     }
 
-    // Add user to seen users
-    if (user != null) {
-      await page.seen(user);
-    }
-
     // Handle existing page with valid meta that is not IPageNotFoundInfo
     page.initLatestRevisionField(revisionId);
     const ssrMaxRevisionBodyLength = configManager.getConfig(
@@ -250,15 +245,13 @@ export async function getPageDataForInitial(
 // Page data retrieval for same-route navigation
 export async function getPageDataForSameRoute(
   context: GetServerSidePropsContext,
-): Promise<
-  GetServerSidePropsResult<
-    Pick<CommonEachProps, 'currentPathname'> &
-      Pick<
-        EachProps,
-        'currentPathname' | 'isIdenticalPathPage' | 'redirectFrom'
-      >
-  >
-> {
+): Promise<{
+  props: Pick<CommonEachProps, 'currentPathname'> &
+    Pick<EachProps, 'currentPathname' | 'isIdenticalPathPage' | 'redirectFrom'>;
+  internalProps?: {
+    basicPageInfo: PageDocument | null;
+  };
+}> {
   const req: CrowiRequest = context.req as CrowiRequest;
   const { user } = req;
 
@@ -286,11 +279,6 @@ export async function getPageDataForSameRoute(
     isPermalink ? { _id: pageId } : { path: resolvedPagePath },
   ).exec();
 
-  // Add user to seen users
-  if (user != null) {
-    await basicPageInfo?.seen(user);
-  }
-
   const currentPathname = resolveFinalizedPathname(
     resolvedPagePath,
     basicPageInfo,
@@ -303,5 +291,8 @@ export async function getPageDataForSameRoute(
       isIdenticalPathPage: false,
       redirectFrom,
     },
+    internalProps: {
+      basicPageInfo,
+    },
   };
 }

+ 34 - 2
apps/app/src/pages/[[...path]]/server-side-props.ts

@@ -1,4 +1,9 @@
 import type { GetServerSidePropsContext, GetServerSidePropsResult } from 'next';
+import type { IUser } from '@growi/core';
+import type { HydratedDocument } from 'mongoose';
+
+import type { CrowiRequest } from '~/interfaces/crowi-request';
+import type { PageDocument } from '~/server/models/page';
 
 import { getServerSideBasicLayoutProps } from '../basic-layout-page';
 import {
@@ -26,6 +31,19 @@ const nextjsRoutingProps = {
   },
 };
 
+/**
+ * Add user to page's seen users list
+ */
+function addSeenUser(
+  page: PageDocument | null | undefined,
+  user: HydratedDocument<IUser> | undefined,
+): void {
+  if (page != null && user != null) {
+    // addSeenUser is executed asynchronously and increments the view count in real-time via Socket.io
+    page.seen(user);
+  }
+}
+
 export async function getServerSidePropsForInitial(
   context: GetServerSidePropsContext,
 ): Promise<GetServerSidePropsResult<Stage2InitialProps>> {
@@ -75,6 +93,12 @@ export async function getServerSidePropsForInitial(
     throw new Error('Invalid merged props structure');
   }
 
+  // Add user to seen users
+  const req = context.req as CrowiRequest;
+  const { user } = req;
+  const pageData = mergedProps.pageWithMeta?.data;
+  addSeenUser(pageData, user);
+
   // -- TODO: persist activity
   // await addActivity(context, getActivityAction(mergedProps));
   return mergedResult;
@@ -85,16 +109,24 @@ export async function getServerSidePropsForSameRoute(
 ): Promise<GetServerSidePropsResult<Stage2EachProps>> {
   // -- TODO: :https://redmine.weseek.co.jp/issues/174725
   // Remove getServerSideI18nProps from getServerSidePropsForSameRoute for performance improvement
-  const [i18nPropsResult, pageDataResult] = await Promise.all([
+  const [i18nPropsResult, pageDataForSameRouteResult] = await Promise.all([
     getServerSideI18nProps(context, ['translation']),
     getPageDataForSameRoute(context),
   ]);
 
+  const { props: pageDataProps, internalProps } = pageDataForSameRouteResult;
+  const pageData = internalProps?.basicPageInfo;
+
+  // Add user to seen users
+  const req = context.req as CrowiRequest;
+  const { user } = req;
+  addSeenUser(pageData, user);
+
   // -- TODO: persist activity
   // const mergedProps = await mergedResult.props;
   // await addActivity(context, getActivityAction(mergedProps));
   const mergedResult = mergeGetServerSidePropsResults(
-    pageDataResult,
+    { props: pageDataProps },
     i18nPropsResult,
   );