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

Integrate revision source and data comparison logic

Shun Miyazawa 1 год назад
Родитель
Сommit
6d017da1ca

+ 1 - 1
apps/app/src/pages/[[...path]].page.tsx

@@ -500,7 +500,7 @@ async function injectRoutingInformation(context: GetServerSidePropsContext, prop
     }
     }
 
 
     if (!props.skipSSR) {
     if (!props.skipSSR) {
-      props.yjsData = crowi.pageService.getYjsData(page._id, props.pageWithMeta?.data.revision?.body);
+      props.yjsData = await crowi.pageService.getYjsData(page._id);
     }
     }
   }
   }
 }
 }

+ 1 - 16
apps/app/src/server/routes/apiv3/page/get-yjs-data.ts

@@ -1,12 +1,8 @@
-import type { IPage } from '@growi/core';
-import { ErrorV3 } from '@growi/core/dist/models';
 import type { Request, RequestHandler } from 'express';
 import type { Request, RequestHandler } from 'express';
 import type { ValidationChain } from 'express-validator';
 import type { ValidationChain } from 'express-validator';
 import { param } from 'express-validator';
 import { param } from 'express-validator';
-import mongoose from 'mongoose';
 
 
 import type Crowi from '~/server/crowi';
 import type Crowi from '~/server/crowi';
-import type { PageModel } from '~/server/models/page';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
 import { apiV3FormValidator } from '../../../middlewares/apiv3-form-validator';
 import { apiV3FormValidator } from '../../../middlewares/apiv3-form-validator';
@@ -18,8 +14,6 @@ const logger = loggerFactory('growi:routes:apiv3:page:get-yjs-data');
 type GetYjsDataHandlerFactory = (crowi: Crowi) => RequestHandler[];
 type GetYjsDataHandlerFactory = (crowi: Crowi) => RequestHandler[];
 
 
 export const getYjsDataHandlerFactory: GetYjsDataHandlerFactory = (crowi) => {
 export const getYjsDataHandlerFactory: GetYjsDataHandlerFactory = (crowi) => {
-  const Page = mongoose.model<IPage, PageModel>('Page');
-
   const accessTokenParser = require('../../../middlewares/access-token-parser')(crowi);
   const accessTokenParser = require('../../../middlewares/access-token-parser')(crowi);
   const loginRequiredStrictly = require('../../../middlewares/login-required')(crowi);
   const loginRequiredStrictly = require('../../../middlewares/login-required')(crowi);
 
 
@@ -35,16 +29,7 @@ export const getYjsDataHandlerFactory: GetYjsDataHandlerFactory = (crowi) => {
       const { pageId } = req.params;
       const { pageId } = req.params;
 
 
       try {
       try {
-        const page = await Page.findOne({ _id: pageId });
-
-        if (page == null) {
-          return res.apiv3Err(new ErrorV3(`Page ${pageId} is not exist.`), 404);
-        }
-
-        const populatedPage = await page.populateDataToShowRevision();
-        const revisionBody = populatedPage.revision.body;
-        const yjsData = crowi.pageService.getYjsData(pageId, revisionBody);
-
+        const yjsData = await crowi.pageService.getYjsData(pageId);
         return res.apiv3({ yjsData });
         return res.apiv3({ yjsData });
       }
       }
       catch (err) {
       catch (err) {

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

@@ -4449,13 +4449,14 @@ class PageService implements IPageService {
     });
     });
   }
   }
 
 
-  getYjsData(pageId: string, revisionBody?: string): CurrentPageYjsData {
+  async getYjsData(pageId: string): Promise<CurrentPageYjsData> {
     const yjsConnectionManager = getYjsConnectionManager();
     const yjsConnectionManager = getYjsConnectionManager();
     const currentYdoc = yjsConnectionManager.getCurrentYdoc(pageId);
     const currentYdoc = yjsConnectionManager.getCurrentYdoc(pageId);
     const yjsDraft = currentYdoc?.getText('codemirror').toString();
     const yjsDraft = currentYdoc?.getText('codemirror').toString();
+    const hasRevisionBodyDiff = await this.hasRevisionBodyDiff(pageId, yjsDraft);
 
 
     return {
     return {
-      hasRevisionBodyDiff: yjsDraft != null && revisionBody != null && yjsDraft !== revisionBody,
+      hasRevisionBodyDiff,
       awarenessStateSize: currentYdoc?.awareness.states.size,
       awarenessStateSize: currentYdoc?.awareness.states.size,
     };
     };
   }
   }
@@ -4465,7 +4466,7 @@ class PageService implements IPageService {
       return false;
       return false;
     }
     }
 
 
-    const Revision = mongoose.model('Revision') as any;
+    const Revision = mongoose.model('Revision');
     const revision = await Revision.findOne({ pageId }).sort({ createdAt: -1 });
     const revision = await Revision.findOne({ pageId }).sort({ createdAt: -1 });
 
 
     if (revision == null) {
     if (revision == null) {

+ 1 - 1
apps/app/src/server/service/page/page-service.ts

@@ -31,5 +31,5 @@ export interface IPageService {
   canDeleteCompletelyAsMultiGroupGrantedPage(
   canDeleteCompletelyAsMultiGroupGrantedPage(
     page: PageDocument, creatorId: ObjectIdLike | null, operator: any | null, userRelatedGroups: PopulatedGrantedGroup[]
     page: PageDocument, creatorId: ObjectIdLike | null, operator: any | null, userRelatedGroups: PopulatedGrantedGroup[]
   ): boolean,
   ): boolean,
-  getYjsData(pageId: string, revisionBody?: string): CurrentPageYjsData,
+  getYjsData(pageId: string, revisionBody?: string): Promise<CurrentPageYjsData>,
 }
 }