2
0
Эх сурвалжийг харах

Merge pull request #6139 from weseek/imprv/98844-disable-add-activity-middleware-if-used-in-get-requests

imprv: Disable add-activity middleware if used in GET requests
Shun Miyazawa 3 жил өмнө
parent
commit
013feac81a

+ 5 - 0
packages/app/src/server/middlewares/add-activity.ts

@@ -13,6 +13,11 @@ interface AuthorizedRequest extends Request {
 }
 
 export const generateAddActivityMiddleware = crowi => async(req: AuthorizedRequest, res: Response, next: NextFunction): Promise<void> => {
+  if (req.method === 'GET') {
+    logger.warn('This middleware is not available for GET requests');
+    return next();
+  }
+
   const parameter = {
     ip:  req.ip,
     endpoint: req.originalUrl,

+ 4 - 4
packages/app/src/server/routes/index.js

@@ -73,7 +73,7 @@ module.exports = function(crowi, app) {
   // API v3 for auth
   app.use('/_api/v3', apiV3AuthRouter);
 
-  app.get('/'                         , applicationInstalled, unavailableWhenMaintenanceMode, loginRequired, addActivity, autoReconnectToSearch, injectUserUISettings, page.showTopPage);
+  app.get('/'                         , applicationInstalled, unavailableWhenMaintenanceMode, loginRequired, autoReconnectToSearch, injectUserUISettings, page.showTopPage);
 
   app.get('/login/error/:reason'      , applicationInstalled, login.error);
   app.get('/login'                    , applicationInstalled, login.preLogin, login.login);
@@ -245,9 +245,9 @@ module.exports = function(crowi, app) {
 
   app.use('/ogp', express.Router().get('/:pageId([0-9a-z]{0,})', loginRequired, ogp.pageIdRequired, ogp.ogpValidator, ogp.renderOgp));
 
-  app.get('/:id([0-9a-z]{24})'       , loginRequired , addActivity, injectUserUISettings, page.showPage);
+  app.get('/:id([0-9a-z]{24})'       , loginRequired , injectUserUISettings, page.showPage);
 
-  app.get('/*/$'                   , loginRequired , addActivity, injectUserUISettings, page.redirectorWithEndOfSlash);
-  app.get('/*'                     , loginRequired , addActivity, autoReconnectToSearch, injectUserUISettings, page.redirector);
+  app.get('/*/$'                   , loginRequired , injectUserUISettings, page.redirectorWithEndOfSlash);
+  app.get('/*'                     , loginRequired , autoReconnectToSearch, injectUserUISettings, page.redirector);
 
 };

+ 41 - 9
packages/app/src/server/routes/page.js

@@ -4,6 +4,7 @@ import mongoose from 'mongoose';
 import urljoin from 'url-join';
 
 import { SupportedTargetModel, SupportedAction } from '~/interfaces/activity';
+import Activity from '~/server/models/activity';
 import loggerFactory from '~/utils/logger';
 
 import { PathAlreadyExistsError } from '../models/errors';
@@ -411,8 +412,16 @@ module.exports = function(crowi, app) {
 
     await addRenderVarsForPageTree(renderVars, portalPath, req.user);
 
-    const parameters = { action: SupportedAction.ACTION_PAGE_VIEW };
-    activityEvent.emit('update', res.locals.activity._id, parameters);
+    const parameters = {
+      ip:  req.ip,
+      endpoint: req.originalUrl,
+      action: SupportedAction.ACTION_PAGE_VIEW,
+      user: req.user?._id,
+      snapshot: {
+        username: req.user?.username,
+      },
+    };
+    crowi.activityService.createActivity(SupportedAction.ACTION_PAGE_VIEW, parameters);
 
     return res.render(view, renderVars);
   }
@@ -472,8 +481,16 @@ module.exports = function(crowi, app) {
 
     await addRenderVarsForPageTree(renderVars, path, req.user);
 
-    const parameters = { action: SupportedAction.ACTION_PAGE_VIEW };
-    activityEvent.emit('update', res.locals.activity._id, parameters);
+    const parameters = {
+      ip:  req.ip,
+      endpoint: req.originalUrl,
+      action: SupportedAction.ACTION_PAGE_VIEW,
+      user: req.user?._id,
+      snapshot: {
+        username: req.user?.username,
+      },
+    };
+    crowi.activityService.createActivity(SupportedAction.ACTION_PAGE_VIEW, parameters);
 
     return res.render(view, renderVars);
   }
@@ -655,9 +672,16 @@ module.exports = function(crowi, app) {
   actions.redirector = async function(req, res, next) {
     const path = getPathFromRequest(req);
 
-    const parameters = { action: SupportedAction.ACTION_PAGE_VIEW };
-    activityEvent.emit('update', res.locals.activity._id, parameters);
-
+    const parameters = {
+      ip:  req.ip,
+      endpoint: req.originalUrl,
+      action: SupportedAction.ACTION_PAGE_VIEW,
+      user: req.user?._id,
+      snapshot: {
+        username: req.user?.username,
+      },
+    };
+    crowi.activityService.createActivity(SupportedAction.ACTION_PAGE_VIEW, parameters);
     return redirector(req, res, next, path);
   };
 
@@ -665,8 +689,16 @@ module.exports = function(crowi, app) {
     const _path = getPathFromRequest(req);
     const path = pathUtils.removeTrailingSlash(_path);
 
-    const parameters = { action: SupportedAction.ACTION_PAGE_VIEW };
-    activityEvent.emit('update', res.locals.activity._id, parameters);
+    const parameters = {
+      ip:  req.ip,
+      endpoint: req.originalUrl,
+      action: SupportedAction.ACTION_PAGE_VIEW,
+      user: req.user?._id,
+      snapshot: {
+        username: req.user?.username,
+      },
+    };
+    crowi.activityService.createActivity(SupportedAction.ACTION_PAGE_VIEW, parameters);
 
     return redirector(req, res, next, path);
   };

+ 14 - 1
packages/app/src/server/service/activity.ts

@@ -1,7 +1,7 @@
 import mongoose from 'mongoose';
 
 import {
-  IActivity, SupportedActionType, AllSupportedActions, ActionGroupSize,
+  IActivity, SupportedAction, SupportedActionType, AllSupportedActions, ActionGroupSize,
   AllEssentialActions, AllSmallGroupActions, AllMediumGroupActions, AllLargeGroupActions,
 } from '~/interfaces/activity';
 import { IPage } from '~/interfaces/page';
@@ -102,6 +102,19 @@ class ActivityService {
     return this.getAvailableActions().includes(action);
   }
 
+  // for GET request
+  createActivity = async function(action: SupportedActionType, parameters): Promise<void> {
+    const shoudCreateActivity = this.crowi.activityService.shoudUpdateActivity(action);
+    if (shoudCreateActivity) {
+      try {
+        await Activity.createByParameters(parameters);
+      }
+      catch (err) {
+        logger.error('Create activity failed', err);
+      }
+    }
+  };
+
   createTtlIndex = async function() {
     const configManager = this.crowi.configManager;
     const activityExpirationSeconds = configManager != null ? configManager.getConfig('crowi', 'app:activityExpirationSeconds') : 2592000;