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

Retrieve activity document with pagination

Shun Miyazawa 4 лет назад
Родитель
Сommit
0a097522e0

+ 4 - 4
packages/app/src/server/models/activity.ts

@@ -1,13 +1,12 @@
+import { getOrCreateModel, getModelSafely } from '@growi/core';
 import {
   Types, Document, Model, Schema,
 } from 'mongoose';
+import mongoosePaginate from 'mongoose-paginate-v2';
 
-import { getOrCreateModel, getModelSafely } from '@growi/core';
 import loggerFactory from '../../utils/logger';
-
-
-import ActivityDefine from '../util/activityDefine';
 import activityEvent from '../events/activity';
+import ActivityDefine from '../util/activityDefine';
 
 import Subscription from './subscription';
 
@@ -67,6 +66,7 @@ activitySchema.index({ target: 1, action: 1 });
 activitySchema.index({
   user: 1, target: 1, action: 1, createdAt: 1,
 }, { unique: true });
+activitySchema.plugin(mongoosePaginate);
 
 
 activitySchema.methods.getNotificationTargetUsers = async function() {

+ 27 - 3
packages/app/src/server/routes/apiv3/activity.ts

@@ -1,6 +1,8 @@
 import express, { Request, Router } from 'express';
+import { query } from 'express-validator';
 
 import Crowi from '../../crowi';
+import { apiV3FormValidator } from '../../middlewares/apiv3-form-validator';
 
 import { ApiV3Response } from './interfaces/apiv3-response';
 
@@ -9,6 +11,14 @@ interface AuthorizedRequest extends Request {
  user?: any
 }
 
+const validator = {
+  list: [
+    query('limit').optional().isInt({ max: 100 }).withMessage('limit must be a number less than or equal to 100'),
+    query('offset').optional().isInt().withMessage('page must be a number'),
+
+  ],
+};
+
 module.exports = (crowi: Crowi): Router => {
   const adminRequired = require('../../middlewares/admin-required')(crowi);
   const accessTokenParser = require('../../middlewares/access-token-parser')(crowi);
@@ -16,9 +26,23 @@ module.exports = (crowi: Crowi): Router => {
 
   const router = express.Router();
 
-  router.get('/list', accessTokenParser, loginRequiredStrictly, adminRequired, async(req: AuthorizedRequest, res: ApiV3Response) => {
-    return res.apiv3({});
-  });
+  const activityService = crowi.activityService;
+
+
+  router.get(
+    '/list', accessTokenParser, loginRequiredStrictly, adminRequired, validator.list, apiV3FormValidator, async(req: AuthorizedRequest, res: ApiV3Response) => {
+      const limit = req.query.limit || await crowi.configManager?.getConfig('crowi', 'customize:showPageLimitationS') || 10;
+      const offset = req.query.offset || 1;
+
+      try {
+        const paginatedActivity = await activityService.getPaginatedActivity(limit, offset);
+        return res.apiv3({ paginatedActivity });
+      }
+      catch (err) {
+        return res.apiv3Err(err);
+      }
+    },
+  );
 
   return router;
 };

+ 26 - 0
packages/app/src/server/service/activity.ts

@@ -1,7 +1,12 @@
 import { getModelSafely } from '@growi/core';
+
+import loggerFactory from '~/utils/logger';
+
 import Crowi from '../crowi';
 
 
+const logger = loggerFactory('growi:service:activity');
+
 class ActivityService {
 
   crowi!: Crowi;
@@ -33,6 +38,27 @@ class ActivityService {
     return this.find({ user }).sort({ createdAt: -1 }).exec();
   };
 
+  /**
+   * @param {number} limit
+   * @param {number} offset
+   */
+  getPaginatedActivity = async(limit: number, offset: number) => {
+    const Activity = getModelSafely('Activity') || require('../models/activity')(this.crowi);
+    try {
+      const paginateResult = await Activity.paginate(
+        {
+          sort: { createdAt: -1 },
+          limit,
+          offset,
+        },
+      );
+      return paginateResult;
+    }
+    catch (err) {
+      logger.error(err);
+    }
+  }
+
 }
 
 module.exports = ActivityService;