Browse Source

refactor generateClient method

Yuki Takei 4 years ago
parent
commit
d63623b082

+ 22 - 39
packages/app/src/server/routes/apiv3/slack-integration.js

@@ -14,7 +14,7 @@ const { respondIfSlackbotError } = require('../../service/slack-command-handler/
 module.exports = (crowi) => {
   this.app = crowi.express;
 
-  const { configManager } = crowi;
+  const { configManager, slackIntegrationService } = crowi;
 
   // Check if the access token is correct
   async function verifyAccessTokenFromProxy(req, res, next) {
@@ -98,30 +98,30 @@ module.exports = (crowi) => {
     return next();
   };
 
-  const generateClientForResponse = (tokenGtoP) => {
-    const currentBotType = crowi.configManager.getConfig('crowi', 'slackbot:currentBotType');
+  // const generateClientForResponse = (tokenGtoP) => {
+  //   const currentBotType = crowi.configManager.getConfig('crowi', 'slackbot:currentBotType');
 
-    if (currentBotType == null) {
-      throw new Error('The config \'SLACK_BOT_TYPE\'(ns: \'crowi\', key: \'slackbot:currentBotType\') must be set.');
-    }
+  //   if (currentBotType == null) {
+  //     throw new Error('The config \'SLACK_BOT_TYPE\'(ns: \'crowi\', key: \'slackbot:currentBotType\') must be set.');
+  //   }
 
-    let token;
+  //   let token;
 
-    // connect directly
-    if (tokenGtoP == null) {
-      token = crowi.configManager.getConfig('crowi', 'slackbot:token');
-      return generateWebClient(token);
-    }
+  //   // connect directly
+  //   if (tokenGtoP == null) {
+  //     token = crowi.configManager.getConfig('crowi', 'slackbot:token');
+  //     return generateWebClient(token);
+  //   }
 
-    // connect to proxy
-    const proxyServerUri = crowi.configManager.getConfig('crowi', 'slackbot:proxyServerUri');
-    const serverUri = urljoin(proxyServerUri, '/g2s');
-    const headers = {
-      'x-growi-gtop-tokens': tokenGtoP,
-    };
+  //   // connect to proxy
+  //   const proxyServerUri = crowi.configManager.getConfig('crowi', 'slackbot:proxyServerUri');
+  //   const serverUri = urljoin(proxyServerUri, '/g2s');
+  //   const headers = {
+  //     'x-growi-gtop-tokens': tokenGtoP,
+  //   };
 
-    return generateWebClient(token, serverUri, headers);
-  };
+  //   return generateWebClient(token, serverUri, headers);
+  // };
 
   async function handleCommands(req, res) {
     const { body } = req;
@@ -139,16 +139,7 @@ module.exports = (crowi) => {
     res.send();
 
     const tokenPtoG = req.headers['x-growi-ptog-tokens'];
-
-    // generate client
-    let client;
-    if (tokenPtoG == null) {
-      client = generateClientForResponse();
-    }
-    else {
-      const slackAppIntegration = await SlackAppIntegration.findOne({ tokenPtoG });
-      client = generateClientForResponse(slackAppIntegration.tokenGtoP);
-    }
+    const client = slackIntegrationService.generateClientForResponse(tokenPtoG);
 
     const args = body.text.split(' ');
     const command = args[0];
@@ -186,15 +177,7 @@ module.exports = (crowi) => {
 
 
     const tokenPtoG = req.headers['x-growi-ptog-tokens'];
-    // generate client
-    let client;
-    if (tokenPtoG == null) {
-      client = generateClientForResponse();
-    }
-    else {
-      const slackAppIntegration = await SlackAppIntegration.findOne({ tokenPtoG });
-      client = generateClientForResponse(slackAppIntegration.tokenGtoP);
-    }
+    const client = slackIntegrationService.generateClientForResponse(tokenPtoG);
 
     const payload = JSON.parse(req.body.payload);
     const { type } = payload;

+ 61 - 2
packages/app/src/server/service/slack-integration.ts

@@ -1,3 +1,9 @@
+import mongoose from 'mongoose';
+
+import { WebClient } from '@slack/web-api';
+import { generateWebClient, markdownSectionBlock } from '@growi/slack';
+
+
 import loggerFactory from '~/utils/logger';
 import S2sMessage from '../models/vo/s2s-message';
 
@@ -5,9 +11,8 @@ import ConfigManager from './config-manager';
 import { S2sMessagingService } from './s2s-messaging/base';
 import { S2sMessageHandlable } from './s2s-messaging/handlable';
 
-const logger = loggerFactory('growi:service:SlackBotService');
 
-const { markdownSectionBlock } = require('@growi/slack');
+const logger = loggerFactory('growi:service:SlackBotService');
 
 
 type S2sMessageForSlackIntegration = S2sMessage & { updatedAt: Date };
@@ -83,6 +88,60 @@ export class SlackIntegrationService implements S2sMessageHandlable {
     return hasSlackToken || hasSlackIwhUrl || hasSlackbotType;
   }
 
+  /**
+   * generate WebClient instance for 'customBotWithoutProxy' type
+   */
+  async generateClient(): Promise<WebClient>;
+
+  /**
+   * generate WebClient instance by tokenPtoG
+   * @param tokenPtoG
+   */
+  async generateClient(tokenPtoG: string): Promise<WebClient>;
+
+  /**
+   * generate WebClient instance by SlackAppIntegration
+   * @param slackAppIntegration
+   */
+  async generateClient(slackAppIntegration?: { tokenGtoP: string }): Promise<WebClient>;
+
+  async generateClient(arg?: string | { tokenGtoP: string }): Promise<WebClient> {
+    const SlackAppIntegration = mongoose.model('SlackAppIntegration');
+
+    const currentBotType = this.configManager.getConfig('crowi', 'slackbot:currentBotType');
+
+    if (currentBotType == null) {
+      throw new Error('The config \'SLACK_BOT_TYPE\'(ns: \'crowi\', key: \'slackbot:currentBotType\') must be set.');
+    }
+
+    // connect directly
+    if (currentBotType === 'customBotWithoutProxy') {
+      if (arg != null) {
+        throw new Error('This method cannot be used with non-null argument under \'customBotWithoutProxy\' type.');
+      }
+
+      const token = this.configManager.getConfig('crowi', 'slackbot:token');
+      return generateWebClient(token);
+    }
+
+    let slackAppIntegration;
+    if (typeof arg === 'string') {
+      slackAppIntegration = await SlackAppIntegration.findOne({ tokenPtoG: arg });
+    }
+    else {
+      slackAppIntegration = arg;
+    }
+
+    // connect to proxy
+    const proxyServerUri = this.configManager.getConfig('crowi', 'slackbot:proxyServerUri');
+    const serverUri = new URL('/g2s', proxyServerUri);
+    const headers = {
+      'x-growi-gtop-tokens': slackAppIntegration.tokenGtoP,
+    };
+
+    return generateWebClient(undefined, serverUri.toString(), headers);
+  }
+
   /**
    * Handle /commands endpoint
    */

+ 1 - 1
packages/slack/src/utils/webclient-factory.ts

@@ -7,6 +7,6 @@ const isProduction = process.env.NODE_ENV === 'production';
  * @param token Slack Bot Token or Proxy Server URI
  * @returns
  */
-export const generateWebClient = (token: string, serverUri?: string, headers?:{[key:string]:string}): WebClient => {
+export const generateWebClient = (token?: string, serverUri?: string, headers?:{[key:string]:string}): WebClient => {
   return new WebClient(token, { slackApiUrl: serverUri, logLevel: isProduction ? LogLevel.DEBUG : LogLevel.INFO, headers });
 };