module.exports = function () { var server = {}; server.run = (db) => { console.log("Starting Server") return new Promise((resolve, reject) => { const config = require('config'); const express = require('express'); const pug = require("pug"); const session = require("express-session"); const SequelizeSessionStore = require('connect-session-sequelize')(session.Store); const bodyParser = require("body-parser"); const path = require("path"); const passport = require('passport'); const HDAuthStrategy = require('../../passport-hd-auth').Strategy; const app = express(); app.set("view engine", "pug"); app.set("views", path.resolve("server/views")); app.use('/static', express.static("server/static")); // Session related stuff... function extendDefaultFields(defaults, session) { return { data: defaults.data, expires: session.cookie && session.cookie.expires ? session.cookie.expires : defaults.expires, // 157680000 userId: session.passport.user }; } var sessionStore = new SequelizeSessionStore({ db: db.sequelize, table: 'session', extendDefaultFields: extendDefaultFields // TODO: Define expiry and clean up... }); app.use(session({ store: sessionStore, secret: config.get("server.secret"), saveUninitialized: false, cookie: config.get("server.cookie") })); sessionStore.sync(); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); // Setup all passport strategies const hdAuthUtil = new HDAuthStrategy({ serverExtendedPrivateKey: config.get('bip32.serverExtendedPrivateKey'), serverExtendedPrivateKeyDerivationPath: config.get('bip32.serverExtendedPrivateKeyDerivationPath'), serviceAuthenticatingExtendedPublicKey: config.get('bip32.serviceAuthenticatingExtendedPublicKey') }, function(xpub, challengeRequestDerivationPath, challengeRequestMessage, challengeResponseSignature, done) { db.User.findOne({ include: [ { association: db.User.ExtendedPublicKeys, required: true, where: { xpub: xpub } } ] }).then(user => { if(user) { done(null, user, {verified: true}) } else { done(null, false); } }).catch(error => { done(error); }) }); passport.use(hdAuthUtil); // TODO: implement new hdAuthUtil.Strategy() passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { // TODO: Add memberships and things like that... return db.User.findByPk(id) // TODO: Limit attributes... .then(user => { return done(null, user); }).catch(error => { return done(error); }) }); app.use(passport.initialize()); app.use(passport.session()); // TODO: Create a load router module... that has inheritence... var router = require('./router/index.js')({ app: app, express: express, db: db, passport: passport, hdAuthUtil: hdAuthUtil }); // REGISTER OUR ROUTES ------------------------------- // all of our routes will be prefixed with /api app.use('/', router); const port = process.env.PORT || config.get("server.port"); app.listen(port); resolve(port); }); } // TODO: other features I might wanna do in the server... return server; };