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

Merge pull request #3737 from weseek/imprv/5907-5931-replacement

Imprv/5907 5931 replacement
itizawa 4 лет назад
Родитель
Сommit
d67ad0ec3b
2 измененных файлов с 102 добавлено и 80 удалено
  1. 3 3
      .github/workflows/ci.yml
  2. 99 77
      src/server/routes/apiv3/slack-integration-settings.js

+ 3 - 3
.github/workflows/ci.yml

@@ -12,9 +12,9 @@ on:
       - .eslint*
       - .prettier*
       - .stylelint*
-      - config
-      - resource
-      - src
+      - config/**
+      - resource/**
+      - src/**
       - package.json
       - yarn.lock
 

+ 99 - 77
src/server/routes/apiv3/slack-integration-settings.js

@@ -2,6 +2,7 @@ const mongoose = require('mongoose');
 const express = require('express');
 const { body } = require('express-validator');
 const axios = require('axios');
+const urljoin = require('url-join');
 const loggerFactory = require('@alias/logger');
 
 const { getConnectionStatuses } = require('@growi/slack');
@@ -15,7 +16,7 @@ const router = express.Router();
 /**
  * @swagger
  *  tags:
- *    name: SlackIntegration
+ *    name: SlackIntegrationSettings
  */
 
 /**
@@ -33,6 +34,11 @@ const router = express.Router();
  *            type: string
  *          currentBotType:
  *            type: string
+ *      BotType:
+ *        description: CustomBotWithoutProxy
+ *        properties:
+ *          currentBotType:
+ *            type: string
  *      SlackIntegration:
  *        description: SlackIntegration
  *        type: object
@@ -49,6 +55,8 @@ module.exports = (crowi) => {
   const csrf = require('../../middlewares/csrf')(crowi);
   const apiV3FormValidator = require('../../middlewares/apiv3-form-validator')(crowi);
 
+  const SlackAppIntegration = mongoose.model('SlackAppIntegration');
+
   const validator = {
     BotType: [
       body('currentBotType').isString(),
@@ -82,9 +90,9 @@ module.exports = (crowi) => {
 
   async function getConnectionStatusesFromProxy(tokens) {
     const csv = tokens.join(',');
+    const proxyUri = crowi.configManager.getConfig('crowi', 'slackbot:serverUri');
 
-    // TODO: retrieve proxy url from configManager
-    const result = await axios.get('http://localhost:8080/g2s/connection-status', {
+    const result = await axios.get(urljoin(proxyUri, '/g2s/connection-status'), {
       headers: {
         'x-growi-gtop-tokens': csv,
       },
@@ -96,7 +104,7 @@ module.exports = (crowi) => {
   /**
    * @swagger
    *
-   *    /slack-integration/:
+   *    /slack-integration-settings/:
    *      get:
    *        tags: [SlackBotSettingParams]
    *        operationId: getSlackBotSettingParams
@@ -107,6 +115,7 @@ module.exports = (crowi) => {
    *            description: Succeeded to get info.
    */
   router.get('/', accessTokenParser, loginRequiredStrictly, adminRequired, async(req, res) => {
+
     const { configManager } = crowi;
     const currentBotType = configManager.getConfig('crowi', 'slackbot:currentBotType');
 
@@ -119,14 +128,10 @@ module.exports = (crowi) => {
       settings.slackBotToken = configManager.getConfig('crowi', 'slackbot:token');
     }
     else {
-      // settings.proxyUriEnvVars = ;
-      // settings.proxyUri = ;
-      // settings.tokenPtoG = ;
-      // settings.tokenGtoP = ;
+      settings.proxyUri = crowi.configManager.getConfig('crowi', 'slackbot:serverUri');
+      settings.proxyUriEnvVars = configManager.getConfigFromEnvVars('crowi', 'slackbot:serverUri');
     }
 
-    // TODO: try-catch
-
     // retrieve connection statuses
     let connectionStatuses;
     if (currentBotType == null) {
@@ -136,13 +141,35 @@ module.exports = (crowi) => {
       const token = settings.slackBotToken;
       // check the token is not null
       if (token != null) {
-        connectionStatuses = await getConnectionStatuses([token]);
+        try {
+          connectionStatuses = await getConnectionStatuses([token]);
+        }
+        catch (error) {
+          const msg = 'Error occured in getting connection statuses';
+          logger.error('Error', error);
+          return res.apiv3Err(new ErrorV3(msg, 'get-connection-failed'), 500);
+        }
       }
     }
     else {
-      // TODO: retrieve tokenGtoPs from DB
-      const tokenGtoPs = ['gtop1'];
-      connectionStatuses = (await getConnectionStatusesFromProxy(tokenGtoPs)).connectionStatuses;
+      const proxyUri = settings.proxyUri;
+
+      if (proxyUri != null) {
+        try {
+          const slackAppIntegrations = await SlackAppIntegration.find();
+          settings.slackAppIntegrations = slackAppIntegrations;
+
+          if (slackAppIntegrations.length > 0) {
+            const tokenGtoPs = slackAppIntegrations.map(slackAppIntegration => slackAppIntegration.tokenGtoP);
+            connectionStatuses = (await getConnectionStatusesFromProxy(tokenGtoPs)).connectionStatuses;
+          }
+        }
+        catch (error) {
+          const msg = 'Error occured in getting connection statuses';
+          logger.error('Error', error);
+          return res.apiv3Err(new ErrorV3(msg, 'get-connection-failed'), 500);
+        }
+      }
     }
 
     return res.apiv3({ currentBotType, settings, connectionStatuses });
@@ -151,7 +178,7 @@ module.exports = (crowi) => {
   /**
    * @swagger
    *
-   *    /slack-integration/:
+   *    /slack-integration-settings/:
    *      put:
    *        tags: [SlackIntegration]
    *        operationId: putSlackIntegration
@@ -167,35 +194,34 @@ module.exports = (crowi) => {
    *           200:
    *             description: Succeeded to put Slack Integration setting.
    */
-  router.put('/',
-    accessTokenParser, loginRequiredStrictly, adminRequired, csrf, validator.SlackIntegration, apiV3FormValidator, async(req, res) => {
-      const { currentBotType } = req.body;
+  router.put('/', accessTokenParser, loginRequiredStrictly, adminRequired, csrf, validator.SlackIntegration, apiV3FormValidator, async(req, res) => {
+    const { currentBotType } = req.body;
 
-      const requestParams = {
-        'slackbot:currentBotType': currentBotType,
-      };
+    const requestParams = {
+      'slackbot:currentBotType': currentBotType,
+    };
 
-      try {
-        await updateSlackBotSettings(requestParams);
-        crowi.slackBotService.publishUpdatedMessage();
+    try {
+      await updateSlackBotSettings(requestParams);
+      crowi.slackBotService.publishUpdatedMessage();
 
-        const slackIntegrationSettingsParams = {
-          currentBotType: crowi.configManager.getConfig('crowi', 'slackbot:currentBotType'),
-        };
-        return res.apiv3({ slackIntegrationSettingsParams });
-      }
-      catch (error) {
-        const msg = 'Error occured in updating Slack bot setting';
-        logger.error('Error', error);
-        return res.apiv3Err(new ErrorV3(msg, 'update-SlackIntegrationSetting-failed'), 500);
-      }
-    });
+      const slackIntegrationSettingsParams = {
+        currentBotType: crowi.configManager.getConfig('crowi', 'slackbot:currentBotType'),
+      };
+      return res.apiv3({ slackIntegrationSettingsParams });
+    }
+    catch (error) {
+      const msg = 'Error occured in updating Slack bot setting';
+      logger.error('Error', error);
+      return res.apiv3Err(new ErrorV3(msg, 'update-SlackIntegrationSetting-failed'), 500);
+    }
+  });
 
 
   /**
    * @swagger
    *
-   *    /slack-integration/bot-type/:
+   *    /slack-integration-settings/bot-type/:
    *      put:
    *        tags: [botType]
    *        operationId: putBotType
@@ -206,32 +232,31 @@ module.exports = (crowi) => {
    *          content:
    *            application/json:
    *              schema:
-   *                $ref: '#/components/schemas/botType'
+   *                $ref: '#/components/schemas/BotType'
    *        responses:
    *           200:
    *             description: Succeeded to put botType setting.
    */
-  router.put('/bot-type',
-    accessTokenParser, loginRequiredStrictly, adminRequired, csrf, validator.BotType, apiV3FormValidator, async(req, res) => {
-      const { currentBotType } = req.body;
+  router.put('/bot-type', accessTokenParser, loginRequiredStrictly, adminRequired, csrf, validator.BotType, apiV3FormValidator, async(req, res) => {
+    const { currentBotType } = req.body;
 
-      await resetAllBotSettings();
-      const requestParams = { 'slackbot:currentBotType': currentBotType };
+    await resetAllBotSettings();
+    const requestParams = { 'slackbot:currentBotType': currentBotType };
 
-      try {
-        await updateSlackBotSettings(requestParams);
-        crowi.slackBotService.publishUpdatedMessage();
+    try {
+      await updateSlackBotSettings(requestParams);
+      crowi.slackBotService.publishUpdatedMessage();
 
-        // TODO Impl to delete AccessToken both of Proxy and GROWI when botType changes.
-        const slackBotTypeParam = { slackBotType: crowi.configManager.getConfig('crowi', 'slackbot:currentBotType') };
-        return res.apiv3({ slackBotTypeParam });
-      }
-      catch (error) {
-        const msg = 'Error occured in updating Custom bot setting';
-        logger.error('Error', error);
-        return res.apiv3Err(new ErrorV3(msg, 'update-CustomBotSetting-failed'), 500);
-      }
-    });
+      // TODO Impl to delete AccessToken both of Proxy and GROWI when botType changes.
+      const slackBotTypeParam = { slackBotType: crowi.configManager.getConfig('crowi', 'slackbot:currentBotType') };
+      return res.apiv3({ slackBotTypeParam });
+    }
+    catch (error) {
+      const msg = 'Error occured in updating Custom bot setting';
+      logger.error('Error', error);
+      return res.apiv3Err(new ErrorV3(msg, 'update-CustomBotSetting-failed'), 500);
+    }
+  });
 
   /**
    * @swagger
@@ -246,36 +271,35 @@ module.exports = (crowi) => {
    *          content:
    *            application/json:
    *              schema:
-   *                $ref: '#/components/schemas/botType'
+   *                $ref: '#/components/schemas/BotType'
    *        responses:
    *           200:
    *             description: Succeeded to delete botType setting.
    */
-  router.delete('/bot-type',
-    accessTokenParser, loginRequiredStrictly, adminRequired, csrf, apiV3FormValidator, async(req, res) => {
+  router.delete('/bot-type', accessTokenParser, loginRequiredStrictly, adminRequired, csrf, apiV3FormValidator, async(req, res) => {
 
-      await resetAllBotSettings();
-      const params = { 'slackbot:currentBotType': null };
+    await resetAllBotSettings();
+    const params = { 'slackbot:currentBotType': null };
 
-      try {
-        await updateSlackBotSettings(params);
-        crowi.slackBotService.publishUpdatedMessage();
+    try {
+      await updateSlackBotSettings(params);
+      crowi.slackBotService.publishUpdatedMessage();
 
-        // TODO Impl to delete AccessToken both of Proxy and GROWI when botType changes.
-        const slackBotTypeParam = { slackBotType: crowi.configManager.getConfig('crowi', 'slackbot:currentBotType') };
-        return res.apiv3({ slackBotTypeParam });
-      }
-      catch (error) {
-        const msg = 'Error occured in updating Custom bot setting';
-        logger.error('Error', error);
-        return res.apiv3Err(new ErrorV3(msg, 'update-CustomBotSetting-failed'), 500);
-      }
-    });
+      // TODO Impl to delete AccessToken both of Proxy and GROWI when botType changes.
+      const slackBotTypeParam = { slackBotType: crowi.configManager.getConfig('crowi', 'slackbot:currentBotType') };
+      return res.apiv3({ slackBotTypeParam });
+    }
+    catch (error) {
+      const msg = 'Error occured in updating Custom bot setting';
+      logger.error('Error', error);
+      return res.apiv3Err(new ErrorV3(msg, 'update-CustomBotSetting-failed'), 500);
+    }
+  });
 
   /**
    * @swagger
    *
-   *    /slack-integration/without-proxy/update-settings/:
+   *    /slack-integration-settings/without-proxy/update-settings/:
    *      put:
    *        tags: [UpdateWithoutProxySettings]
    *        operationId: putWithoutProxySettings
@@ -318,7 +342,7 @@ module.exports = (crowi) => {
   /**
    * @swagger
    *
-   *    /slack-integration/access-tokens:
+   *    /slack-integration-settings/access-tokens:
    *      put:
    *        tags: [SlackIntegration]
    *        operationId: putAccessTokens
@@ -329,7 +353,6 @@ module.exports = (crowi) => {
    *            description: Succeeded to update access tokens for slack
    */
   router.put('/access-tokens', loginRequiredStrictly, adminRequired, csrf, async(req, res) => {
-    const SlackAppIntegration = mongoose.model('SlackAppIntegration');
     let checkTokens;
     let tokenGtoP;
     let tokenPtoG;
@@ -354,7 +377,6 @@ module.exports = (crowi) => {
 
   router.put('/proxy-uri', loginRequiredStrictly, adminRequired, csrf, async(req, res) => {
     const { proxyUri } = req.body;
-    console.log('proxyUri', proxyUri);
 
     const requestParams = { 'slackbot:serverUri': proxyUri };