Skip to content

Commit

Permalink
- Refactor Webserver structure (breaks compatibility)
Browse files Browse the repository at this point in the history
  • Loading branch information
patrinhani-ciandt committed Nov 8, 2017
1 parent 78c8155 commit 8cb948a
Show file tree
Hide file tree
Showing 13 changed files with 215 additions and 73 deletions.
35 changes: 23 additions & 12 deletions lib/abbott.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
const path = require('path');
const logger = require('./logging')('abbott-framework');

const WebServer = require(__dirname + '/webserver');

logger.debug('lib imported!');

/**
Expand All @@ -21,8 +23,8 @@ module.exports = class {
this.options = options || {};
this.options.debug = this.options.debug || false;
this.options.botName = this.options.botName || 'my-bot';
this.options.botFirendlyName = this.options.botFirendlyName || 'My BOT';
this.options.port = this.options.port || 3000;
process.env.express_port = this.options.port;

this.options.platforms = this.options.platforms || {};

Expand All @@ -35,15 +37,17 @@ module.exports = class {
local: path.join(process.cwd(), '.data/db')
};

this._loadWebserver();
this.options.webserver = options.webserver || {};

this._loadWebserver();
this._loadNLPProviders();

this._loadControllers();
}

_loadWebserver() {
this.webserver = require(__dirname + '/components/express_webserver.js')(this.options.webserver);
process.env.express_port = this.options.port;

this.webserver = new WebServer(this.options.webserver);
}

_loadNLPProviders() {
Expand Down Expand Up @@ -78,14 +82,21 @@ module.exports = class {
}

start() {
if (this.options.platforms) {
let platformKeys = Object.keys(this.options.platforms);
for (let i = 0; i < platformKeys.length; i++) {
let controller = this.controllers[platformKeys[i]];
if (controller) {
controller.start();
return this.webserver.start()
.then(() => {
if (this.options.platforms) {
let platformKeys = Object.keys(this.options.platforms);
for (let i = 0; i < platformKeys.length; i++) {
let controller = this.controllers[platformKeys[i]];
if (controller) {
controller.start();
}
}
}
}
}
});
}

stop() {
return this.webserver.stop();
}
};
49 changes: 0 additions & 49 deletions lib/components/express_webserver.js

This file was deleted.

6 changes: 3 additions & 3 deletions lib/controllers/abbott/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,14 @@ module.exports = class AbbottController extends BaseController {

initializeAbbottBot() {
this.controller = BotkitAbbottBot(this.getBotkitOptions());
this.controller.webserver = this.abbottCore.webserver;
this.controller.webserver = this.webserver;

this.controller.startTicking();

this.controller.createWebhookEndpoints(this.controller.webserver);
this.controller.createWebhookEndpoints(this.webserver);
}

process(req, res) {
this.controller.handleWebhookPayload(req, res);
}
};
};
4 changes: 2 additions & 2 deletions lib/controllers/base-controler.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ module.exports = class BaseController {
}

get webserver() {
return this.abbottCore.webserver;
return this.abbottCore.webserver.server;
}

constructor(key, abbottCore, globals) {
Expand Down Expand Up @@ -127,4 +127,4 @@ module.exports = class BaseController {
start() {
this.loadSkills();
}
};
};
2 changes: 1 addition & 1 deletion lib/controllers/facebook/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,4 @@ module.exports = class FacebookController extends BaseController {
var strReturn = 'ERROR: Missing Facebook Parameters!';
return strReturn;
}
};
};
6 changes: 3 additions & 3 deletions lib/controllers/gactions/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,10 @@ module.exports = class GActionsController extends BaseController {

initializeGActionsBot() {
this.controller = BotkitGActionsBot(this.getBotkitOptions());
this.controller.webserver = this.abbottCore.webserver;
this.controller.webserver = this.webserver;

this.controller.startTicking();

this.controller.createWebhookEndpoints(this.abbottCore.webserver);
this.controller.createWebhookEndpoints(this.webserver);
}
};
};
6 changes: 3 additions & 3 deletions lib/controllers/gchats/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,14 @@ module.exports = class extends BaseController {

initializeBot() {
this.controller = BotkitEngineBot(this.getBotkitOptions());
this.controller.webserver = this.abbottCore.webserver;
this.controller.webserver = this.webserver;

this.controller.startTicking();

this.controller.createWebhookEndpoints(this.controller.webserver);
this.controller.createWebhookEndpoints(this.webserver);
}

process(req, res) {
this.controller.handleWebhookPayload(req, res);
}
};
};
3 changes: 3 additions & 0 deletions lib/loaders/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
get webserverRouteLoader() { return require(__dirname + '/webserver-route-loader'); },
};
35 changes: 35 additions & 0 deletions lib/loaders/webserver-route-loader.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
const fs = require('fs');
const path = require('path');
const express = require('express');
const fsUtils = require('../utils/fs');

module.exports = function (webserver, baseDir = __dirname, routePath = null) {
const logger = require('../logging')('abbott-framework:webserver-route-loader');

var parentRoute = webserver;

if (routePath) {
parentRoute = express.Router();
webserver.use(routePath, parentRoute);
}

var routeDirectories = fsUtils.getDirectories(baseDir);

routeDirectories.forEach((routeApiItem) => {
logger.info(`directories: (${baseDir} / ${routeApiItem})`);

var apiSubRoute = require(path.join(baseDir, routeApiItem));
if (apiSubRoute) {
let subPath = routePath || '/';
let apiRoutePath = path.join(subPath, routeApiItem);
let router = express.Router();

apiSubRoute(webserver, router);

parentRoute.use(apiRoutePath, router);
logger.info(`subroute loaded (${apiRoutePath})!`);
}
});

return parentRoute;
};
13 changes: 13 additions & 0 deletions lib/utils/fs/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const fs = require('fs');
const path = require('path');

module.exports = class {
static getDirectories(srcpath) {
if (fs.existsSync(srcpath)) {
return fs.readdirSync(srcpath)
.filter((file) => fs.lstatSync(path.join(srcpath, file)).isDirectory());
}

return [];
}
};
96 changes: 96 additions & 0 deletions lib/webserver/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
var path = require('path');
var fs = require('fs');
var express = require('express');
var bodyParser = require('body-parser');
var querystring = require('querystring');
const logging = require('../logging');
const { webserverRouteLoader } = require('../loaders');

module.exports = class {
get logger() {
if (!this.__logger) {
this.__logger = logging(`abbott-framework:webserver`);
}
return this.__logger;
}

constructor(options) {
this.options = options || {};

this.server = express();
this.server.use(bodyParser.json());
this.server.use(bodyParser.urlencoded({ extended: true }));

this.serverRoutes = webserverRouteLoader(this.server, path.join(__dirname, 'routes'));
}

start() {
return new Promise((resolve, reject) => {
this.serverListener = this.server.listen(process.env.express_port || 3000, () => {
this.logger.debug('Webserver configured and listening at http://localhost:' + process.env.express_port || 3000);
resolve();
});
});
}

stop() {
return new Promise((resolve, reject) => {
try {
this.logger.debug('Closing webserver...');
this.serverListener.close(() => {
this.logger.debug('Webserver closed!');
resolve();
});
} catch(ex) {
reject(ex);
}
});
}

};
/*
module.exports = function (options) {
var logger = logging(`abbott-framework:webserver`);
options = options || {};
var webserver = express();
webserver.use(bodyParser.json());
webserver.use(bodyParser.urlencoded({ extended: true }));
var webserverRoutes = webserverRouteLoader(webserver, path.join(__dirname, 'routes'));
// var bot_assets_dir = path.join(process.cwd(), 'bot');
// var mimeImage = {
// gif: 'image/gif',
// jpg: 'image/jpeg',
// png: 'image/png',
// svg: 'image/svg+xml'
// };
// webserver.get('/bot/avatar', (req, res) => {
// var file = path.join(bot_assets_dir, 'avatar.png');
// if (file.indexOf(bot_assets_dir + path.sep) !== 0) {
// return res.status(403).end('Forbidden');
// }
// var type = mimeImage[path.extname(file).slice(1)] || 'text/plain';
// var s = fs.createReadStream(file);
// s.on('open', function () {
// res.set('Content-Type', type);
// s.pipe(res);
// });
// s.on('error', function () {
// res.set('Content-Type', 'text/plain');
// res.status(404).end('Not found');
// });
// });
webserver.listen(process.env.express_port || 3000, null, function () {
logger.debug('Express webserver configured and listening at http://localhost:' + process.env.express_port || 3000);
});
return webserver;
};
*/
File renamed without changes.
33 changes: 33 additions & 0 deletions lib/webserver/routes/bot/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
const fs = require('fs');
const path = require('path');

module.exports = function (webserver, router) {
const logger = require('../../../logging')('abbott-framework:webserver(/bot)');
logger.debug('route loaded!');

var mimeImage = {
gif: 'image/gif',
jpg: 'image/jpeg',
png: 'image/png',
svg: 'image/svg+xml'
};

var bot_assets_dir = path.join(process.cwd(), 'bot');

router.get('/avatar', (req, res) => {
var file = path.join(bot_assets_dir, 'avatar.png');
if (file.indexOf(bot_assets_dir + path.sep) !== 0) {
return res.status(403).end('Forbidden');
}
var type = mimeImage[path.extname(file).slice(1)] || 'text/plain';
var s = fs.createReadStream(file);
s.on('open', function () {
res.set('Content-Type', type);
s.pipe(res);
});
s.on('error', function () {
res.set('Content-Type', 'text/plain');
res.status(404).end('Not found');
});
});
};

0 comments on commit 8cb948a

Please sign in to comment.