const express = require('express') const app = express() const morgan = require('morgan') const bodyParser = require('body-parser') const mongoClient = require('mongodb').MongoClient const fs = require('fs-extra') const session = require('./services/session/router') const restapi = require('./services/restapi/router') const media = require('./services/media/router') const coreCfg = require('./services/core/config/router') const CFG = require('./config') const PKG = require('./package') const auth = require('./services/session/auth') const CTX = { cfg: CFG, logEnabled: true, dbHandler: null, db: null, tools: require('./tools/common'), models: {} } let server = { handler: null, interval: null, onReady: function () {} } app.use(morgan('tiny', { skip: function (req, res) { return !CTX.logEnabled } })) app.use(bodyParser.json()) app.use(require('./tools/middleware-done')) mongoClient.connect(CFG.mongo.url, { useNewUrlParser: true }, function (pErr, pDbHandler) { if (pErr) { if (CTX.logEnabled) { console.error(`[!] Failed to connect DB: ${CFG.mongo.url}`) console.error(pErr) } process.exit(1) } // ////////////////////////////////////////////////////////////////////////// // Init folder fs.ensureDirSync(CFG.media.documents) fs.ensureDirSync(CFG.media.cache) // ////////////////////////////////////////////////////////////////////////// // DB HANDLING if (CTX.logEnabled) console.log(`[-] Connected to mongoDB: ${CFG.mongo.url}`) CTX.dbHandler = pDbHandler CTX.db = CTX.dbHandler.db(CFG.mongo.db) addUserIfRequired() // ////////////////////////////////////////////////////////////////////////// // ROUTING app.use('/session', session(CTX)) app.use('/doc', express.static('../doc/api')) app.get('/', (req, res) => { res.send(`Hello World from Earth server - v${PKG.version} - build ${CTX.tools.git.currentRevision}`) }) // ALL API after auth call required authentification app.use(auth(CTX)) app.use('/api', restapi(CTX)) app.use('/media', media(CTX)) app.use('/core/config', coreCfg(CTX)) // ////////////////////////////////////////////////////////////////////////// // LISTENING server.handler = app.listen(CFG.server.port, () => { if (CTX.logEnabled) console.log(`[-] Current build: ${CTX.tools.git.currentRevision}`) if (CTX.logEnabled) console.log(`[-] Earth server listening on: ${CFG.server.port}`) server.onReady() }) }) app.stop = function () { server.interval = setTimeout(function () { server.handler.close() CTX.db.handler.close() }, 500) } app.setOnReady = function (done) { clearTimeout(server.interval) server.onReady = done if (server.handler) { server.onReady() } } app.setLog = function (pFlag) { CTX.logEnabled = pFlag } module.exports = app function addUserIfRequired () { let dbUsers = CTX.db.collection('users') dbUsers.find({}).count(function (pErr, pCount) { if (!pCount) { let user = { username: 'admin', email: 'admin@earth.com', details: { firstname: 'Admin', lastname: 'Admin', company: 'Earth', corporateTitle: 'BigBoss', language: 'en' }, rights: { role: 'admin' }, multipass: { hash: 'admin' } } dbUsers.insert(user, function () {}) } }) }