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

Merge pull request #3357 from weseek/imprv/gw4933-install-bolt-and-use-customed-reciever

Imprv/gw4933 install bolt and use customed reciever
yusuketk 5 лет назад
Родитель
Сommit
9b5c586ad9
6 измененных файлов с 695 добавлено и 13 удалено
  1. 2 0
      config/env.dev.js
  2. 1 0
      package.json
  3. 9 0
      src/server/crowi/index.js
  4. 4 6
      src/server/routes/apiv3/slack-bot.js
  5. 73 0
      src/server/service/bolt.js
  6. 606 7
      yarn.lock

+ 2 - 0
config/env.dev.js

@@ -22,4 +22,6 @@ module.exports = {
   // DEV_HTTPS: true,
   // FORCE_WIKI_MODE: 'private', // 'public', 'private', undefined
   // PROMSTER_ENABLED: true,
+  // SLACK_SIGNING_SECRET: '',
+  // SLACK_BOT_TOKEN: '',
 };

+ 1 - 0
package.json

@@ -74,6 +74,7 @@
     ],
     "@google-cloud/storage": "^3.3.0",
     "@kobalab/socket.io-session": "^1.0.3",
+    "@slack/bolt": "^3.0.0",
     "@promster/express": "^5.0.1",
     "@promster/server": "^6.0.0",
     "JSONStream": "^1.3.5",

+ 9 - 0
src/server/crowi/index.js

@@ -57,6 +57,7 @@ function Crowi(rootdir) {
   this.syncPageStatusService = null;
   this.cdnResourcesService = new CdnResourcesService();
   this.interceptorManager = new InterceptorManager();
+  this.boltService = null;
   this.xss = new Xss();
 
   this.tokens = null;
@@ -116,6 +117,7 @@ Crowi.prototype.init = async function() {
     this.setupImport(),
     this.setupPageService(),
     this.setupSyncPageStatusService(),
+    this.setupBoltService(),
   ]);
 
   // globalNotification depends on slack and mailer
@@ -654,4 +656,11 @@ Crowi.prototype.setupSyncPageStatusService = async function() {
   }
 };
 
+Crowi.prototype.setupBoltService = async function() {
+  const BoltService = require('../service/bolt');
+  if (this.boltService == null) {
+    this.boltService = new BoltService(this);
+  }
+};
+
 module.exports = Crowi;

+ 4 - 6
src/server/routes/apiv3/slack-bot.js

@@ -1,15 +1,13 @@
+
 const express = require('express');
 
 const router = express.Router();
 
 module.exports = (crowi) => {
-  router.get('/', async(req, res) => {
+  this.app = crowi.express;
+  const { boltService } = crowi;
 
-    // TODO: use res.apiv3
-    return res.json({
-      ok: true,
-    });
-  });
+  router.post('/', boltService.receiver.requestHandler.bind(boltService.receiver));
 
   return router;
 };

+ 73 - 0
src/server/service/bolt.js

@@ -0,0 +1,73 @@
+const logger = require('@alias/logger')('growi:service:BoltService');
+
+class BoltReciever {
+
+  init(app) {
+    this.bolt = app;
+  }
+
+  async requestHandler(req, res) {
+    let ackCalled = false;
+    const event = {
+      body: req.body,
+      ack: (response) => {
+        if (ackCalled) {
+          return;
+        }
+
+        if (response instanceof Error) {
+          res.status(500).send();
+        }
+        else if (!response) {
+          res.send('');
+        }
+        else {
+          res.send(response);
+        }
+
+        ackCalled = true;
+      },
+    };
+
+    await this.bolt.processEvent(event);
+
+    // for verification request URL on Event Subscriptions
+    res.send(req.body);
+  }
+
+}
+
+const { App } = require('@slack/bolt');
+
+class BoltService {
+
+  constructor(crowi) {
+    this.crowi = crowi;
+    this.receiver = new BoltReciever();
+
+    const token = process.env.SLACK_BOT_TOKEN;
+    const signingSecret = process.env.SLACK_SIGNING_SECRET;
+
+    if (token != null || signingSecret != null) {
+      logger.debug('TwitterStrategy: setup is done');
+      this.bolt = new App({
+        token,
+        signingSecret,
+        receiver: this.receiver,
+      });
+      this.init();
+    }
+  }
+
+  init() {
+    // Example of listening for event
+    // See. https://github.com/slackapi/bolt-js#listening-for-events
+    // or https://slack.dev/bolt-js/concepts#basic
+    this.bolt.command('/growi-bot', async({ command, ack, say }) => { // demo
+      await say('Hello');
+    });
+  }
+
+}
+
+module.exports = BoltService;

Разница между файлами не показана из-за своего большого размера
+ 606 - 7
yarn.lock


Некоторые файлы не были показаны из-за большого количества измененных файлов