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

Merge pull request #1505 from weseek/reactify-admin/create-apiV3-update-slack-app-config

Reactify admin/create api v3 update slack app config
Yuki Takei 6 лет назад
Родитель
Сommit
a25fcf0555

+ 23 - 1
src/client/js/components/Admin/Notification/NotificationSetting.jsx

@@ -2,14 +2,35 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import PropTypes from 'prop-types';
 import { withTranslation } from 'react-i18next';
 import { withTranslation } from 'react-i18next';
 
 
+import loggerFactory from '@alias/logger';
+
 import { createSubscribedElement } from '../../UnstatedUtils';
 import { createSubscribedElement } from '../../UnstatedUtils';
+import { toastError } from '../../../util/apiNotification';
 
 
 import AppContainer from '../../../services/AppContainer';
 import AppContainer from '../../../services/AppContainer';
+import AdminNotificationContainer from '../../../services/AdminNotificationContainer';
+
 import SlackAppConfiguration from './SlackAppConfiguration';
 import SlackAppConfiguration from './SlackAppConfiguration';
 import UserTriggerNotification from './UserTriggerNotification';
 import UserTriggerNotification from './UserTriggerNotification';
 
 
+const logger = loggerFactory('growi:NotificationSetting');
+
 class NotificationSetting extends React.Component {
 class NotificationSetting extends React.Component {
 
 
+  async componentDidMount() {
+    const { adminNotificationContainer } = this.props;
+
+    try {
+      await adminNotificationContainer.retrieveNotificationData();
+    }
+    catch (err) {
+      toastError(err);
+      adminNotificationContainer.setState({ retrieveError: err });
+      logger.error(err);
+    }
+
+  }
+
   render() {
   render() {
 
 
     return (
     return (
@@ -45,12 +66,13 @@ class NotificationSetting extends React.Component {
 }
 }
 
 
 const NotificationSettingWrapper = (props) => {
 const NotificationSettingWrapper = (props) => {
-  return createSubscribedElement(NotificationSetting, props, [AppContainer]);
+  return createSubscribedElement(NotificationSetting, props, [AppContainer, AdminNotificationContainer]);
 };
 };
 
 
 NotificationSetting.propTypes = {
 NotificationSetting.propTypes = {
   t: PropTypes.func.isRequired, // i18next
   t: PropTypes.func.isRequired, // i18next
   appContainer: PropTypes.instanceOf(AppContainer).isRequired,
   appContainer: PropTypes.instanceOf(AppContainer).isRequired,
+  adminNotificationContainer: PropTypes.instanceOf(AdminNotificationContainer).isRequired,
 
 
 };
 };
 
 

+ 1 - 5
src/client/js/components/Admin/Notification/SlackAppConfiguration.jsx

@@ -18,10 +18,6 @@ class SlackAppConfiguration extends React.Component {
   constructor(props) {
   constructor(props) {
     super(props);
     super(props);
 
 
-    this.state = {
-      retrieveError: null,
-    };
-
     this.onClickSubmit = this.onClickSubmit.bind(this);
     this.onClickSubmit = this.onClickSubmit.bind(this);
   }
   }
 
 
@@ -142,7 +138,7 @@ class SlackAppConfiguration extends React.Component {
 
 
         <AdminUpdateButtonRow
         <AdminUpdateButtonRow
           onClick={this.onClickSubmit}
           onClick={this.onClickSubmit}
-          disabled={this.state.retrieveError != null}
+          disabled={adminNotificationContainer.state.retrieveError != null}
         />
         />
 
 
         <hr />
         <hr />

+ 14 - 1
src/client/js/services/AdminNotificationContainer.js

@@ -12,6 +12,7 @@ export default class AdminNotificationContainer extends Container {
     this.appContainer = appContainer;
     this.appContainer = appContainer;
 
 
     this.state = {
     this.state = {
+      retrieveError: null,
       selectSlackOption: 'Incoming Webhooks',
       selectSlackOption: 'Incoming Webhooks',
       webhookUrl: '',
       webhookUrl: '',
       isIncomingWebhookPrioritized: false,
       isIncomingWebhookPrioritized: false,
@@ -28,6 +29,13 @@ export default class AdminNotificationContainer extends Container {
     return 'AdminNotificationContainer';
     return 'AdminNotificationContainer';
   }
   }
 
 
+  /**
+   * Retrieve notificationData
+   */
+  retrieveNotificationData() {
+    // TODO GW-821 retrive data from api
+  }
+
   /**
   /**
    * Switch slackOption
    * Switch slackOption
    */
    */
@@ -61,8 +69,13 @@ export default class AdminNotificationContainer extends Container {
    * @memberOf SlackAppConfiguration
    * @memberOf SlackAppConfiguration
    */
    */
   async updateSlackAppConfiguration() {
   async updateSlackAppConfiguration() {
-    // TODO GW-794 create apiV3 updateSlackAppConfiguration
+    const response = await this.appContainer.apiv3.put('/notification-setting/slack-configuration', {
+      webhookUrl: this.state.webhookUrl,
+      isIncomingWebhookPrioritized: this.state.isIncomingWebhookPrioritized,
+      slackToken: this.state.slackToken,
+    });
 
 
+    return response;
   }
   }
 
 
   /**
   /**

+ 2 - 0
src/server/routes/apiv3/index.js

@@ -17,6 +17,8 @@ module.exports = (crowi) => {
 
 
   router.use('/customize-setting', require('./customize-setting')(crowi));
   router.use('/customize-setting', require('./customize-setting')(crowi));
 
 
+  router.use('/notification-setting', require('./notification-setting')(crowi));
+
   router.use('/users', require('./users')(crowi));
   router.use('/users', require('./users')(crowi));
 
 
   router.use('/user-groups', require('./user-group')(crowi));
   router.use('/user-groups', require('./user-group')(crowi));

+ 1 - 2
src/server/routes/apiv3/markdown-setting.js

@@ -1,7 +1,6 @@
 const loggerFactory = require('@alias/logger');
 const loggerFactory = require('@alias/logger');
 
 
-// eslint-disable-next-line no-unused-vars
-const logger = loggerFactory('growi:routes:apiv3:user-group');
+const logger = loggerFactory('growi:routes:apiv3:markdown-setting');
 
 
 const express = require('express');
 const express = require('express');
 
 

+ 102 - 0
src/server/routes/apiv3/notification-setting.js

@@ -0,0 +1,102 @@
+const loggerFactory = require('@alias/logger');
+
+// eslint-disable-next-line no-unused-vars
+const logger = loggerFactory('growi:routes:apiv3:notification-setting');
+
+const express = require('express');
+
+const router = express.Router();
+
+const { body } = require('express-validator/check');
+
+const ErrorV3 = require('../../models/vo/error-apiv3');
+
+const validator = {
+  slackConfiguration: [
+    body('webhookUrl').isString(),
+    body('isIncomingWebhookPrioritized').isBoolean(),
+    body('slackToken').isString(),
+  ],
+};
+
+/**
+ * @swagger
+ *  tags:
+ *    name: NotificationSetting
+ */
+
+/**
+ * @swagger
+ *
+ *  components:
+ *    schemas:
+ *      SlackConfigurationParams:
+ *        type: object
+ *        properties:
+ *          webhookUrl:
+ *            type: string
+ *            description: incoming webhooks url
+ *          isIncomingWebhookPrioritized:
+ *            type: boolean
+ *            description: use incoming webhooks even if Slack App settings are enabled
+ *          slackToken:
+ *            type: string
+ *            description: OAuth access token
+ */
+module.exports = (crowi) => {
+  const loginRequiredStrictly = require('../../middleware/login-required')(crowi);
+  const adminRequired = require('../../middleware/admin-required')(crowi);
+  const csrf = require('../../middleware/csrf')(crowi);
+
+  const { ApiV3FormValidator } = crowi.middlewares;
+
+  /**
+   * @swagger
+   *
+   *    /notification-setting/slack-configuration:
+   *      put:
+   *        tags: [NotificationSetting]
+   *        description: Update slack configuration setting
+   *        requestBody:
+   *          required: true
+   *          content:
+   *            application/json:
+   *              schema:
+   *                $ref: '#/components/schemas/SlackConfigurationParams'
+   *        responses:
+   *          200:
+   *            description: Succeeded to update slack configuration setting
+   *            content:
+   *              application/json:
+   *                schema:
+   *                  $ref: '#/components/schemas/SlackConfigurationParams'
+   */
+  router.put('/slack-configuration', loginRequiredStrictly, adminRequired, csrf, validator.slackConfiguration, ApiV3FormValidator, async(req, res) => {
+
+    const requestParams = {
+      'slack:incomingWebhookUrl': req.body.webhookUrl,
+      'slack:isIncomingWebhookPrioritized': req.body.isIncomingWebhookPrioritized,
+      'slack:token': req.body.slackToken,
+    };
+
+    try {
+      await crowi.configManager.updateConfigsInTheSameNamespace('notification', requestParams);
+      const responseParams = {
+        webhookUrl: await crowi.configManager.getConfig('notification', 'slack:incomingWebhookUrl'),
+        isIncomingWebhookPrioritized: await crowi.configManager.getConfig('notification', 'slack:isIncomingWebhookPrioritized'),
+        slackToken: await crowi.configManager.getConfig('notification', 'slack:token'),
+      };
+      await crowi.setupSlack();
+      return res.apiv3({ responseParams });
+    }
+    catch (err) {
+      const msg = 'Error occurred in updating slack configuration';
+      logger.error('Error', err);
+      return res.apiv3Err(new ErrorV3(msg, 'update-slackConfiguration-failed'));
+    }
+
+  });
+
+
+  return router;
+};