68 lines
1.5 KiB
V
68 lines
1.5 KiB
V
module main
|
|
|
|
import vweb
|
|
import db.sqlite
|
|
import time
|
|
import os
|
|
import log
|
|
|
|
struct App {
|
|
vweb.Context
|
|
config Config [vweb_global]
|
|
mut:
|
|
logger log.Logger [vweb_global]
|
|
is_admin bool
|
|
pub mut:
|
|
db sqlite.DB
|
|
}
|
|
|
|
fn main() {
|
|
config := load_config() or { panic('Could not load config file: ${err.str()}') }
|
|
|
|
mut logger := &log.Log{
|
|
level: log.level_from_tag(config.loglevel.to_upper()) or { log.Level.info }
|
|
output_target: log.LogTarget.console
|
|
}
|
|
|
|
log.set_logger(logger)
|
|
|
|
if !os.exists(config.db_path) {
|
|
logger.info('Creating database file at ' + config.db_path)
|
|
mut file := os.create(config.db_path) or { logger.fatal(err.str()) }
|
|
file.close()
|
|
}
|
|
|
|
db := sqlite.connect(config.db_path) or { logger.fatal('Database error! ${err.str()}') }
|
|
|
|
mut app := &App{
|
|
config: config
|
|
logger: logger
|
|
db: db
|
|
}
|
|
|
|
app.create_tables() or { logger.fatal('Could not create database tables! ${err.str()}') }
|
|
|
|
mut host := '0.0.0.0'
|
|
if config.host.len != 0 {
|
|
host = config.host
|
|
}
|
|
|
|
// Handle graceful shutdown for Docker
|
|
os.signal_opt(os.Signal.int, app.shutdown) or { logger.fatal(err.str()) }
|
|
os.signal_opt(os.Signal.term, app.shutdown) or { logger.fatal(err.str()) }
|
|
|
|
vweb.run_at(app, vweb.RunParams{
|
|
host: host
|
|
port: config.port
|
|
family: .ip
|
|
}) or { logger.fatal(err.str()) }
|
|
}
|
|
|
|
fn (mut app App) shutdown(sig os.Signal) {
|
|
app.db.close() or { app.logger.fatal(err.str()) }
|
|
app.logger.info('Shut down database gracefully')
|
|
app.logger.info('Exiting...')
|
|
time.sleep(1e+9) // Sleep one second
|
|
exit(0)
|
|
}
|