migrations
This commit is contained in:
+71
-62
@@ -4,7 +4,7 @@ import { getLogger, Logger, } from "log4js";
|
||||
import { promises as fs, mkdirSync } from "fs"
|
||||
import { RPCServer } from 'rpclibrary'
|
||||
import * as Path from 'path'
|
||||
import * as Knex from 'knex';
|
||||
import * as Knex from 'knex';
|
||||
import * as http from 'http';
|
||||
import * as express from 'express';
|
||||
import { GuildManager } from '../Components/Guild/GuildManager';
|
||||
@@ -36,18 +36,18 @@ getLogger().level = 'debug'
|
||||
PubSub
|
||||
]
|
||||
})
|
||||
export class FrontworkAdmin
|
||||
implements TableDefinitionExporter, IAdmin {
|
||||
knex:Knex
|
||||
export class FrontworkAdmin
|
||||
implements TableDefinitionExporter, IAdmin {
|
||||
knex: Knex
|
||||
config: RPCConfigLoader<AdminConf>
|
||||
rpcServer: RPCServer
|
||||
|
||||
private express
|
||||
private httpServer
|
||||
|
||||
constructor(private frontworkComponents: FrontworkComponent[] = []){
|
||||
constructor(private frontworkComponents: FrontworkComponent[] = []) {
|
||||
this.config = new RPCConfigLoader<AdminConf>({
|
||||
name: "FrontworkAdminConf",
|
||||
name: "FrontworkAdminConf",
|
||||
getDefaultConfig: () => {
|
||||
return {
|
||||
httpPort: 8080,
|
||||
@@ -55,57 +55,61 @@ implements TableDefinitionExporter, IAdmin {
|
||||
dbConf: {
|
||||
client: 'sqlite3',
|
||||
connection: {
|
||||
filename: Path.resolve(__dirname, '../../../..', "data/frontworkAdmin.sqlite")
|
||||
filename: Path.resolve(__dirname, '../../../..', "data/frontworkAdmin.sqlite"),
|
||||
},
|
||||
migrations: {
|
||||
directory: Path.resolve(__dirname, '../../../..', "migrations"),
|
||||
extension: 'ts'
|
||||
},
|
||||
useNullAsDefault: true,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}, './config', this.configChangeHandler)
|
||||
}, './config', this.configChangeHandler)
|
||||
}
|
||||
|
||||
async start(){
|
||||
async start() {
|
||||
await this.makeKnex()
|
||||
this.startWebsocket()
|
||||
await Promise.all( this.frontworkComponents.map(c => c.initialize?c.initialize():undefined ))
|
||||
getLogger('Admin#start').debug(this.frontworkComponents.length+" components initialized")
|
||||
await Promise.all(this.frontworkComponents.map(c => c.initialize ? c.initialize() : undefined))
|
||||
getLogger('Admin#start').debug(this.frontworkComponents.length + " components initialized")
|
||||
await this.startWebserver()
|
||||
}
|
||||
|
||||
stop(){
|
||||
Promise.all([
|
||||
...this.frontworkComponents.map(c => c.stop?c.stop():undefined ),
|
||||
stop() {
|
||||
Promise.all([
|
||||
...this.frontworkComponents.map(c => c.stop ? c.stop() : undefined),
|
||||
])
|
||||
.catch(e => getLogger('Admin#stop').warn(e))
|
||||
.finally(() => {
|
||||
this.rpcServer.destroy()
|
||||
process.exit(0)
|
||||
})
|
||||
.catch(e => getLogger('Admin#stop').warn(e))
|
||||
.finally(() => {
|
||||
this.rpcServer.destroy()
|
||||
process.exit(0)
|
||||
})
|
||||
}
|
||||
|
||||
protected configChangeHandler = (conf:AdminConf, key?:string) => {
|
||||
if(key === 'dbConf'){
|
||||
protected configChangeHandler = (conf: AdminConf, key?: string) => {
|
||||
if (key === 'dbConf') {
|
||||
this.makeKnex()
|
||||
}
|
||||
}
|
||||
|
||||
getConfigKey(key:string){
|
||||
getConfigKey(key: string) {
|
||||
return this.config.getConfigKey(key)
|
||||
}
|
||||
|
||||
setConfigKey(key:string, value:any){
|
||||
setConfigKey(key: string, value: any) {
|
||||
return this.config.setConfigKey(key, value)
|
||||
}
|
||||
|
||||
getTableDefinitions(): TableDefiniton[]{
|
||||
getTableDefinitions(): TableDefiniton[] {
|
||||
return [
|
||||
...this.frontworkComponents
|
||||
]
|
||||
.filter(exp => exp.getTableDefinitions != null)
|
||||
.flatMap(exp => exp.getTableDefinitions())
|
||||
.filter(exp => exp.getTableDefinitions != null)
|
||||
.flatMap(exp => exp.getTableDefinitions())
|
||||
}
|
||||
|
||||
private startWebsocket(){
|
||||
private startWebsocket() {
|
||||
this.rpcServer = new RPCServer(20000, [
|
||||
...this.frontworkComponents,
|
||||
{
|
||||
@@ -121,40 +125,41 @@ implements TableDefinitionExporter, IAdmin {
|
||||
getLogger('Admin#startWebsocket').debug("Websocket up on", 20000)
|
||||
}
|
||||
|
||||
private async startWebserver(){
|
||||
if(this.httpServer != null || this.express != null){
|
||||
private async startWebserver() {
|
||||
if (this.httpServer != null || this.express != null) {
|
||||
getLogger('Admin#startWebserver').warn("Webserver is already running")
|
||||
return
|
||||
}
|
||||
|
||||
let port:number = this.config.getConfig().httpPort
|
||||
|
||||
let port: number = this.config.getConfig().httpPort
|
||||
this.express = express()
|
||||
|
||||
const distFolder = "../../../../dist"
|
||||
const ngExpressServer = Path.join(__dirname, distFolder, 'server.js')
|
||||
|
||||
this.express.get('*.*', (req, res)=>{
|
||||
this.express.get('*.*', (req, res) => {
|
||||
//console.log('*.*', req.path);
|
||||
res.sendFile(Path.join(__dirname, distFolder,'browser',decodeURIComponent(req.path)))
|
||||
res.sendFile(Path.join(__dirname, distFolder, 'browser', decodeURIComponent(req.path)))
|
||||
res.status(200)
|
||||
})
|
||||
|
||||
try{
|
||||
const req = require(distFolder+"/server.js")
|
||||
try {
|
||||
const req = require(distFolder + "/server.js")
|
||||
await req.attachExpress(this.express)
|
||||
getLogger('Admin#startWebserver').info('Frontend from '+ngExpressServer+" loaded")
|
||||
}catch(e){
|
||||
getLogger('Admin#startWebserver').info('Frontend from ' + ngExpressServer + " loaded")
|
||||
} catch (e) {
|
||||
getLogger('Admin#startWebserver').error(e)
|
||||
getLogger('Admin#startWebserver').warn("No angular SSR module was provided in "+ngExpressServer)
|
||||
getLogger('Admin#startWebserver').warn("This is not fatal, but your page will not render on *"+port)
|
||||
getLogger('Admin#startWebserver').warn("No angular SSR module was provided in " + ngExpressServer)
|
||||
getLogger('Admin#startWebserver').warn("This is not fatal, but your page will not render on *" + port)
|
||||
}
|
||||
|
||||
this.express.listen(port, () => {
|
||||
getLogger('Admin#startWebserver').info('Admin panel listening for HTTP on *'+port)
|
||||
getLogger('Admin#startWebserver').info('Admin panel listening for HTTP on *' + port)
|
||||
})
|
||||
}
|
||||
|
||||
private stopWebserver(){
|
||||
if(this.httpServer == null || this.express == null){
|
||||
private stopWebserver() {
|
||||
if (this.httpServer == null || this.express == null) {
|
||||
getLogger('Admin#stopWebserver').warn("Webserver is not running")
|
||||
return
|
||||
}
|
||||
@@ -164,38 +169,42 @@ implements TableDefinitionExporter, IAdmin {
|
||||
getLogger('Admin#stopWebserver').info("Webserver stopped")
|
||||
}
|
||||
|
||||
async makeKnex():Promise<Knex>{
|
||||
const conf:Knex.Config = this.config.getConfigKey("dbConf")
|
||||
async makeKnex(): Promise<Knex> {
|
||||
const conf: Knex.Config = this.config.getConfigKey("dbConf")
|
||||
|
||||
getLogger('Admin#makeKnex').debug("Making new knex:", conf)
|
||||
if(conf.client === 'sqlite3'){
|
||||
mkdirSync(Path.dirname((<any>conf.connection).filename), {recursive: true})
|
||||
getLogger('Admin#makeKnex').debug("Making new knex:", conf)
|
||||
if (conf.client === 'sqlite3') {
|
||||
mkdirSync(Path.dirname((<any>conf.connection).filename), { recursive: true })
|
||||
}
|
||||
|
||||
this.knex = Knex(conf)
|
||||
if(conf.client === 'sqlite3'){
|
||||
if (conf.client === 'sqlite3') {
|
||||
await this.knex.raw('PRAGMA foreign_keys = ON');
|
||||
|
||||
|
||||
}
|
||||
|
||||
await Promise.all(
|
||||
this.getTableDefinitions()
|
||||
//make unique by name
|
||||
.filter((other, index, self) => index === self.findIndex(
|
||||
(self) => self.name === other.name)
|
||||
)
|
||||
//create table if not exists
|
||||
.map(async (def)=> {
|
||||
const hasTable = await this.knex.schema.hasTable(def.name)
|
||||
if(!hasTable)
|
||||
return await this.knex.schema.createTable(def.name, def.tableBuilder)
|
||||
})
|
||||
//make unique by name
|
||||
.filter((other, index, self) => index === self.findIndex(
|
||||
(self) => self.name === other.name)
|
||||
)
|
||||
//create table if not exists
|
||||
.map(async (def) => {
|
||||
const hasTable = await this.knex.schema.hasTable(def.name)
|
||||
if (!hasTable)
|
||||
return await this.knex.schema.createTable(def.name, def.tableBuilder)
|
||||
})
|
||||
)
|
||||
await this.knex.migrate.latest().catch(e => {
|
||||
getLogger('Admin#makeKnex').error(e)
|
||||
process.exit(-1)
|
||||
})
|
||||
return this.knex
|
||||
}
|
||||
}
|
||||
|
||||
process.on( 'SIGINT', function() {
|
||||
getLogger('process#SIGINT').info("Shutting down from SIGINT (Ctrl-C)" );
|
||||
process.on('SIGINT', function () {
|
||||
getLogger('process#SIGINT').info("Shutting down from SIGINT (Ctrl-C)");
|
||||
Injector.resolve<FrontworkAdmin>(FrontworkAdmin).stop()
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user