server: load async, add config

Change-Id: I451498d80faf647df2fec0d89aaa5f4a6efcf21d
diff --git a/app.js b/app.js
index 246b962..0c92661 100644
--- a/app.js
+++ b/app.js
@@ -23,42 +23,16 @@
 //const sessionStore = new RedisStore({ client: redis })
 const sessionStore = new session.MemoryStore()
 
-const app = express()
-console.log(`Loading server for ${app.get('env')}`)
-const development = app.get('env') === 'development'
-
-if (development) {
-    const webpack = require('webpack')
-    const webpackConfig = require('./client/webpack.config.js')
-    const compiler = webpack(webpackConfig)
-    app.use(require('webpack-dev-middleware')(compiler, {
-        publicPath: webpackConfig.output.publicPath
-    }));
-    app.use(require('webpack-hot-middleware')(compiler));
+const loadConfig = async (filePath) => {
+    try {
+        return JSON.parse(await fs.readFile(filePath))
+    } catch {
+        return {}
+    }
 }
 
 /*
-    Configuation for Passeport Js
-*/
-app.disable('x-powered-by');
-
-app.use(session({
-    store: sessionStore,
-    resave: false,
-    saveUninitialized: true,
-    cookie: {
-        secure: false,//process.env.ENVIRONMENT !== 'development' && process.env.ENVIRONMENT !== 'test',
-        maxAge: 2419200000
-    },
-    secret: process.env.SECRET_KEY_BASE
-}));
-app.use(passport.initialize());
-app.use(passport.session());
-// app.use(app.router);
-//app.use(cors())
-
-/*
-    Share sessions between Passport.js and Socket.io
+Share sessions between Passport.js and Socket.io
 */
 
 function logSuccess() {
@@ -70,136 +44,178 @@
 }
 
 /*
-io.use(passportSocketIo.authorize({
-    key: 'connect.sid',
-    secret: process.env.SECRET_KEY_BASE,
-    store: sessionStore,
-    passport: passport,
-    cookieParser: cookieParser,
-    //success: logSuccess(),
-    // fail: logFail(),
-}));
-*/
 
-/*
+tempAccounts holds users accounts while tempting to authenticate them on Jams.
+connectedUsers  holds users accounts after they got authenticated by Jams.
 
-    tempAccounts holds users accounts while tempting to authenticate them on Jams.
-    connectedUsers  holds users accounts after they got authenticated by Jams.
-
-    Users should be removed from connectedUsers when receiving a disconnect
-    web socket call
+Users should be removed from connectedUsers when receiving a disconnect
+web socket call
 
 */
 const tempAccounts = {};
 const connectedUsers = {};
 
-const jami = new JamiDaemon();
-const apiRouter = new JamiRestApi(jami).getRouter()
+const createServer = async (appConfig) => {
+    const app = express()
+    console.log(`Loading server for ${app.get('env')} with config:`)
+    console.log(appConfig)
+    const development = app.get('env') === 'development'
 
-passport.serializeUser((user, done) => {
-    console.log(user)
-    connectedUsers[user.accountId] = user;
-    console.log("=============================SerializeUser called " + user.accountId)
-    done(null, user.accountId);
-});
-
-const deserializeUser = (id, done) => {
-    console.log("=============================DeserializeUser called on: " + id + " " + connectedUsers[id])
-    done(null, connectedUsers[id]);
-};
-passport.deserializeUser(deserializeUser);
-
-//var tempAccountId = '';
-
-const jamsStrategy = new LocalStrategy(
-    (username, password, done) => {
-
-        const newUser = {};
-        newUser.username = username;
-        //newUser.socketid =
-
-        const accountId = jami.addAccount({
-            'managerUri': 'https://jams.savoirfairelinux.com',
-            'managerUsername': username,
-            'archivePassword': password
-        });
-
-        const newProps = jami.getAccount(accountId).details;
-        console.log(newProps);
-        //Object.entries(newProps).forEach(v => console.log(v[0], v[1]))
-        //tempAccountId = accountId;
-        newUser.accountId = accountId;
-        console.log("AccountId: " + accountId);
-        connectedUsers[accountId] = newUser;
-        tempAccounts[accountId] = { done, newUser };
-
-        //return done(null, newUser);
-
-        /*User.findOne({ username: username }, function (err, user) {
-            if (err) { return done(err); }
-            if (!user) {
-                return done(null, false, { message: 'Incorrect username.' });
-            }
-            if (!user.validPassword(password)) {
-                return done(null, false, { message: 'Incorrect password.' });
-            }
-            return done(null, user);
-        });*/
+    if (development) {
+        const webpack = require('webpack')
+        const webpackConfig = require('./client/webpack.config.js')
+        const compiler = webpack(webpackConfig)
+        app.use(require('webpack-dev-middleware')(compiler, {
+            publicPath: webpackConfig.output.publicPath
+        }));
+        app.use(require('webpack-hot-middleware')(compiler));
     }
-);
-jamsStrategy.name = "jams";
 
-const localStrategy = new LocalStrategy(
-    (username, password, done) => {
-        console.log("localStrategy: " + username + " " + password);
+    /*
+        Configuation for Passeport Js
+    */
+    app.disable('x-powered-by');
 
-        const newUser = {};
-        newUser.accountId = jami.getAccountList()[0].getId();
-        console.log("Local AccountId: " + newUser.accountId);
-        connectedUsers[newUser.accountId] = newUser;
-        done(null, newUser);
-    }
-);
+    app.use(session({
+        store: sessionStore,
+        resave: false,
+        saveUninitialized: true,
+        cookie: {
+            secure: false,//!development,
+            maxAge: 2419200000
+        },
+        secret: process.env.SECRET_KEY_BASE
+    }));
+    app.use(passport.initialize());
+    app.use(passport.session());
+    // app.use(app.router);
+    //app.use(cors())
 
-passport.use(jamsStrategy);
-passport.use(localStrategy);
+    const jami = new JamiDaemon();
+    const apiRouter = new JamiRestApi(jami).getRouter()
 
-const secured = (req, res, next) => {
-    console.log(`isSecured ${req.user}`);
-    if (req.user && req.user.accountId) {
-        return next();
-    }
-    res.status(401).end()
-};
-const securedRedirect = (req, res, next) => {
-    if (req.user && req.user.accountId) {
-        return next();
-    }
-    req.session.returnTo = req.originalUrl;
-    res.redirect('/login');
-};
+    /*
+    io.use(passportSocketIo.authorize({
+        key: 'connect.sid',
+        secret: process.env.SECRET_KEY_BASE,
+        store: sessionStore,
+        passport: passport,
+        cookieParser: cookieParser,
+        //success: logSuccess(),
+        // fail: logFail(),
+    }));
+    */
 
-app.post('/auth', passport.authenticate('jams'), (req, res) => {
-    res.json({ loggedin: true })
-});
-app.post('/api/localLogin', passport.authenticate('local'), (req, res) => {
-    res.json({ loggedin: true })
-});
+    passport.serializeUser((user, done) => {
+        console.log(user)
+        connectedUsers[user.accountId] = user;
+        console.log("=============================SerializeUser called " + user.accountId)
+        done(null, user.accountId);
+    });
 
-app.use('/api', secured, apiRouter);
+    const deserializeUser = (id, done) => {
+        console.log("=============================DeserializeUser called on: " + id + " " + connectedUsers[id])
+        done(null, connectedUsers[id]);
+    };
+    passport.deserializeUser(deserializeUser);
 
-app.use('/', indexRouter);
+    //var tempAccountId = '';
 
-/* GET React App */
+    const jamsStrategy = new LocalStrategy(
+        (username, password, done) => {
 
-app.use(express.static(path.join(__dirname, 'client', 'dist')))
+            const newUser = {};
+            newUser.username = username;
+            //newUser.socketid =
 
-app.use((req, res, next) => {
-    res.sendFile(path.join(__dirname, 'client', 'dist', 'index.html'));
-});
+            const accountId = jami.addAccount({
+                'managerUri': 'https://jams.savoirfairelinux.com',
+                'managerUsername': username,
+                'archivePassword': password
+            });
 
-const server = http.Server(app);
-server.listen(3000);
+            const newProps = jami.getAccount(accountId).details;
+            console.log(newProps);
+            //Object.entries(newProps).forEach(v => console.log(v[0], v[1]))
+            //tempAccountId = accountId;
+            newUser.accountId = accountId;
+            console.log("AccountId: " + accountId);
+            connectedUsers[accountId] = newUser;
+            tempAccounts[accountId] = { done, newUser };
+
+            //return done(null, newUser);
+
+            /*User.findOne({ username: username }, function (err, user) {
+                if (err) { return done(err); }
+                if (!user) {
+                    return done(null, false, { message: 'Incorrect username.' });
+                }
+                if (!user.validPassword(password)) {
+                    return done(null, false, { message: 'Incorrect password.' });
+                }
+                return done(null, user);
+            });*/
+        }
+    );
+    jamsStrategy.name = "jams";
+
+    const localStrategy = new LocalStrategy(
+        (username, password, done) => {
+            console.log("localStrategy: " + username + " " + password);
+
+            const newUser = {};
+            newUser.accountId = jami.getAccountList()[0].getId();
+            console.log("Local AccountId: " + newUser.accountId);
+            connectedUsers[newUser.accountId] = newUser;
+            done(null, newUser);
+        }
+    );
+
+    passport.use(jamsStrategy);
+    passport.use(localStrategy);
+
+    const secured = (req, res, next) => {
+        console.log(`isSecured ${req.user}`);
+        if (req.user && req.user.accountId) {
+            return next();
+        }
+        res.status(401).end()
+    };
+    const securedRedirect = (req, res, next) => {
+        if (req.user && req.user.accountId) {
+            return next();
+        }
+        req.session.returnTo = req.originalUrl;
+        res.redirect('/login');
+    };
+
+    app.post('/auth', passport.authenticate('jams'), (req, res) => {
+        res.json({ loggedin: true })
+    });
+    app.post('auth/localLogin', passport.authenticate('local'), (req, res) => {
+        res.json({ loggedin: true })
+    });
+
+    app.use('/api', secured, apiRouter);
+
+    app.use('/', indexRouter);
+
+    /* GET React App */
+
+    app.use(express.static(path.join(__dirname, 'client', 'dist')))
+
+    app.use((req, res, next) => {
+        res.sendFile(path.join(__dirname, 'client', 'dist', 'index.html'));
+    });
+
+    return http.Server(app);
+}
+
+loadConfig()
+    .then(createServer)
+    .then(server => {
+        server.listen(3000);
+    })
 
 /*
 io.on('connection', (socket) => {