@scefira/dfw-nodejs
Version:
100 lines (77 loc) • 3.44 kB
text/typescript
import DFWModule from "./DFWModule";
import { DFWScheme } from "../..";
import { Sequelize , SequelizeOptions, Repository } from "sequelize-typescript";
import path from "path";
import DFWInstance from "../system/DFWInstance";
import { Dialect, Model } from "sequelize/types";
import { NonAbstract } from "sequelize-typescript/dist/shared/types";
import EntityHandler from "../system/EntityHandler";
export default class DatabaseManager extends DFWModule{
private databases:{[id:string]:Database} = {};
public constructor(instance:DFWInstance){
super(instance);
if(instance.config.database !== undefined){
this.setDatabase("default",new Database(instance.config.database));
}
if(instance.config.databases != undefined){
let cfgkeys = Object.keys(instance.config.databases);
cfgkeys.forEach((key:string) => {
let dbcfg = instance.config.databases![key];
this.setDatabase(key,new Database(dbcfg));
});
}
}
public async touchAsync(dfw:DFWScheme){
dfw.db = this.getDatabase();
}
public getDatabase(name:string = "default"){
return this.databases[name];
}
public setDatabase(key:string,db:Database){
if(this.databases[key] === undefined){
this.databases[key] = db;
}else{
console.error(`[DFW] Database id key '${key}' is already set, this instance will be ignored and not setted`);
}
}
////////////////////////////////////////////////////////////
//////////// static methods ////////////////////////////////
////////////////////////////////////////////////////////////
public static async createDatabaseAsync(dbuser:string,dbpassword:string,dbname:string,dialect:Dialect = "mysql",host:string = "localhost"):Promise<boolean>{
let s = new Sequelize("", dbuser,dbpassword,{
dialect,
host
});
try{
await s.query("CREATE DATABASE `"+dbname+"`;")
return true;
}catch(e){
return false;
}
}
}
export class Database{
public entityHandler = new EntityHandler(this);
public sequelize: Sequelize;
public constructor(config:SequelizeOptions){
if (config.models === undefined) config.models = [];
if (config.repositoryMode === undefined) config.repositoryMode = false; // By default repository mode is disabled
if(process.env.NODE_ENV === "dfw_development"){
config.models.unshift(path.join(__dirname, '../../model', "/*.model.ts") as any);
}else{
config.models.unshift(path.join(__dirname, '../../model', "/*.model.js") as any);
}
this.sequelize = new Sequelize(config);
console.log({models:Object.keys(this.sequelize.models)});
}
public getRepository<M extends Model>(modelClass:(new () => M)):Repository<M>{
return this.sequelize.getRepository(modelClass as any) as any;
}
public retriveModel<M extends Model>(model:(new () => M)):(new () => M) & NonAbstract<typeof Model>{
if(this.sequelize.repositoryMode === true){
return this.getRepository(model) as any
}else{
return model as any;
}
}
}