Răsfoiți Sursa

InifiniteScroll pagination fix

https://youtrack.weseek.co.jp/issue/GW-7756
- Return  pagination function on the obsolete-page to its original function
- Add new method to get recent updated pages
- Implement findRecentUpdatedPages to recent pages route
I Komang Mudana 4 ani în urmă
părinte
comite
d37054b073

+ 6 - 25
packages/app/src/server/models/obsolete-page.js

@@ -485,7 +485,6 @@ export const getPageSchema = (crowi) => {
     validateCrowi();
     validateCrowi();
 
 
     const User = crowi.model('User');
     const User = crowi.model('User');
-    const Page = crowi.model('Page');
     const opt = Object.assign({ sort: 'updatedAt', desc: -1 }, option);
     const opt = Object.assign({ sort: 'updatedAt', desc: -1 }, option);
     const sortOpt = {};
     const sortOpt = {};
     sortOpt[opt.sort] = opt.desc;
     sortOpt[opt.sort] = opt.desc;
@@ -498,34 +497,16 @@ export const getPageSchema = (crowi) => {
     // add grant conditions
     // add grant conditions
     await addConditionToFilteringByViewerForList(builder, user, showAnyoneKnowsLink);
     await addConditionToFilteringByViewerForList(builder, user, showAnyoneKnowsLink);
 
 
-
-    builder.populateDataToList(User.USER_FIELDS_EXCEPT_CONFIDENTIAL);
-
-    if (!opt.offset) {
     // count
     // count
-      const totalCount = await builder.query.exec('count');
+    const totalCount = await builder.query.exec('count');
 
 
-      // find
-      builder.addConditionToPagenate(opt.offset, opt.limit, sortOpt);
-      const pages = await builder.query.lean().clone().exec('find');
-      const result = {
-        pages, totalCount, offset: opt.offset, limit: opt.limit,
-      };
-      return result;
-    }
-
-    // Pagination for infinite scroll
-    const paginationOptions = {
-      lean: true,
-      limit: opt.limit,
-      offset: opt.offset,
-      sort: sortOpt,
-    };
-    const paginatedPages = await Page.paginate(builder.query.clone(), paginationOptions);
+    // find
+    builder.addConditionToPagenate(opt.offset, opt.limit, sortOpt);
+    builder.populateDataToList(User.USER_FIELDS_EXCEPT_CONFIDENTIAL);
+    const pages = await builder.query.lean().clone().exec('find');
     const result = {
     const result = {
-      pages: paginatedPages.docs, totalCount: paginatedPages.totalDocs, offset: opt.offset, limit: opt.limit,
+      pages, totalCount, offset: opt.offset, limit: opt.limit,
     };
     };
-
     return result;
     return result;
   }
   }
 
 

+ 41 - 1
packages/app/src/server/models/page.ts

@@ -44,6 +44,13 @@ type TargetAndAncestorsResult = {
   rootPage: PageDocument
   rootPage: PageDocument
 }
 }
 
 
