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

Merge branch 'feat/growi-bot' into feat/create-endpoint-to-save-slack-bot-tokens

zahmis 5 лет назад
Родитель
Сommit
46f1033200

+ 1 - 0
packages/slack/package.json

@@ -15,6 +15,7 @@
     "test:lint:fix": "eslint src --ext .ts --fix"
   },
   "dependencies": {
+    "axios": "^0.21.1",
     "browser-bunyan": "^1.6.3",
     "bunyan": "^1.8.15",
     "dotenv-flow": "^3.2.0",

+ 1 - 0
packages/slack/src/index.ts

@@ -12,6 +12,7 @@ export * from './interfaces/request-from-slack';
 export * from './models/errors';
 export * from './middlewares/verify-slack-request';
 export * from './utils/block-creater';
+export * from './utils/check-communicable-to-api-server';
 export * from './utils/post-ephemeral-errors';
 export * from './utils/slash-command-parser';
 export * from './utils/webclient-factory';

+ 10 - 0
packages/slack/src/utils/check-communicable-to-api-server.ts

@@ -0,0 +1,10 @@
+import axios, { AxiosError } from 'axios';
+
+export const checkCommunicableToApiServer = async(serverUri = 'https://slack.com/api/'): Promise<void|AxiosError> => {
+  try {
+    await axios.get(serverUri, { maxRedirects: 0 });
+  }
+  catch (err) {
+    return err as AxiosError;
+  }
+};

+ 1 - 1
src/client/js/components/Admin/SlackIntegration/DeleteSlackBotSettingsModal.jsx

@@ -46,7 +46,7 @@ const DeleteSlackBotSettingsModal = React.memo((props) => {
         <Button onClick={closeButtonHandler}>{t('Cancel')}</Button>
         <Button color="danger" onClick={deleteSlackCredentialsHandler}>
           <i className="icon icon-fire"></i>
-          {t('Reset')}
+          {t('admin:slack_integration.reset')}
         </Button>
       </ModalFooter>
     </Modal>

+ 0 - 84
src/server/routes/apiv3/slack-integration-settings.js

@@ -107,7 +107,6 @@ module.exports = (crowi) => {
         slackBotTokenEnvVars: crowi.configManager.getConfigFromEnvVars('crowi', 'slackbot:token'),
         slackSigningSecret: crowi.configManager.getConfig('crowi', 'slackbot:signingSecret'),
         slackBotToken: crowi.configManager.getConfig('crowi', 'slackbot:token'),
-        isConnectedToSlack: crowi.slackBotService.isConnectedToSlack,
       },
       // TODO imple when creating with proxy
       customBotWithProxySettings: {
@@ -147,9 +146,6 @@ module.exports = (crowi) => {
 
       try {
         await updateSlackBotSettings(requestParams);
-
-        // initialize slack service
-        await crowi.slackBotService.initialize();
         crowi.slackBotService.publishUpdatedMessage();
 
         const slackIntegrationSettingsParams = {
@@ -193,9 +189,6 @@ module.exports = (crowi) => {
       };
       try {
         await updateSlackBotSettings(requestParams);
-
-        // initialize slack service
-        await crowi.slackBotService.initialize();
         crowi.slackBotService.publishUpdatedMessage();
 
         // TODO Impl to delete AccessToken both of Proxy and GROWI when botType changes.
@@ -270,82 +263,5 @@ module.exports = (crowi) => {
     }
   });
 
-  /**
-   * @swagger
-   *
-   *    /slack-integration/test-notification-to-slack-work-space:
-   *      post:
-   *        tags: [SlackTestToWorkSpace]
-   *        operationId: postSlackMessageToSlackWorkSpace
-   *        summary: test to send message to slack work space
-   *        description: post message to slack work space
-   *        responses:
-   *          200:
-   *            description: Succeeded to send a message to slack work space
-   */
-  router.post('/notification-test-to-slack-work-space',
-    loginRequiredStrictly, adminRequired, csrf, validator.NotificationTestToSlackWorkSpace, apiV3FormValidator, async(req, res) => {
-      const isConnectedToSlack = crowi.slackBotService.isConnectedToSlack;
-      const { channel } = req.body;
-
-      if (isConnectedToSlack === false) {
-        const msg = 'Bot User OAuth Token is not setup.';
-        logger.error('Error', msg);
-        return res.apiv3Err(new ErrorV3(msg, 'not-setup-slack-bot-token', 400));
-      }
-
-      const slackBotToken = crowi.configManager.getConfig('crowi', 'slackbot:token');
-      this.client = new WebClient(slackBotToken, { logLevel: LogLevel.DEBUG });
-      logger.debug('SlackBot: setup is done');
-
-      try {
-        await this.client.chat.postMessage({
-          channel: `#${channel}`,
-          text: 'Your test was successful!',
-        });
-        logger.info(`SlackTest: send success massage to slack work space at #${channel}.`);
-        logger.info(`If you do not receive a message, you may not have invited the bot to the #${channel} channel.`);
-        // eslint-disable-next-line max-len
-        const message = `Successfully send message to Slack work space. See #general channel. If you do not receive a message, you may not have invited the bot to the #${channel} channel.`;
-        return res.apiv3({ message });
-      }
-      catch (error) {
-        const msg = `Error: ${error.data.error}. Needed:${error.data.needed}`;
-        logger.error('Error', error);
-        return res.apiv3Err(new ErrorV3(msg, 'notification-test-slack-work-space-failed'), 500);
-      }
-    });
-
-  /**
-   * @swagger
-   *
-   *    /slack-integration/access-token:
-   *      delete:
-   *        tags: [SlackIntegration]
-   *        operationId: deleteAccessTokenForSlackBot
-   *        summary: /slack-integration
-   *        description: Delete accessToken
-   *        responses:
-   *          200:
-   *            description: Succeeded to delete accessToken
-   */
-  router.delete('/access-token', loginRequiredStrictly, adminRequired, csrf, async(req, res) => {
-
-    try {
-      await updateSlackBotSettings({ 'slackbot:access-token': null });
-
-      // initialize slack service
-      await crowi.slackBotService.initialize();
-      crowi.slackBotService.publishUpdatedMessage();
-
-      return res.apiv3({});
-    }
-    catch (error) {
-      const msg = 'Error occured in discard of slackbotAccessToken';
-      logger.error('Error', error);
-      return res.apiv3Err(new ErrorV3(msg, 'discard-slackbotAccessToken-failed'), 500);
-    }
-  });
-
   return router;
 };

+ 0 - 6
src/server/service/config-loader.js

@@ -410,12 +410,6 @@ const ENV_VAR_NAME_TO_CONFIG_INFO = {
     type:    TYPES.STRING,
     default: null,
   },
-  SLACK_BOT_ACCESS_TOKEN: {
-    ns:      'crowi',
-    key:     'slackbot:access-token',
-    type:    TYPES.STRING,
-    default: null,
-  },
   SLACK_BOT_TYPE: {
     ns:      'crowi',
     key:     'slackbot:currentBotType', // 'officialBot' || 'customBotWithoutProxy' || 'customBotWithProxy'

+ 21 - 26
src/server/service/slackbot.js

@@ -1,10 +1,10 @@
 const logger = require('@alias/logger')('growi:service:SlackBotService');
 const mongoose = require('mongoose');
 
-const PAGINGLIMIT = 10;
-
 const { generateWebClient } = require('@growi/slack');
 
+const PAGINGLIMIT = 10;
+
 const S2sMessage = require('../models/vo/s2s-message');
 const S2sMessageHandlable = require('./s2s-messaging/handlable');
 
@@ -16,40 +16,36 @@ class SlackBotService extends S2sMessageHandlable {
     this.crowi = crowi;
     this.s2sMessagingService = crowi.s2sMessagingService;
 
-    this.client = null;
-    this.searchService = null;
-
-    this.isConnectedToSlack = false;
-
     this.lastLoadedAt = null;
 
     this.initialize();
   }
 
-  async initialize() {
-    this.isConnectedToSlack = false;
+  initialize() {
+    this.lastLoadedAt = new Date();
+  }
+
+  get client() {
     const currentBotType = this.crowi.configManager.getConfig('crowi', 'slackbot:currentBotType');
 
-    if (currentBotType != null) {
-      let serverUri;
-      let token;
+    if (currentBotType == null) {
+      throw new Error('The config \'SLACK_BOT_TYPE\'(ns: \'crowi\', key: \'slackbot:currentBotType\') must be set.');
+    }
 
-      // connect to proxy
-      if (currentBotType !== 'customBotWithoutProxy') {
-        // TODO: https://youtrack.weseek.co.jp/issue/GW-5896
-        serverUri = 'http://localhost:8080/slack-api-proxy/';
-      }
-      // connect directly
-      else {
-        token = this.crowi.configManager.getConfig('crowi', 'slackbot:token');
-      }
+    let serverUri;
+    let token;
 
-      this.client = generateWebClient(token, serverUri);
-      logger.debug('SlackBot: setup is done');
-      await this.sendAuthTest();
+    // connect to proxy
+    if (currentBotType !== 'customBotWithoutProxy') {
+      // TODO: https://youtrack.weseek.co.jp/issue/GW-5896
+      serverUri = 'http://localhost:8080/slack-api-proxy/';
+    }
+    // connect directly
+    else {
+      token = this.crowi.configManager.getConfig('crowi', 'slackbot:token');
     }
 
-    this.lastLoadedAt = new Date();
+    return generateWebClient(token, serverUri);
   }
 
   /**
@@ -93,7 +89,6 @@ class SlackBotService extends S2sMessageHandlable {
 
   async sendAuthTest() {
     await this.client.api.test();
-    this.isConnectedToSlack = true;
   }
 
   notCommand(body) {