Przeglądaj źródła

Merge pull request #5964 from weseek/feat/96532/generate-activity-when-login-and-logout

feat: Generate activity when Login and Logout
Shun Miyazawa 3 lat temu
rodzic
commit
914f05401b

+ 6 - 0
packages/app/src/interfaces/activity.ts

@@ -6,6 +6,9 @@ const MODEL_PAGE = 'Page';
 
 // Action
 const ACTION_UNSETTLED = 'UNSETTLED';
+const ACTION_LOGIN_SUCCESS = 'LOGIN_SUCCESS';
+const ACTION_LOGIN_FAILURE = 'LOGIN_FAILURE';
+const ACTION_LOGOUT = 'LOGOUT';
 const ACTION_PAGE_LIKE = 'PAGE_LIKE';
 const ACTION_PAGE_BOOKMARK = 'PAGE_BOOKMARK';
 const ACTION_PAGE_CREATE = 'PAGE_CREATE';
@@ -24,6 +27,9 @@ export const SUPPORTED_TARGET_MODEL_TYPE = {
 } as const;
 
 export const SUPPORTED_ACTION_TYPE = {
+  ACTION_LOGIN_SUCCESS,
+  ACTION_LOGIN_FAILURE,
+  ACTION_LOGOUT,
   ACTION_UNSETTLED,
   ACTION_PAGE_LIKE,
   ACTION_PAGE_BOOKMARK,

+ 0 - 20
packages/app/src/server/events/activity.ts

@@ -1,20 +0,0 @@
-import { EventEmitter } from 'events';
-import loggerFactory from '../../utils/logger';
-
-const logger = loggerFactory('growi:events:activity');
-
-
-class ActivityEvent extends EventEmitter {
-
-  onRemove(action: string, activity: any): void {
-    logger.info('onRemove activity event fired');
-  }
-
-  onCreate(action: string, activity: any): void {
-    logger.info('onCreate activity event fired');
-  }
-
-}
-
-const instance = new ActivityEvent();
-export default instance;

+ 3 - 13
packages/app/src/server/models/activity.ts

@@ -9,7 +9,6 @@ import {
 } from '~/interfaces/activity';
 
 import loggerFactory from '../../utils/logger';
-import activityEvent from '../events/activity';
 
 import Subscription from './subscription';
 
@@ -76,6 +75,9 @@ activitySchema.index({
 }, { unique: true });
 activitySchema.plugin(mongoosePaginate);
 
+activitySchema.post('save', function() {
+  logger.debug('activity has been created', this);
+});
 
 activitySchema.methods.getNotificationTargetUsers = async function() {
   const User = getModelSafely('User') || require('~/server/models/user')();
@@ -99,18 +101,6 @@ activitySchema.methods.getNotificationTargetUsers = async function() {
   return activeNotificationUsers;
 };
 
-activitySchema.post('save', async(savedActivity: ActivityDocument) => {
-  let targetUsers: Types.ObjectId[] = [];
-  try {
-    targetUsers = await savedActivity.getNotificationTargetUsers();
-  }
-  catch (err) {
-    logger.error(err);
-  }
-
-  activityEvent.emit('create', targetUsers, savedActivity);
-});
-
 activitySchema.statics.getPaginatedActivity = async function(limit: number, offset: number, query) {
   const paginateResult = await this.paginate(
     query,

+ 19 - 2
packages/app/src/server/routes/apiv3/logout.js

@@ -1,5 +1,8 @@
+import { SUPPORTED_ACTION_TYPE } from '~/interfaces/activity';
+import { generateAddActivityMiddleware } from '~/server/middlewares/add-activity';
 import loggerFactory from '~/utils/logger';
 
+
 const logger = loggerFactory('growi:routes:apiv3:logout'); // eslint-disable-line no-unused-vars
 
 const express = require('express');
@@ -7,9 +10,23 @@ const express = require('express');
 const router = express.Router();
 
 module.exports = (crowi) => {
-  router.post('/', async(req, res) => {
+  const activityService = crowi.activityService;
+  const addActivity = generateAddActivityMiddleware(crowi);
+
+  router.post('/', addActivity, async(req, res) => {
     req.session.destroy();
-    return res.send();
+
+    // return response first
+    res.send();
+
+    try {
+      const activityId = res.locals.activity._id;
+      const parameters = { action: SUPPORTED_ACTION_TYPE.ACTION_LOGOUT };
+      await activityService.updateByParameters(activityId, parameters);
+    }
+    catch (err) {
+      logger.error('Update activity failed', err);
+    }
   });
 
   return router;

+ 3 - 2
packages/app/src/server/routes/index.js

@@ -1,5 +1,6 @@
 import express from 'express';
 
+import { generateAddActivityMiddleware } from '../middlewares/add-activity';
 import apiV1FormValidator from '../middlewares/apiv1-form-validator';
 import injectResetOrderByTokenMiddleware from '../middlewares/inject-reset-order-by-token-middleware';
 import injectUserRegistrationOrderByTokenMiddleware from '../middlewares/inject-user-registration-order-by-token-middleware';
@@ -39,6 +40,7 @@ module.exports = function(crowi, app) {
   const certifySharedFile = require('../middlewares/certify-shared-file')(crowi);
   const csrf = require('../middlewares/csrf')(crowi);
   const injectUserUISettings = require('../middlewares/inject-user-ui-settings-to-localvars')();
+  const addActivity = generateAddActivityMiddleware(crowi);
 
   const uploads = multer({ dest: `${crowi.tmpDir}uploads` });
   const page = require('./page')(crowi, app);
@@ -77,8 +79,7 @@ module.exports = function(crowi, app) {
   app.get('/login'                    , applicationInstalled, login.preLogin, login.login);
   app.get('/login/invited'            , applicationInstalled, login.invited);
   app.post('/login/activateInvited'   , apiLimiter , applicationInstalled, loginFormValidator.inviteRules(), loginFormValidator.inviteValidation, csrf, login.invited);
-  app.post('/login'                   , apiLimiter , applicationInstalled, loginFormValidator.loginRules(), loginFormValidator.loginValidation, csrf, loginPassport.loginWithLocal, loginPassport.loginWithLdap, loginPassport.loginFailure);
-  app.post('/login'                   , apiLimiter , applicationInstalled, loginFormValidator.loginRules(), loginFormValidator.loginValidation, csrf, loginPassport.loginWithLocal, loginPassport.loginWithLdap, loginPassport.loginFailure);
+  app.post('/login'                   , apiLimiter , applicationInstalled, loginFormValidator.loginRules(), loginFormValidator.loginValidation, csrf, addActivity, loginPassport.loginWithLocal, loginPassport.loginWithLdap, loginPassport.loginFailure);
 
   app.post('/register'                , apiLimiter , applicationInstalled, registerFormValidator.registerRules(), registerFormValidator.registerValidation, csrf, login.register);
   app.get('/register'                 , applicationInstalled, login.preLogin, login.register);

+ 28 - 4
packages/app/src/server/routes/login-passport.js

@@ -1,3 +1,4 @@
+import { SUPPORTED_ACTION_TYPE } from '~/interfaces/activity';
 import loggerFactory from '~/utils/logger';
 
 /* eslint-disable no-use-before-define */
@@ -8,6 +9,7 @@ module.exports = function(crowi, app) {
   const passport = require('passport');
   const ExternalAccount = crowi.model('ExternalAccount');
   const passportService = crowi.passportService;
+  const activityService = crowi.activityService;
   const ApiResponse = require('../util/apiResponse');
 
   /**
@@ -15,7 +17,7 @@ module.exports = function(crowi, app) {
    * @param {*} req
    * @param {*} res
    */
-  const loginSuccessHandler = (req, res, user) => {
+  const loginSuccessHandler = async(req, res, user) => {
     // update lastLoginAt
     user.updateLastLoginAt(new Date(), (err, userData) => {
       if (err) {
@@ -27,7 +29,18 @@ module.exports = function(crowi, app) {
     const { redirectTo } = req.session;
     // remove session.redirectTo
     delete req.session.redirectTo;
-    return res.safeRedirect(redirectTo);
+
+    // return response first
+    res.safeRedirect(redirectTo);
+
+    try {
+      const activityId = res.locals.activity._id;
+      const parameters = { action: SUPPORTED_ACTION_TYPE.ACTION_LOGIN_SUCCESS };
+      await activityService.updateByParameters(activityId, parameters);
+    }
+    catch (err) {
+      logger.error('Update activity failed', err);
+    }
   };
 
   /**
@@ -35,9 +48,20 @@ module.exports = function(crowi, app) {
    * @param {*} req
    * @param {*} res
    */
-  const loginFailureHandler = (req, res, message) => {
+  const loginFailureHandler = async(req, res, message) => {
     req.flash('errorMessage', message || req.t('message.sign_in_failure'));
-    return res.redirect('/login');
+
+    // return response first
+    res.redirect('/login');
+
+    try {
+      const activityId = res.locals.activity._id;
+      const parameters = { action: SUPPORTED_ACTION_TYPE.ACTION_LOGIN_FAILURE };
+      await activityService.updateByParameters(activityId, parameters);
+    }
+    catch (err) {
+      logger.error('Update activity failed', err);
+    }
   };
 
   /**

+ 0 - 11
packages/app/src/server/routes/logout.js

@@ -1,11 +0,0 @@
-module.exports = function(crowi, app) {
-  return {
-    logout(req, res) {
-      req.session.destroy();
-
-      // redirect
-      const redirectTo = req.headers.referer || '/';
-      return res.safeRedirect(redirectTo);
-    },
-  };
-};