Simple way to build clouds from nothing
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

121 lines
3.3 KiB

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 () {})
}
})
}