Yuki Takei 1 год назад
Родитель
Сommit
04092c15e7
1 измененных файлов с 25 добавлено и 18 удалено
  1. 25 18
      apps/app/src/server/routes/ogp.ts

+ 25 - 18
apps/app/src/server/routes/ogp.ts

@@ -1,7 +1,7 @@
 import * as fs from 'fs';
 import * as fs from 'fs';
 import path from 'path';
 import path from 'path';
 
 
-import type { IUser } from '@growi/core';
+import { getIdStringForRef, type IUser } from '@growi/core';
 import { DevidedPagePath } from '@growi/core/dist/models';
 import { DevidedPagePath } from '@growi/core/dist/models';
 // eslint-disable-next-line no-restricted-imports
 // eslint-disable-next-line no-restricted-imports
 import axios from 'axios';
 import axios from 'axios';
@@ -10,12 +10,14 @@ import type {
 } from 'express';
 } from 'express';
 import type { ValidationError } from 'express-validator';
 import type { ValidationError } from 'express-validator';
 import { param, validationResult } from 'express-validator';
 import { param, validationResult } from 'express-validator';
+import type { HydratedDocument } from 'mongoose';
 import mongoose from 'mongoose';
 import mongoose from 'mongoose';
 
 
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 import { projectRoot } from '~/utils/project-dir-utils';
 import { projectRoot } from '~/utils/project-dir-utils';
 
 
 import { Attachment } from '../models/attachment';
 import { Attachment } from '../models/attachment';
+import type { PageDocument, PageModel } from '../models/page';
 import { configManager } from '../service/config-manager';
 import { configManager } from '../service/config-manager';
 import { convertStreamToBuffer } from '../util/stream';
 import { convertStreamToBuffer } from '../util/stream';
 
 
@@ -61,21 +63,25 @@ module.exports = function(crowi) {
 
 
     const User = mongoose.model<IUser>('User');
     const User = mongoose.model<IUser>('User');
     const ogpUri = configManager.getConfig('crowi', 'app:ogpUri');
     const ogpUri = configManager.getConfig('crowi', 'app:ogpUri');
-    const page = req.body.page;
+    const page: PageDocument = req.body.page; // asserted by ogpValidator
 
 
-    let user: IUser | null;
-    let pageTitle: string;
-    let bufferedUserImage: Buffer;
-
-    try {
-      user = await User.findById(page.creator._id.toString());
+    const title = (new DevidedPagePath(page.path)).latter;
 
 
-      bufferedUserImage = user == null || user.imageUrlCached !== DEFAULT_USER_IMAGE_URL
-        ? bufferedDefaultUserImageCache
-        : await getBufferedUserImage(user.imageUrlCached);
+    let user: IUser | null = null;
+    let userName = '(unknown)';
+    let userImage: Buffer = bufferedDefaultUserImageCache;
 
 
-      // todo: consider page title
-      pageTitle = (new DevidedPagePath(page.path)).latter;
+    try {
+      if (page.creator != null) {
+        user = await User.findById(getIdStringForRef(page.creator));
+
+        if (user != null) {
+          userName = user.username;
+          userImage = user.imageUrlCached !== DEFAULT_USER_IMAGE_URL
+            ? bufferedDefaultUserImageCache
+            : await getBufferedUserImage(user.imageUrlCached);
+        }
+      }
     }
     }
     catch (err) {
     catch (err) {
       logger.error(err);
       logger.error(err);
@@ -87,9 +93,9 @@ module.exports = function(crowi) {
       result = await axios.post(
       result = await axios.post(
         ogpUri, {
         ogpUri, {
           data: {
           data: {
-            title: pageTitle,
-            userName: user?.username ?? '(unknown)',
-            userImage: bufferedUserImage,
+            title,
+            userName,
+            userImage,
           },
           },
         }, {
         }, {
           responseType: 'stream',
           responseType: 'stream',
@@ -123,9 +129,10 @@ module.exports = function(crowi) {
 
 
     if (errors.isEmpty()) {
     if (errors.isEmpty()) {
 
 
+      const Page = mongoose.model<HydratedDocument<PageDocument>, PageModel>('Page');
+
       try {
       try {
-        const Page = crowi.model('Page');
-        const page = await Page.findByIdAndViewer(req.params.pageId);
+        const page = await Page.findByIdAndViewer(req.params.pageId, null);
 
 
         if (page == null || page.status !== Page.STATUS_PUBLISHED || (page.grant !== Page.GRANT_PUBLIC && page.grant !== Page.GRANT_RESTRICTED)) {
         if (page == null || page.status !== Page.STATUS_PUBLISHED || (page.grant !== Page.GRANT_PUBLIC && page.grant !== Page.GRANT_RESTRICTED)) {
           return res.status(400).send('the page does not exist');
           return res.status(400).send('the page does not exist');