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

generate activity when logged in

Shun Miyazawa 3 лет назад
Родитель
Сommit
735ff2c3b0

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

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

+ 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, addActivity, loginFormValidator.loginRules(), loginFormValidator.loginValidation, csrf, 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);
+    }
   };
 
   /**