migrations

This commit is contained in:
peter
2020-03-25 23:49:54 +01:00
parent b28f8bc7ce
commit 9ff98d92ae
62 changed files with 711 additions and 483 deletions
+71 -62
View File
@@ -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()
})