+type PaginatedPages = {
+  pages: PageDocument[],
+  totalCount: number,
+  limit: number,
+  offset: number
+}
+
 export type CreateMethod = (path: string, body: string, user, options) => Promise<PageDocument & { _id: any }>
 export type CreateMethod = (path: string, body: string, user, options) => Promise<PageDocument & { _id: any }>
 export interface PageModel extends Model<PageDocument> {
 export interface PageModel extends Model<PageDocument> {
   [x: string]: any; // for obsolete methods
   [x: string]: any; // for obsolete methods
@@ -54,7 +61,7 @@ export interface PageModel extends Model<PageDocument> {
   findTargetAndAncestorsByPathOrId(pathOrId: string): Promise<TargetAndAncestorsResult>
   findTargetAndAncestorsByPathOrId(pathOrId: string): Promise<TargetAndAncestorsResult>
   findChildrenByParentPathOrIdAndViewer(parentPathOrId: string, user, userGroups?): Promise<PageDocument[]>
   findChildrenByParentPathOrIdAndViewer(parentPathOrId: string, user, userGroups?): Promise<PageDocument[]>
   findAncestorsChildrenByPathAndViewer(path: string, user, userGroups?): Promise<Record<string, PageDocument[]>>
   findAncestorsChildrenByPathAndViewer(path: string, user, userGroups?): Promise<Record<string, PageDocument[]>>
-
+  findRecentUpdatedPages(path: string, user, option, includeEmpty?: boolean): Promise<PaginatedPages>
   generateGrantCondition(
   generateGrantCondition(
     user, userGroups, showAnyoneKnowsLink?: boolean, showPagesRestrictedByOwner?: boolean, showPagesRestrictedByGroup?: boolean,
     user, userGroups, showAnyoneKnowsLink?: boolean, showPagesRestrictedByOwner?: boolean, showPagesRestrictedByGroup?: boolean,
   ): { $or: any[] }
   ): { $or: any[] }
@@ -654,6 +661,39 @@ schema.statics.findByPathAndViewer = async function(
   return queryBuilder.query.exec();
   return queryBuilder.query.exec();
 };
 };
 
 
+schema.statics.findRecentUpdatedPages = async function(
+    path: string, user, options, includeEmpty = false,
+): Promise<PaginatedPages> {
+
+  const sortOpt = {};
+  sortOpt[options.sort] = options.desc;
+
+  const Page = this;
+  const User = mongoose.model('User') as any;
+
+  if (path == null) {
+    throw new Error('path is required.');
+  }
+
+  const baseQuery = this.find({});
+  const queryBuilder = new PageQueryBuilder(baseQuery, includeEmpty);
+  if (!options.includeTrashed) {
+    queryBuilder.addConditionToExcludeTrashed();
+  }
+
+  queryBuilder.addConditionToListWithDescendants(path, options);
+  queryBuilder.populateDataToList(User.USER_FIELDS_EXCEPT_CONFIDENTIAL);
+  await addViewerCondition(queryBuilder, user);
+  const pages = await Page.paginate(queryBuilder.query.clone(), {
+    lean: true, sort: sortOpt, offset: options.offset, limit: options.limit,
+  });
+  const results = {
+    pages: pages.docs, totalCount: pages.totalDocs, offset: options.offset, limit: options.limit,
+  };
+
+  return results;
+};
+
 
 
 /*
 /*
  * Find all ancestor pages by path. When duplicate pages found, it uses the oldest page as a result
  * Find all ancestor pages by path. When duplicate pages found, it uses the oldest page as a result

+ 4 - 6
packages/app/src/server/routes/apiv3/pages.js

@@ -1,16 +1,14 @@
-import loggerFactory from '~/utils/logger';
-
 import { subscribeRuleNames } from '~/interfaces/in-app-notification';
 import { subscribeRuleNames } from '~/interfaces/in-app-notification';
+import loggerFactory from '~/utils/logger';
 
 
 import { apiV3FormValidator } from '../../middlewares/apiv3-form-validator';
 import { apiV3FormValidator } from '../../middlewares/apiv3-form-validator';
 
 
 const logger = loggerFactory('growi:routes:apiv3:pages'); // eslint-disable-line no-unused-vars
 const logger = loggerFactory('growi:routes:apiv3:pages'); // eslint-disable-line no-unused-vars
-const express = require('express');
 const { pathUtils, pagePathUtils } = require('@growi/core');
 const { pathUtils, pagePathUtils } = require('@growi/core');
-const mongoose = require('mongoose');
-
+const express = require('express');
 const { body } = require('express-validator');
 const { body } = require('express-validator');
 const { query } = require('express-validator');
 const { query } = require('express-validator');
+const mongoose = require('mongoose');
 
 
 const ErrorV3 = require('../../models/vo/error-apiv3');
 const ErrorV3 = require('../../models/vo/error-apiv3');
 
 
@@ -376,7 +374,7 @@ module.exports = (crowi) => {
       desc: -1,
       desc: -1,
     };
     };
     try {
     try {
-      const result = await Page.findListWithDescendants('/', req.user, queryOptions);
+      const result = await Page.findRecentUpdatedPages('/', req.user, queryOptions);
       if (result.pages.length > limit) {
       if (result.pages.length > limit) {
         result.pages.pop();
         result.pages.pop();
       }
       }