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

WIP: GC-1224 refactor page

* refactor api.recentCreated
Yuki Takei 7 лет назад
Родитель
Сommit
9d44a27436

+ 2 - 2
src/client/js/components/RecentCreated/RecentCreated.jsx

@@ -30,9 +30,9 @@ export default class RecentCreated extends React.Component {
     // pagesList get and pagination calculate
     this.props.crowi.apiGet('/pages.recentCreated', { page_id: pageId, user: userId, limit, offset })
       .then(res => {
-        const totalCount = res.pages[0].totalCount;
+        const totalCount = res.totalCount;
+        const pages = res.pages;
         const activePage = selectPageNumber;
-        const pages = res.pages[1];
         // pagiNation calculate function call
         const paginationNumbers = this.calculatePagination(limit, totalCount, activePage);
         this.setState({

+ 29 - 36
src/server/models/page.js

@@ -757,47 +757,40 @@ module.exports = function(crowi) {
     });
   };
 
-  pageSchema.statics.findListByCreator = async function(user, option, currentUser) {
+  pageSchema.statics.findListByCreator = async function(targetUser, currentUser, option) {
     validateCrowi();
 
-    let Page = this;
-    let User = crowi.model('User');
-    let limit = option.limit || 50;
-    let offset = option.offset || 0;
-    let conditions = setPageListConditions(user);
-
-    let pages =  await Page.find(conditions).sort({createdAt: -1}).skip(offset).limit(limit).populate('revision').exec();
-    let PagesList = await Page.populate(pages, {path: 'lastUpdateUser', model: 'User', select: User.USER_PUBLIC_FIELDS});
-    let totalCount = await Page.countListByCreator(user);
-    let PagesArray = [
-      {totalCount: totalCount}
-    ];
-    PagesArray.push(PagesList);
-    return PagesArray;
-  };
-  function setPageListConditions(user) {
-    const conditions = {
-      creator: user._id,
-      redirectTo: null,
-      $and: [
-        {$or: [
-          {status: null},
-          {status: STATUS_PUBLISHED},
-        ]},
-        {$or: [
-          {grant: GRANT_PUBLIC},
-          {grant: GRANT_USER_GROUP},
-        ]}],
-    };
+    const User = crowi.model('User');
+    const limit = option.limit || 50;
+    const offset = option.offset || 0;
 
-    return conditions;
-  }
+    const builder = new PageQueryBuilder(
+      this.find({
+        creator: targetUser._id,
+        redirectTo: null,
+      })
+      .populate({
+        path: 'lastUpdateUser',
+        model: 'User',
+        select: User.USER_PUBLIC_FIELDS
+      })
+    );
+
+    // add grant conditions
+    let userGroups = null;
+    if (currentUser != null) {
+      const UserGroupRelation = crowi.model('UserGroupRelation');
+      userGroups = await UserGroupRelation.findAllUserGroupIdsRelatedToUser(currentUser);
+    }
+    builder.addConditionToFilteringByViewer(currentUser, userGroups);
 
-  pageSchema.statics.countListByCreator = function(user) {
-    let Page = this;
-    let conditions = setPageListConditions(user);
+    const totalCount = await builder.query.exec('count');
+    const q = builder.query
+      .sort({createdAt: -1}).skip(offset).limit(limit);
+    const pages = await q.exec('find');
 
-    return Page.find(conditions).count();
+    const result = { pages, totalCount };
+    return result;
   };
 
 

+ 2 - 4
src/server/routes/page.js

@@ -1083,10 +1083,8 @@ module.exports = function(crowi, app) {
     const queryOptions = { offset: offset, limit: limit };
 
     try {
-      let pages = await Page.findListByCreator(page.creator, queryOptions, req.user);
-
-      const result = {};
-      result.pages = pagePathUtils.encodePagesPath(pages);
+      let result = await Page.findListByCreator(page.creator, req.user, queryOptions);
+      result.pages = pagePathUtils.encodePagesPath(result.pages);
 
       return res.json(ApiResponse.success(result));
     }