Преглед изворни кода

Added SlackBotError vo class & Added slack-bot-response function

hakumizuki пре 4 година
родитељ
комит
796dd2a667

+ 20 - 0
src/server/models/vo/slack-bot-error.js

@@ -0,0 +1,20 @@
+/**
+ * Error class for slackbot service
+ */
+class SlackbotError extends Error {
+
+  constructor(method, to, popupMessage, mainMessage) {
+    super();
+    this.method = method;
+    this.to = to;
+    this.popupMessage = popupMessage;
+    this.mainMessage = mainMessage;
+  }
+
+  static isSlackbotError(obj) {
+    return obj instanceof this;
+  }
+
+}
+
+module.exports = SlackbotError;

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

@@ -9,6 +9,7 @@ const { verifySlackRequest, generateWebClient } = require('@growi/slack');
 const logger = loggerFactory('growi:routes:apiv3:slack-integration');
 const router = express.Router();
 const SlackAppIntegration = mongoose.model('SlackAppIntegration');
+const slackBotResponse = require('../../service/slack-command-handler/slack-bot-response');
 
 module.exports = (crowi) => {
   this.app = crowi.express;
@@ -103,12 +104,9 @@ module.exports = (crowi) => {
     const args = body.text.split(' ');
     const command = args[0];
 
-    try {
+    await slackBotResponse(client, body, async() => {
       await crowi.slackBotService.handleCommandRequest(command, client, body, args);
-    }
-    catch (error) {
-      logger.error(error);
-    }
+    });
   }
 
   router.post('/commands', addSigningSecretToReq, verifySlackRequest, async(req, res) => {
@@ -151,10 +149,14 @@ module.exports = (crowi) => {
     try {
       switch (type) {
         case 'block_actions':
-          await crowi.slackBotService.handleBlockActionsRequest(client, payload);
+          await slackBotResponse(client, req.body, async() => {
+            await crowi.slackBotService.handleBlockActionsRequest(client, payload);
+          });
           break;
         case 'view_submission':
-          await crowi.slackBotService.handleViewSubmissionRequest(client, payload);
+          await slackBotResponse(client, req.body, async() => {
+            await crowi.slackBotService.handleViewSubmissionRequest(client, payload);
+          });
           break;
         default:
           break;

+ 64 - 0
src/server/service/slack-command-handler/slack-bot-response.js

@@ -0,0 +1,64 @@
+const logger = require('@alias/logger')('growi:service:SlackCommandHandler:slack-bot-response');
+const { markdownSectionBlock } = require('@growi/slack');
+const SlackbotError = require('../../models/vo/slack-bot-error');
+
+module.exports = async function(client, body, callback) {
+  const isInteraction = !body.channel_id;
+  try {
+    await callback();
+  }
+  catch (err) {
+    if (!SlackbotError.isSlackbotError(err)) {
+      logger.error(`A non-SlackbotError error occured.\n${err.toString()}`);
+      throw err;
+    }
+
+    // for both postMessage and postEphemeral
+    let toChannel;
+    // for only postEphemeral
+    let toUser;
+    // decide which channel to send to
+    switch (err.to) {
+      case 'dm':
+        toChannel = isInteraction ? JSON.parse(body.payload).user.id : body.user_id;
+        toUser = toChannel;
+        break;
+      case 'channel':
+        toChannel = isInteraction ? JSON.parse(body.payload).channel.id : body.channel_id;
+        toUser = isInteraction ? JSON.parse(body.payload).user.id : body.user_id;
+        break;
+      default:
+        logger.error('The "to" property of SlackbotError must be "dm" or "channel".');
+        break;
+    }
+
+    // argumentMap object to pass
+    let argumentsMap = {};
+    switch (err.method) {
+      case 'postMessage':
+        argumentsMap = {
+          channel: toChannel,
+          text: err.popupMessage,
+          blocks: [
+            markdownSectionBlock(err.mainMessage),
+          ],
+        };
+        break;
+      case 'postEphemeral':
+        argumentsMap = {
+          channel: toChannel,
+          user: toUser,
+          text: err.popupMessage,
+          blocks: [
+            markdownSectionBlock(err.mainMessage),
+          ],
+        };
+        break;
+      default:
+        logger.error('The "method" property of SlackbotError must be "postMessage" or "postEphemeral".');
+        break;
+    }
+
+    await client.chat[err.method](argumentsMap);
+  }
+};

+ 1 - 0
src/server/service/slackbot.js

@@ -4,6 +4,7 @@ const { markdownSectionBlock } = require('@growi/slack');
 const S2sMessage = require('../models/vo/s2s-message');
 const S2sMessageHandlable = require('./s2s-messaging/handlable');
 
+
 class SlackBotService extends S2sMessageHandlable {
 
   constructor(crowi) {