2022-07-20 00:33:06 +00:00
|
|
|
import { Flaska, QueryHandler, JsonHandler, FormidableHandler } from 'flaska'
|
|
|
|
import formidable from 'formidable'
|
2022-04-05 16:47:24 +00:00
|
|
|
|
2022-06-16 22:44:43 +00:00
|
|
|
import { initPool } from './db.mjs'
|
2022-04-05 16:47:24 +00:00
|
|
|
import config from './config.mjs'
|
|
|
|
import PageRoutes from './page/routes.mjs'
|
2022-07-20 00:33:06 +00:00
|
|
|
import ArticleRoutes from './article/routes.mjs'
|
|
|
|
import AuthenticationRoutes from './authentication/routes.mjs'
|
|
|
|
import { authenticate } from './authentication/security.mjs'
|
2022-04-05 14:43:23 +00:00
|
|
|
|
2022-08-02 09:34:02 +00:00
|
|
|
export default class Server {
|
|
|
|
constructor(http, port, core, opts = {}) {
|
|
|
|
Object.assign(this, opts)
|
|
|
|
this.http = http
|
|
|
|
this.port = port
|
|
|
|
this.core = core
|
|
|
|
|
2022-08-05 14:26:29 +00:00
|
|
|
this.flaskaOptions = {
|
|
|
|
appendHeaders: {
|
|
|
|
'Content-Security-Policy': `default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src * data: blob:; font-src 'self' data:; object-src 'none'; frame-ancestors 'none'`,
|
|
|
|
},
|
|
|
|
log: this.core.log,
|
|
|
|
nonce: ['script-src'],
|
|
|
|
nonceCacheLength: 50,
|
|
|
|
}
|
2022-08-02 09:34:02 +00:00
|
|
|
this.authenticate = authenticate
|
|
|
|
this.formidable = FormidableHandler.bind(this, formidable)
|
|
|
|
this.jsonHandler = JsonHandler
|
|
|
|
this.routes = [
|
|
|
|
new PageRoutes(),
|
|
|
|
new ArticleRoutes(),
|
|
|
|
new AuthenticationRoutes(),
|
|
|
|
]
|
2022-08-05 14:26:29 +00:00
|
|
|
|
|
|
|
this.init()
|
2022-04-05 16:47:24 +00:00
|
|
|
}
|
|
|
|
|
2022-08-05 14:26:29 +00:00
|
|
|
init() { }
|
|
|
|
|
2022-08-02 09:34:02 +00:00
|
|
|
getRouteInstance(type) {
|
|
|
|
for (let route of this.routes) {
|
|
|
|
if (route instanceof type) {
|
|
|
|
return route
|
|
|
|
}
|
2022-04-05 14:43:23 +00:00
|
|
|
}
|
2022-08-02 09:34:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
addCustomRoutes() {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
runCreateServer() {
|
|
|
|
// Create our server
|
2022-08-05 14:26:29 +00:00
|
|
|
this.flaska = new Flaska(this.flaskaOptions, this.http)
|
2022-08-02 09:34:02 +00:00
|
|
|
|
|
|
|
// Create our database pool
|
|
|
|
let pool = this.runCreateDatabase()
|
|
|
|
|
|
|
|
// configure our server
|
|
|
|
if (config.get('NODE_ENV') === 'development') {
|
|
|
|
this.flaska.devMode()
|
|
|
|
}
|
|
|
|
|
|
|
|
this.flaska.before(function(ctx) {
|
|
|
|
ctx.state.started = new Date().getTime()
|
|
|
|
ctx.db = pool
|
|
|
|
})
|
|
|
|
this.flaska.before(QueryHandler())
|
|
|
|
|
|
|
|
this.flaska.after(function(ctx) {
|
|
|
|
let ended = new Date().getTime()
|
|
|
|
var requestTime = ended - ctx.state.started
|
|
|
|
|
|
|
|
let status = ''
|
|
|
|
let level = 'info'
|
|
|
|
if (ctx.status >= 400) {
|
|
|
|
status = ctx.status + ' '
|
|
|
|
level = 'warn'
|
|
|
|
}
|
|
|
|
if (ctx.status >= 500) {
|
|
|
|
level = 'error'
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx.log[level]({
|
|
|
|
duration: requestTime,
|
|
|
|
status: ctx.status,
|
|
|
|
}, `<-- ${status}${ctx.method} ${ctx.url}`)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
runRegisterRoutes() {
|
|
|
|
for (let route of this.routes) {
|
|
|
|
route.register(this)
|
2022-04-05 14:43:23 +00:00
|
|
|
}
|
2022-08-02 09:34:02 +00:00
|
|
|
}
|
2022-04-05 14:43:23 +00:00
|
|
|
|
2022-08-02 09:34:02 +00:00
|
|
|
runCreateDatabase() {
|
|
|
|
return initPool(this.core, config.get('mssql'))
|
|
|
|
}
|
|
|
|
|
|
|
|
runStartListen() {
|
|
|
|
return this.flaska.listenAsync(this.port).then(() => {
|
|
|
|
this.core.log.info('Server is listening on port ' + this.port)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
run() {
|
|
|
|
this.addCustomRoutes()
|
|
|
|
this.runCreateServer()
|
|
|
|
this.runRegisterRoutes()
|
|
|
|
|
|
|
|
return this.runStartListen()
|
|
|
|
}
|
|
|
|
}
|