UNPKG

@scefira/dfw-nodejs

Version:
100 lines (77 loc) 3.44 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){ 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; } } }