UNPKG

@scefira/dfw-nodejs

Version:
99 lines (76 loc) 3.4 kB
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){ var cfgkeys = Object.keys(instance.config.databases); cfgkeys.forEach((key:string) => { var dbcfg = instance.config.databases![key]; this.setDatabase(key,new Database(dbcfg)); }); } } public async touchAsync(dfw:DFWScheme){ dfw.db = this.getDatabase.bind(this); } 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 createDatabase(dbuser:string,dbpassword:string,dbname:string,dialect:Dialect = "mysql"):Promise<boolean>{ var s = new Sequelize("", dbuser,dbpassword,{ dialect }); try{ await s.query("CREATE DATABASE `"+dbname+"`;") return true; }catch(e){ return false; } } } export class Database{ public entityHandler = new EntityHandler(this); public connection: 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.connection = new Sequelize(config); console.log({models:Object.keys(this.connection.models)}); } public getRepository<M extends Model>(modelClass:(new () => M)):Repository<M>{ return this.connection.getRepository(modelClass as any) as any; } public retriveModel<M extends Model>(model:(new () => M)):(new () => M) & NonAbstract<typeof Model>{ if(this.connection.repositoryMode === true){ return this.getRepository(model) as any }else{ return model as any; } } }