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