2018-03-29 20:24:52 +02:00
// app dependencies
const express = require ( 'express' ) ;
const bodyParser = require ( 'body-parser' ) ;
const expressHandlebars = require ( 'express-handlebars' ) ;
const Handlebars = require ( 'handlebars' ) ;
const helmet = require ( 'helmet' ) ;
const cookieSession = require ( 'cookie-session' ) ;
const http = require ( 'http' ) ;
const logger = require ( 'winston' ) ;
2018-03-29 21:21:23 +02:00
const requestLogger = require ( 'middleware/requestLogger.js' ) ;
2018-03-29 20:24:52 +02:00
function Server ( ) {
2018-03-29 21:21:23 +02:00
this . configureLogger = ( loggerConfig ) => {
require ( 'loggerConfig.js' ) . configure ( loggerConfig ) ;
}
2018-03-29 20:24:52 +02:00
this . configureMysql = ( mysqlConfig ) => {
2018-03-29 21:21:23 +02:00
require ( 'mysqlConfig.js' ) . configure ( mysqlConfig ) ;
2018-03-29 20:24:52 +02:00
} ;
2018-03-29 21:21:23 +02:00
this . configureSiteDetails = ( siteConfig ) => {
require ( 'siteConfig.js' ) . configure ( siteConfig ) ;
2018-03-29 20:24:52 +02:00
this . sessionKey = siteConfig . auth . sessionKey ;
this . PORT = siteConfig . details . port ;
} ;
this . configureSlack = ( slackConfig ) => {
2018-03-29 21:21:23 +02:00
require ( 'slackConfig.js' ) . configure ( slackConfig ) ;
2018-03-29 20:24:52 +02:00
} ;
2018-03-29 21:21:23 +02:00
this . configureClientBundle = ( ) => {
2018-03-29 21:33:52 +02:00
logger . info ( 'configure the client here by passing in the bundle and configuring it, or better yet: taking in the components to use dynamically from here.' ) ;
2018-03-29 21:21:23 +02:00
}
this . configureModels = ( ) => {
2018-03-29 21:33:52 +02:00
logger . info ( 'here is where you could add/overwrite the default models' )
2018-03-29 21:21:23 +02:00
}
this . configureRoutes = ( ) => {
2018-03-29 21:33:52 +02:00
logger . info ( 'here is where you could add/overwrite the default routes' )
2018-03-29 21:21:23 +02:00
}
2018-03-29 20:24:52 +02:00
this . createApp = ( ) => {
// create an Express application
const app = express ( ) ;
// trust the proxy to get ip address for us
app . enable ( 'trust proxy' ) ;
// add middleware
app . use ( helmet ( ) ) ; // set HTTP headers to protect against well-known web vulnerabilties
app . use ( express . static ( ` ${ _ _dirname } /public ` ) ) ; // 'express.static' to serve static files from public directory
2018-03-29 21:21:23 +02:00
// note: take in a different public folder, so it can serve it's own bundle from there?
2018-03-29 20:24:52 +02:00
app . use ( bodyParser . json ( ) ) ; // 'body parser' for parsing application/json
app . use ( bodyParser . urlencoded ( { extended : true } ) ) ; // 'body parser' for parsing application/x-www-form-urlencoded
2018-03-29 21:21:23 +02:00
// add custom middleware (note: build out to accept dynamically use what is in server/middleware/
app . use ( requestLogger ) ;
2018-03-29 20:24:52 +02:00
// configure passport
2018-03-29 20:40:47 +02:00
const speechPassport = require ( 'speechPassport' ) ;
2018-03-29 20:24:52 +02:00
// initialize passport
app . use ( cookieSession ( {
name : 'session' ,
keys : [ this . sessionKey ] ,
maxAge : 24 * 60 * 60 * 1000 , // i.e. 24 hours
} ) ) ;
2018-03-29 20:40:47 +02:00
app . use ( speechPassport . initialize ( ) ) ;
app . use ( speechPassport . session ( ) ) ;
2018-03-29 20:24:52 +02:00
// configure handlebars & register it with express app
const hbs = expressHandlebars . create ( {
defaultLayout : 'embed' ,
handlebars : Handlebars ,
} ) ;
app . engine ( 'handlebars' , hbs . engine ) ;
app . set ( 'view engine' , 'handlebars' ) ;
// set the routes on the app
2018-03-29 21:21:23 +02:00
require ( './routes/auth/' ) ( app ) ;
require ( './routes/api/' ) ( app ) ;
require ( './routes/pages/' ) ( app ) ;
require ( './routes/assets/' ) ( app ) ;
require ( './routes/fallback/' ) ( app ) ;
2018-03-29 20:24:52 +02:00
this . app = app ;
} ;
this . initialize = ( ) => {
this . createApp ( ) ;
this . server = http . Server ( this . app ) ;
} ;
this . start = ( ) => {
2018-03-29 20:40:47 +02:00
const db = require ( './models/' ) ;
2018-03-29 20:24:52 +02:00
// sync sequelize
db . sequelize . sync ( )
// start the server
. then ( ( ) => {
this . server . listen ( this . PORT , ( ) => {
logger . info ( ` Server is listening on PORT ${ this . PORT } ` ) ;
} ) ;
} )
. catch ( ( error ) => {
logger . error ( ` Startup Error: ` , error ) ;
} ) ;
} ;
} ;
module . exports = Server ;