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

express-validator & apiSuccessHandler

mizozobu 6 лет назад
Родитель
Сommit
eb4d56ed76

+ 1 - 0
package.json

@@ -85,6 +85,7 @@
     "express-form": "~0.12.0",
     "express-sanitizer": "^1.0.4",
     "express-session": "^1.16.1",
+    "express-validator": "^5.3.1",
     "express-webpack-assets": "^0.1.0",
     "googleapis": "^39.1.0",
     "graceful-fs": "^4.1.11",

+ 3 - 1
src/client/js/components/Admin/UserGroup/UserGroupCreateForm.jsx

@@ -2,7 +2,7 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import { withTranslation } from 'react-i18next';
 
-import apiErrorHandler from '../../../util/apiErrorHandler';
+import { apiErrorHandler, apiSuccessHandler } from '../../../util/apiNotification';
 
 class UserGroupCreateForm extends React.Component {
 
@@ -39,6 +39,8 @@ class UserGroupCreateForm extends React.Component {
       if (res.ok) {
         const { userGroup, userGroupRelation } = res;
         this.props.onCreate(userGroup, userGroupRelation);
+        this.setState({ name: '' });
+        apiSuccessHandler({ body: `Created ${userGroup.name}` });
       }
       else {
         throw new Error('Unable to create a group');

+ 3 - 1
src/client/js/components/Admin/UserGroup/UserGroupPage.jsx

@@ -5,7 +5,7 @@ import UserGroupTable from './UserGroupTable';
 import UserGroupCreateForm from './UserGroupCreateForm';
 import UserGroupDeleteModal from './UserGroupDeleteModal';
 
-import apiErrorHandler from '../../../util/apiErrorHandler';
+import { apiErrorHandler, apiSuccessHandler } from '../../../util/apiNotification';
 
 class UserGroupPage extends React.Component {
 
@@ -76,6 +76,8 @@ class UserGroupPage extends React.Component {
             isDeleteModalShow: false,
           };
         });
+
+        apiSuccessHandler({ body: `Deleted ${res.userGroup.name}` });
       }
       else {
         throw new Error('Unable to create a group');

+ 0 - 18
src/client/js/util/apiErrorHandler.js

@@ -1,18 +0,0 @@
-import * as toastr from 'toastr';
-
-const logger = require('@alias/logger')('growi');
-
-const apiErrorHandler = (err) => {
-  logger.error(err);
-
-  toastr.error(err, 'Error occured', {
-    closeButton: true,
-    progressBar: true,
-    newestOnTop: false,
-    showDuration: '100',
-    hideDuration: '100',
-    timeOut: '3000',
-  });
-};
-
-export default apiErrorHandler;

+ 29 - 0
src/client/js/util/apiNotification.js

@@ -0,0 +1,29 @@
+import * as toastr from 'toastr';
+
+const logger = require('@alias/logger')('growi');
+
+export const apiErrorHandler = (err) => {
+  logger.error(err);
+
+  toastr.error(err, 'Error', {
+    closeButton: true,
+    progressBar: true,
+    newestOnTop: false,
+    showDuration: '100',
+    hideDuration: '100',
+    timeOut: '3000',
+  });
+};
+
+export const apiSuccessHandler = ({ header, body }) => {
+  toastr.success(body, header, {
+    closeButton: true,
+    progressBar: true,
+    newestOnTop: false,
+    showDuration: '100',
+    hideDuration: '100',
+    timeOut: '3000',
+  });
+};
+
+export default apiErrorHandler;

+ 3 - 0
src/server/form/apiv3/index.js

@@ -0,0 +1,3 @@
+module.exports = {
+  userGroup: require('./user-group'),
+};

+ 15 - 0
src/server/form/apiv3/user-group.js

@@ -0,0 +1,15 @@
+const { body, param } = require('express-validator/check');
+
+const validator = {};
+
+validator.create = [
+  body('name').trim().exists(),
+];
+
+validator.delete = [
+  param('id').trim().exists(),
+  body('actionName').trim().exists(),
+  body('transferToUserGroupId').trim(),
+];
+
+module.exports = validator;

+ 5 - 3
src/server/routes/apiv3/index.js

@@ -9,7 +9,9 @@ const router = express.Router();
 
 module.exports = (crowi) => {
   const middleware = require('../../util/middlewares');
-  const { loginRequired, adminRequired } = middleware;
+  const { loginRequired, adminRequired, formValid } = middleware;
+
+  const form = require('../../form/apiv3');
 
   const userGroup = require('./user-group')(crowi);
   const userGroupRelation = require('./user-group-relation')(crowi);
@@ -19,9 +21,9 @@ module.exports = (crowi) => {
   // user groups
   router.get('/user-groups', loginRequired(crowi), adminRequired(), userGroup.find);
   // router.get('/user-groups/:id', loginRequired(crowi), adminRequired(), adminUserGroup.findOne);
-  router.post('/user-groups/create', loginRequired(crowi), adminRequired(), userGroup.create);
+  router.post('/user-groups/create', loginRequired(crowi), adminRequired(), form.userGroup.create, formValid(), userGroup.create);
   // router.post('/user-groups/update/:id', loginRequired(crowi), adminRequired(), adminUserGroup.update);
-  router.post('/user-groups/delete/:id', loginRequired(crowi), adminRequired(), userGroup.delete);
+  router.post('/user-groups/delete/:id', loginRequired(crowi), adminRequired(), form.userGroup.delete, formValid(), userGroup.delete);
 
   // user group relations
   router.get('/user-group-relations', loginRequired(crowi), adminRequired(), userGroupRelation.find);

+ 2 - 2
src/server/routes/apiv3/user-group.js

@@ -50,9 +50,9 @@ module.exports = (crowi) => {
     const { id: deleteGroupId } = req.params;
     const { actionName, transferToUserGroupId } = req.body;
     try {
-      await UserGroup.removeCompletelyById(deleteGroupId, actionName, transferToUserGroupId);
+      const userGroup = await UserGroup.removeCompletelyById(deleteGroupId, actionName, transferToUserGroupId);
 
-      return res.json(ApiResponse.success());
+      return res.json(ApiResponse.success({ userGroup }));
     }
     catch (err) {
       const msg = 'Error occurred in deleting a user group';

+ 16 - 0
src/server/util/middlewares.js

@@ -3,7 +3,9 @@ const logger = require('@alias/logger')('growi:lib:middlewares');
 const pathUtils = require('growi-commons').pathUtils;
 const md5 = require('md5');
 const entities = require('entities');
+const { validationResult } = require('express-validator/check');
 
+const ApiResponse = require('./apiResponse');
 
 exports.csrfKeyGenerator = function(crowi, app) {
   return function(req, res, next) {
@@ -318,3 +320,17 @@ exports.awsEnabled = function() {
     return next();
   };
 };
+
+exports.formValid = function() {
+  return function(req, res, next) {
+    const errObjArray = validationResult(req);
+    if (errObjArray.isEmpty()) {
+      return next();
+    }
+
+    const errs = errObjArray.array().map((err) => { return err.msg }).join('\n');
+    logger.error(errs);
+
+    return res.json(ApiResponse.error(errs));
+  };
+};

+ 9 - 1
yarn.lock

@@ -3882,6 +3882,14 @@ express-session@^1.16.1:
     safe-buffer "5.1.2"
     uid-safe "~2.1.5"
 
+express-validator@^5.3.1:
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/express-validator/-/express-validator-5.3.1.tgz#6f42c6d52554441b0360c40ccfb555b1770affe2"
+  integrity sha512-g8xkipBF6VxHbO1+ksC7nxUU7+pWif0+OZXjZTybKJ/V0aTVhuCoHbyhIPgSYVldwQLocGExPtB2pE0DqK4jsw==
+  dependencies:
+    lodash "^4.17.10"
+    validator "^10.4.0"
+
 express-webpack-assets@^0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/express-webpack-assets/-/express-webpack-assets-0.1.0.tgz#000fb3413eb0d512cbd6cd3f6a10b5e70dbe0079"
@@ -10927,7 +10935,7 @@ validate-npm-package-license@^3.0.1:
     spdx-correct "~1.0.0"
     spdx-expression-parse "~1.0.0"
 
-validator@>=10.11.0, validator@^10.0.0:
+validator@>=10.11.0, validator@^10.0.0, validator@^10.4.0:
   version "10.11.0"
   resolved "https://registry.yarnpkg.com/validator/-/validator-10.11.0.tgz#003108ea6e9a9874d31ccc9e5006856ccd76b228"
   integrity sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==