소스 검색

Merge branch 'feat/growi-bot' into imprv/refactor-bolt-service

yusuketk 5 년 전
부모
커밋
fb1b286b0e
1개의 변경된 파일75개의 추가작업 그리고 10개의 파일을 삭제
  1. 75 10
      src/server/service/bolt.js

+ 75 - 10
src/server/service/bolt.js

@@ -18,8 +18,18 @@ class BoltReciever {
       return res.send(req.body);
     }
 
+    const payload = req.body.payload;
+    let reqBody;
+
+    if (payload != null) {
+      reqBody = JSON.parse(payload);
+    }
+    else {
+      reqBody = req.body;
+    }
+
     const event = {
-      body: req.body,
+      body: reqBody,
       ack: (response) => {
         if (ackCalled) {
           return null;
@@ -109,6 +119,16 @@ class BoltService {
       }
     });
 
+    this.bolt.view('createPage', async({ ack, view }) => {
+      await ack();
+      return this.createPageInGrowi(view);
+    });
+
+    this.bolt.action('button_click', async({ body, ack, say }) => {
+      await ack();
+      await say('clicked the button');
+    });
+
   }
 
   notCommand(command) {
@@ -117,7 +137,7 @@ class BoltService {
       channel: command.channel_id,
       user: command.user_id,
       blocks: [
-        this.generateMarkdownSectionBlock('*コマンドが存在しません。*\n Hint\n `/growi [command] [keyword]`'),
+        this.generateMarkdownSectionBlock('*No command.*\n Hint\n `/growi [command] [keyword]`'),
       ],
     });
 
@@ -130,7 +150,7 @@ class BoltService {
         channel: command.channel_id,
         user: command.user_id,
         blocks: [
-          this.generateMarkdownSectionBlock('*キーワードを入力してください。*\n Hint\n `/growi search [keyword]`'),
+          this.generateMarkdownSectionBlock('*Input keywords.*\n Hint\n `/growi search [keyword]`'),
         ],
       });
     }
@@ -148,7 +168,7 @@ class BoltService {
         channel: command.channel_id,
         user: command.user_id,
         blocks: [
-          this.generateMarkdownSectionBlock('*キーワードに該当するページは存在しません。*'),
+          this.generateMarkdownSectionBlock('*No page that match your keywords.*'),
         ],
       });
     }
@@ -162,7 +182,7 @@ class BoltService {
         channel: command.channel_id,
         user: command.user_id,
         blocks: [
-          this.generateMarkdownSectionBlock('検索結果 10 件'),
+          this.generateMarkdownSectionBlock('10 results.'),
           this.generateMarkdownSectionBlock(`${resultPaths.join('\n')}`),
           {
             type: 'actions',
@@ -171,9 +191,10 @@ class BoltService {
                 type: 'button',
                 text: {
                   type: 'plain_text',
-                  text: '検索結果をこのチャンネルに共有する',
+                  text: 'Share the results in this channel.',
                 },
                 style: 'primary',
+                action_id: 'button_click',
               },
             ],
           },
@@ -186,14 +207,23 @@ class BoltService {
         channel: command.channel_id,
         user: command.user_id,
         blocks: [
-          this.generateMarkdownSectionBlock('*検索に失敗しました。*\n Hint\n `/growi search [keyword]`'),
+          this.generateMarkdownSectionBlock('*Failed to search.*\n Hint\n `/growi search [keyword]`'),
         ],
       });
     }
   }
 
   async createModal(command, client, body) {
+    const User = this.crowi.model('User');
+
     try {
+      const slackUser = await User.findUserByUsername('slackUser');
+
+      // if "slackUser" is null, don't show create Modal
+      if (slackUser == null) {
+        throw new Error('userNull');
+      }
+
       await client.views.open({
         trigger_id: body.trigger_id,
 
@@ -213,25 +243,60 @@ class BoltService {
             text: 'Cancel',
           },
           blocks: [
-            this.generateMarkdownSectionBlock('ページを作成します'),
+            this.generateMarkdownSectionBlock('Create new page.'),
             this.generateInputSectionBlock('path', 'Path', 'path_input', false, '/path'),
             this.generateInputSectionBlock('contents', 'Contents', 'contents_input', true, 'Input with Markdown...'),
           ],
         },
       });
     }
-    catch {
+    catch (e) {
+      if (e instanceof Error) {
+        return this.client.chat.postEphemeral({
+          channel: command.channel_id,
+          user: command.user_id,
+          blocks: [
+            this.generateMarkdownSectionBlock('*slackUser does not exist.*'),
+          ],
+        });
+      }
+
       logger.error('Failed to create page.');
       await this.client.chat.postEphemeral({
         channel: command.channel_id,
         user: command.user_id,
         blocks: [
-          this.generateMarkdownSectionBlock('*ページ作成に失敗しました。*\n Hint\n `/growi create`'),
+          this.generateMarkdownSectionBlock('*Failed to create new page.*\n Hint\n `/growi create`'),
         ],
       });
     }
   }
 
+  // Submit action in create Modal
+  async createPageInGrowi(view) {
+    const User = this.crowi.model('User');
+    const Page = this.crowi.model('Page');
+    const pathUtils = require('growi-commons').pathUtils;
+
+    try {
+      // search "slackUser" to create page in slack
+      const slackUser = await User.findUserByUsername('slackUser');
+
+      let path = view.state.values.path.path_input.value;
+      const body = view.state.values.contents.contents_input.value;
+
+      // sanitize path
+      path = this.crowi.xss.process(path);
+      path = pathUtils.normalizePath(path);
+
+      const user = slackUser._id;
+      return Page.create(path, body, user, {});
+    }
+    catch {
+      logger.error('Failed to create page in GROWI.');
+    }
+  }
+
   generateMarkdownSectionBlock(blocks) {
     return {
       type: 'section',