Browse Source

Merge pull request #3842 from weseek/imprv/refactor-test-to-slack

Imprv/refactor test to slack
Yuki Takei 4 năm trước cách đây
mục cha
commit
0b4aeacee7

+ 24 - 24
packages/slack/src/utils/check-communicable.ts

@@ -67,6 +67,29 @@ const retrieveWorkspaceName = async(client: WebClient): Promise<string> => {
   return (result as any).team?.name;
 };
 
+/**
+ * @param token bot OAuth token
+ * @returns
+ */
+export const getConnectionStatus = async(token:string): Promise<ConnectionStatus> => {
+  const client = generateWebClient(token);
+  const status: ConnectionStatus = {};
+
+  try {
+    // try to connect
+    const resultTestSlackApiServer = await testSlackApiServer(client);
+    // check scope
+    await checkSlackScopes(resultTestSlackApiServer);
+    // retrieve workspace name
+    status.workspaceName = await retrieveWorkspaceName(client);
+  }
+  catch (err) {
+    status.error = err;
+  }
+
+  return status;
+};
+
 /**
  * Get token string to ConnectionStatus map
  * @param tokens Array of bot OAuth token
@@ -76,23 +99,10 @@ export const getConnectionStatuses = async(tokens: string[]): Promise<{[key: str
   const map = tokens
     .reduce<Promise<Map<string, ConnectionStatus>>>(
       async(acc, token) => {
-        const client = generateWebClient(token);
-
-        const status: ConnectionStatus = {};
-        try {
-          // try to connect
-          await testSlackApiServer(client);
-          // retrieve workspace name
-          status.workspaceName = await retrieveWorkspaceName(client);
-        }
-        catch (err) {
-          status.error = err;
-        }
+        const status: ConnectionStatus = await getConnectionStatus(token);
 
         (await acc).set(token, status);
-
         return acc;
-
       },
       // define initial accumulator
       Promise.resolve(new Map<string, ConnectionStatus>()),
@@ -102,16 +112,6 @@ export const getConnectionStatuses = async(tokens: string[]): Promise<{[key: str
   return Object.fromEntries(await map);
 };
 
-/**
- * @param token bot OAuth token
- * @returns
- */
-export const testToSlack = async(token:string): Promise<void> => {
-  const client = generateWebClient(token);
-  const res = await testSlackApiServer(client);
-  await checkSlackScopes(res);
-};
-
 export const sendSuccessMessage = async(token:string, channel:string, appSiteUrl:string): Promise<void> => {
   const client = generateWebClient(token);
   await client.chat.postMessage({

+ 7 - 13
packages/slackbot-proxy/src/controllers/growi-to-slack.ts

@@ -6,7 +6,7 @@ import axios from 'axios';
 import { WebAPICallOptions, WebAPICallResult } from '@slack/web-api';
 
 import {
-  verifyGrowiToSlackRequest, getConnectionStatuses, testToSlack, generateWebClient,
+  verifyGrowiToSlackRequest, getConnectionStatuses, getConnectionStatus, generateWebClient,
 } from '@growi/slack';
 
 import { GrowiReq } from '~/interfaces/growi-to-slack/growi-req';
@@ -107,12 +107,9 @@ export class GrowiToSlackCtrl {
         return res.status(400).send({ message: `failed to request to GROWI. err: ${err.message}` });
       }
 
-      try {
-        await testToSlack(token);
-      }
-      catch (err) {
-        logger.error(err);
-        return res.status(400).send({ message: `failed to test. err: ${err.message}` });
+      const status = await getConnectionStatus(token);
+      if (status.error != null){
+        return res.status(400).send({ message: `failed to get connection. err: ${status.error}` })
       }
 
       return res.send({ relation, slackBotToken: token });
@@ -145,12 +142,9 @@ export class GrowiToSlackCtrl {
       return res.status(400).send({ message: 'installation is invalid' });
     }
 
-    try {
-      await testToSlack(token);
-    }
-    catch (err) {
-      logger.error(err);
-      return res.status(400).send({ message: `failed to test. err: ${err.message}` });
+    const status = await getConnectionStatus(token);
+    if (status.error != null){
+      return res.status(400).send({ message: `failed to get connection. err: ${status.error}` })
     }
 
     logger.debug('relation test is success', order);

+ 4 - 7
src/server/routes/apiv3/slack-integration-settings.js

@@ -5,7 +5,7 @@ const axios = require('axios');
 const urljoin = require('url-join');
 const loggerFactory = require('@alias/logger');
 
-const { getConnectionStatuses, testToSlack, sendSuccessMessage } = require('@growi/slack');
+const { getConnectionStatus, getConnectionStatuses, sendSuccessMessage } = require('@growi/slack');
 
 const ErrorV3 = require('../../models/vo/error-apiv3');
 
@@ -557,12 +557,9 @@ module.exports = (crowi) => {
     }
 
     const slackBotToken = crowi.configManager.getConfig('crowi', 'slackbot:token');
-    try {
-      await testToSlack(slackBotToken);
-    }
-    catch (error) {
-      logger.error('Error', error);
-      return res.apiv3Err(new ErrorV3(`Error occured while testing. Cause: ${error.message}`, 'test-failed', error.stack));
+    const status = await getConnectionStatus(slackBotToken);
+    if (status.error != null) {
+      return res.apiv3Err(new ErrorV3(`Error occured while getting connection. ${status.error}`, 'send-message-failed'));
     }
 
     const { channel } = req.body;