Browse Source

Merge pull request #1603 from weseek/reactify-admin/null-values-​​are-not-saved

Reactify admin/null values ​​are not saved(WIP)
Yuki Takei 6 năm trước cách đây
mục cha
commit
107dca870e

+ 12 - 5
src/client/js/services/AdminTwitterSecurityContainer.js

@@ -4,6 +4,7 @@ import loggerFactory from '@alias/logger';
 import { pathUtils } from 'growi-commons';
 
 import urljoin from 'url-join';
+import removeNullPropertyFromObject from '../../../lib/util/removeNullPropertyFromObject';
 
 // eslint-disable-next-line no-unused-vars
 const logger = loggerFactory('growi:security:AdminTwitterSecurityContainer');
@@ -26,6 +27,7 @@ export default class AdminTwitterSecurityContainer extends Container {
       isSameUsernameTreatedAsIdenticalUser: false,
     };
 
+    this.updateTwitterSetting = this.updateTwitterSetting.bind(this);
   }
 
   /**
@@ -73,12 +75,17 @@ export default class AdminTwitterSecurityContainer extends Container {
    * Update twitterSetting
    */
   async updateTwitterSetting() {
+    const { twitterConsumerKey, twitterConsumerSecret, isSameUsernameTreatedAsIdenticalUser } = this.state;
 
-    const response = await this.appContainer.apiv3.put('/security-setting/twitter-oauth', {
-      twitterConsumerKey: this.state.twitterConsumerKey,
-      twitterConsumerSecret: this.state.twitterConsumerSecret,
-      isSameUsernameTreatedAsIdenticalUser: this.state.isSameUsernameTreatedAsIdenticalUser,
-    });
+    let requestParams = {
+      twitterConsumerKey,
+      twitterConsumerSecret,
+      isSameUsernameTreatedAsIdenticalUser,
+    };
+
+    requestParams = removeNullPropertyFromObject(requestParams);
+
+    const response = await this.appContainer.apiv3.put('/security-setting/twitter-oauth', requestParams);
 
     const { securitySettingParams } = response.data;
 

+ 12 - 0
src/lib/util/removeNullPropertyFromObject.js

@@ -0,0 +1,12 @@
+// remove property if value is null
+
+const removeNullPropertyFromObject = (object) => {
+
+  for (const [key, value] of Object.entries(object)) {
+    if (value == null) { delete object[key] }
+  }
+
+  return object;
+};
+
+module.exports = removeNullPropertyFromObject;

+ 8 - 4
src/server/routes/apiv3/security-setting.js

@@ -11,6 +11,7 @@ const router = express.Router();
 
 const { body } = require('express-validator/check');
 const ErrorV3 = require('../../models/vo/error-apiv3');
+const removeNullPropertyFromObject = require('../../../lib/util/removeNullPropertyFromObject');
 
 const validator = {
   generalSetting: [
@@ -86,9 +87,9 @@ const validator = {
     body('isSameUsernameTreatedAsIdenticalUser').isBoolean(),
   ],
   twitterOAuth: [
-    body('twitterConsumerKey').isString(),
-    body('twitterConsumerSecret').isString(),
-    body('isSameUsernameTreatedAsIdenticalUser').isBoolean(),
+    body('twitterConsumerKey').if((value, { req }) => req.body.twitterConsumerKey).isString(),
+    body('twitterConsumerSecret').if((value, { req }) => req.body.twitterConsumerSecret).isString(),
+    body('isSameUsernameTreatedAsIdenticalUser').if((value, { req }) => req.body.isSameUsernameTreatedAsIdenticalUser).isBoolean(),
   ],
 };
 
@@ -888,12 +889,15 @@ module.exports = (crowi) => {
    *                  $ref: '#/components/schemas/TwitterOAuthSetting'
    */
   router.put('/twitter-oauth', loginRequiredStrictly, adminRequired, csrf, validator.twitterOAuth, ApiV3FormValidator, async(req, res) => {
-    const requestParams = {
+
+    let requestParams = {
       'security:passport-twitter:consumerKey': req.body.twitterConsumerKey,
       'security:passport-twitter:consumerSecret': req.body.twitterConsumerSecret,
       'security:passport-twitter:isSameUsernameTreatedAsIdenticalUser': req.body.isSameUsernameTreatedAsIdenticalUser,
     };
 
+    requestParams = removeNullPropertyFromObject(requestParams);
+
     try {
       await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestParams);
       await crowi.passportService.setupStrategyById('twitter');