Browse Source

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

yusuketk 5 years ago
parent
commit
4ca0187f4c

+ 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;

+ 2 - 0
src/server/routes/apiv3/index.js

@@ -46,5 +46,7 @@ module.exports = (crowi) => {
   router.use('/bookmarks', require('./bookmarks')(crowi));
   router.use('/attachment', require('./attachment')(crowi));
 
+  router.use('/slack-bot', require('./slack-bot')(crowi));
+
   return router;
 };

+ 13 - 0
src/server/routes/apiv3/slack-bot.js

@@ -0,0 +1,13 @@
+
+const express = require('express');
+
+const router = express.Router();
+
+module.exports = (crowi) => {
+  this.app = crowi.express;
+  const { boltService } = crowi;
+
+  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;

File diff suppressed because it is too large
+ 606 - 7
yarn.lock


Some files were not shown because too many files changed in this diff