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-30 01:10:56 +02:00
const Path = require ( 'path' ) ;
2018-03-29 21:46:20 +02:00
const loggerConfig = require ( 'loggerConfig.js' ) ;
const mysqlConfig = require ( 'mysqlConfig.js' ) ;
const siteConfig = require ( 'siteConfig.js' ) ;
const slackConfig = require ( 'slackConfig.js' ) ;
2018-03-29 20:24:52 +02:00
function Server ( ) {
2018-03-29 21:46:20 +02:00
this . configureLogger = ( userConfig ) => {
loggerConfig . update ( userConfig ) ;
} ;
this . configureMysql = ( userConfig ) => {
mysqlConfig . update ( userConfig ) ;
2018-03-29 20:24:52 +02:00
} ;
2018-03-29 21:46:20 +02:00
this . configureSiteDetails = ( userConfig ) => {
siteConfig . update ( userConfig ) ;
2018-03-29 20:24:52 +02:00
} ;
2018-03-29 21:46:20 +02:00
this . configureSlack = ( userConfig ) => {
slackConfig . update ( userConfig ) ;
2018-03-29 20:24:52 +02:00
} ;
2018-03-29 21:21:23 +02:00
this . configureClientBundle = ( ) => {
2018-03-29 21:46:20 +02:00
logger . debug ( '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:46:20 +02:00
logger . debug ( 'here is where you could add/overwrite the default models' )
} ;
2018-03-29 21:21:23 +02:00
this . configureRoutes = ( ) => {
2018-03-29 21:46:20 +02:00
logger . debug ( 'here is where you could add/overwrite the default routes' )
} ;
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' ) ;
2018-03-30 01:10:56 +02:00
/* add middleware */
// set HTTP headers to protect against well-known web vulnerabilties
app . use ( helmet ( ) ) ;
// 'express.static' to serve static files from public directory
2018-03-30 03:25:50 +02:00
if ( siteConfig . routes . publicFolder ) {
2018-03-30 01:10:56 +02:00
// take in a different public folder, so it can serve it's own bundle if needed
2018-03-30 03:25:50 +02:00
const publicFolder = Path . resolve ( process . cwd ( ) , siteConfig . routes . publicFolder ) ;
app . use ( '/static' , express . static ( publicFolder ) ) ;
2018-03-30 01:10:56 +02:00
logger . info ( 'serving static files from custom path:' , publicFolder ) ;
} else {
const publicPath = Path . resolve ( _ _dirname , 'public' ) ;
2018-03-30 03:25:50 +02:00
app . use ( '/static' , express . static ( publicPath ) ) ;
2018-03-30 01:10:56 +02:00
logger . info ( 'serving static files from default path:' , publicPath ) ;
} ;
// 'body parser' for parsing application/json
app . use ( bodyParser . json ( ) ) ;
// 'body parser' for parsing application/x-www-form-urlencoded
app . use ( bodyParser . urlencoded ( { extended : true } ) ) ;
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
2018-03-29 21:46:20 +02:00
const sessionKey = siteConfig . auth . sessionKey ;
2018-03-29 20:24:52 +02:00
app . use ( cookieSession ( {
name : 'session' ,
2018-03-29 21:46:20 +02:00
keys : [ sessionKey ] ,
2018-03-29 20:24:52 +02:00
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 23:05:15 +02:00
const db = require ( 'models' ) ;
2018-03-29 21:46:20 +02:00
const PORT = siteConfig . details . port ;
2018-03-29 20:24:52 +02:00
// sync sequelize
db . sequelize . sync ( )
// start the server
. then ( ( ) => {
2018-03-29 21:46:20 +02:00
this . server . listen ( PORT , ( ) => {
logger . info ( ` Server is listening on PORT ${ PORT } ` ) ;
2018-03-29 20:24:52 +02:00
} ) ;
} )
. catch ( ( error ) => {
logger . error ( ` Startup Error: ` , error ) ;
} ) ;
} ;
} ;
module . exports = Server ;