Yuki Takei 2 лет назад
Родитель
Сommit
39be466848

+ 1 - 1
packages/remark-lsx/src/server/index.ts

@@ -1,6 +1,6 @@
 import type { Request, Response } from 'express';
 
-import { listPages } from './routes/lsx';
+import { listPages } from './routes/list-pages';
 
 const loginRequiredFallback = (req: Request, res: Response) => {
   return res.status(403).send('login required');

+ 22 - 0
packages/remark-lsx/src/server/routes/list-pages/generate-base-query.ts

@@ -0,0 +1,22 @@
+import { IPage, IUser } from '@growi/core';
+import { model } from 'mongoose';
+import type { Document, Query } from 'mongoose';
+
+type PageQueryBuilder = {
+  query: Query<IPage, Document>,
+  addConditionToListOnlyDescendants: (pagePath: string) => PageQueryBuilder,
+  addConditionToFilteringByViewerForList: (builder: PageQueryBuilder, user: IUser) => PageQueryBuilder,
+};
+
+export const generateBaseQuery = (pagePath: string, user: IUser): PageQueryBuilder => {
+  const Page = model<IPage>('Page');
+  // eslint-disable-next-line @typescript-eslint/no-explicit-any
+  const PageAny = Page as any;
+
+  const baseQuery = Page.find();
+
+  const builder: PageQueryBuilder = new PageAny.PageQueryBuilder(baseQuery);
+  builder.addConditionToListOnlyDescendants(pagePath);
+
+  return PageAny.addConditionToFilteringByViewerForList(builder, user);
+};

+ 15 - 0
packages/remark-lsx/src/server/routes/list-pages/get-toppage-viewers-count.ts

@@ -0,0 +1,15 @@
+import { IPage } from '@growi/core';
+import { model } from 'mongoose';
+
+export const getToppageViewersCount = async(): Promise<number> => {
+  const Page = model<IPage>('Page');
+
+  const aggRes = await Page.aggregate([
+    { $match: { path: '/' } },
+    { $project: { count: { $size: '$seenUsers' } } },
+  ]);
+
+  return aggRes.length > 0
+    ? aggRes[0].count
+    : 1;
+};

+ 24 - 0
packages/remark-lsx/src/server/routes/list-pages/index.spec.ts

@@ -0,0 +1,24 @@
+import type { IUser } from '@growi/core';
+import type { Request, Response } from 'express';
+import { mock } from 'vitest-mock-extended';
+
+import { listPages } from '.';
+
+describe('listPages', () => {
+
+  describe('with num option', () => {
+
+    it('returns 500 HTTP response when an unexpected error occured', async() => {
+      // setup
+      const reqMock = mock<Request & { user: IUser }>();
+      const resMock = mock<Response & { user: IUser }>();
+
+      // when
+      const response = await listPages(reqMock, resMock);
+
+      // then
+      expect(response).not.toBe(null);
+    });
+
+  });
+});

+ 6 - 26
packages/remark-lsx/src/server/routes/lsx.ts → packages/remark-lsx/src/server/routes/list-pages/index.ts

@@ -1,11 +1,13 @@
 
-import type { IPage, IUser } from '@growi/core';
+import type { IUser } from '@growi/core';
 import { OptionParser } from '@growi/core/dist/plugin';
 import { pathUtils, pagePathUtils } from '@growi/core/dist/utils';
 import escapeStringRegexp from 'escape-string-regexp';
 import type { Request, Response } from 'express';
 import createError, { isHttpError } from 'http-errors';
-import { model } from 'mongoose';
+
+import { generateBaseQuery } from './generate-base-query';
+import { getToppageViewersCount } from './get-toppage-viewers-count';
 
 
 const DEFAULT_PAGES_NUM = 50;
@@ -139,22 +141,7 @@ function addSortCondition(query, pagePath, optionsSortArg, optionsReverse) {
   return query.sort(sortOption);
 }
 
-async function generateBaseQueryBuilder(pagePath: string, user: IUser) {
-  const Page = model<IPage>('Page');
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  const PageAny = Page as any;
-
-  const baseQuery = Page.find();
-
-  const builder = new PageAny.PageQueryBuilder(baseQuery);
-  builder.addConditionToListOnlyDescendants(pagePath);
-
-  return PageAny.addConditionToFilteringByViewerForList(builder, user);
-}
-
 export const listPages = async(req: Request & { user: IUser }, res: Response): Promise<Response> => {
-  const Page = model<IPage>('Page');
-
   const user = req.user;
 
   let pagePath;
@@ -170,19 +157,12 @@ export const listPages = async(req: Request & { user: IUser }, res: Response): P
     return res.status(400).send(error);
   }
 
-  const builder = await generateBaseQueryBuilder(pagePath, user);
+  const builder = generateBaseQuery(pagePath, user);
 
   // count viewers of `/`
   let toppageViewersCount;
   try {
-    const aggRes = await Page.aggregate([
-      { $match: { path: '/' } },
-      { $project: { count: { $size: '$seenUsers' } } },
-    ]);
-
-    toppageViewersCount = aggRes.length > 0
-      ? aggRes[0].count
-      : 1;
+    toppageViewersCount = await getToppageViewersCount();
   }
   catch (error) {
     return res.status(500).send(error);