|
|
@@ -1,11 +1,15 @@
|
|
|
import express, { Request, Router } from 'express';
|
|
|
import { query, oneOf } from 'express-validator';
|
|
|
|
|
|
-import { PageDocument, PageModel } from '../../models/page';
|
|
|
+import mongoose from 'mongoose';
|
|
|
+
|
|
|
+import { PageModel } from '../../models/page';
|
|
|
import ErrorV3 from '../../models/vo/error-apiv3';
|
|
|
import loggerFactory from '../../../utils/logger';
|
|
|
import Crowi from '../../crowi';
|
|
|
import { ApiV3Response } from './interfaces/apiv3-response';
|
|
|
+import { IPageInfoForList, IPageInfoCommon, isExistPageInfo } from '~/interfaces/page';
|
|
|
+import PageService from '../../service/page';
|
|
|
|
|
|
const logger = loggerFactory('growi:routes:apiv3:page-tree');
|
|
|
|
|
|
@@ -93,14 +97,58 @@ export default (crowi: Crowi): Router => {
|
|
|
}
|
|
|
});
|
|
|
|
|
|
+ // eslint-disable-next-line max-len
|
|
|
+ router.get('/info', accessTokenParser, loginRequired, validator.pageIdsRequired, async(req: AuthorizedRequest, res: ApiV3Response) => {
|
|
|
+ const { pageIds } = req.query;
|
|
|
+
|
|
|
+ const Page = mongoose.model('Page') as unknown as PageModel;
|
|
|
+ const Bookmark = crowi.model('Bookmark');
|
|
|
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
|
+ const pageService: PageService = crowi.pageService!;
|
|
|
+
|
|
|
+ try {
|
|
|
+ const pages = await Page.findByIdsAndViewer(pageIds as string[], req.user, null, true);
|
|
|
+
|
|
|
+ const foundIds = pages.map(page => page._id);
|
|
|
+
|
|
|
+ const shortBodiesMap = await pageService.shortBodiesMapByPageIds(foundIds, req.user);
|
|
|
+ const bookmarkCountMap = await Bookmark.getPageIdToCountMap(foundIds) as Record<string, number>;
|
|
|
+
|
|
|
+ const idToPageInfoMap: Record<string, IPageInfoCommon|IPageInfoForList> = {};
|
|
|
+
|
|
|
+ for (const page of pages) {
|
|
|
+ // construct IPageInfoForList
|
|
|
+ const basicPageInfo = pageService.constructBasicPageInfo(page);
|
|
|
+
|
|
|
+ const pageInfo: IPageInfoCommon | IPageInfoForList = (!isExistPageInfo(basicPageInfo))
|
|
|
+ ? basicPageInfo
|
|
|
+ // create IPageInfoForList
|
|
|
+ : {
|
|
|
+ ...basicPageInfo,
|
|
|
+ bookmarkCount: bookmarkCountMap[page._id],
|
|
|
+ revisionShortBody: shortBodiesMap[page._id],
|
|
|
+ } as IPageInfoForList;
|
|
|
+
|
|
|
+ idToPageInfoMap[page._id] = pageInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ return res.apiv3(idToPageInfoMap);
|
|
|
+ }
|
|
|
+ catch (err) {
|
|
|
+ logger.error('Error occurred while fetching page informations.', err);
|
|
|
+ return res.apiv3Err(new ErrorV3('Error occurred while fetching page informations.'));
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
// eslint-disable-next-line max-len
|
|
|
router.get('/short-bodies', accessTokenParser, loginRequired, validator.pageIdsRequired, async(req: AuthorizedRequest, res: ApiV3Response) => {
|
|
|
const { pageIds } = req.query;
|
|
|
|
|
|
try {
|
|
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
|
- const shortBodiesMap = await crowi.pageService!.shortBodiesMapByPageIds(pageIds as string[], req.user);
|
|
|
- return res.apiv3({ shortBodiesMap });
|
|
|
+ // const shortBodiesMap = await crowi.pageService!.shortBodiesMapByPageIds(pageIds as string[], req.user);
|
|
|
+ // return res.apiv3({ shortBodiesMap });
|
|
|
+ return res.apiv3();
|
|
|
}
|
|
|
catch (err) {
|
|
|
logger.error('Error occurred while fetching shortBodiesMap.', err);
|