import * as fs from "fs" import { join, resolve, dirname } from "path" import { Sequelize } from "sequelize" const { readdir } = require('fs').promises; async function getFiles(dir) { const dirents = await readdir(dir, { withFileTypes: true }); const files = await Promise.all(dirents.map((dirent) => { const res = resolve(dir, dirent.name); return dirent.isDirectory() ? getFiles(res) : res; })); return Array.prototype.concat(...files); } const validateFile = (file) => { return (file.indexOf(".") !== 0) && (file !== "index.js") && (file.indexOf(".DS_Store") <= 0) && (file.indexOf(".map") <= 0) } export default class DataBaseModel { public name: string public db: any public sequelize: any public constructor(config) { this.name = config.database this.db = {}; this.sequelize = new Sequelize(config.database, config.user, config.password, { host: config.host, port: config.port, dialect: config.dialect || "mysql", pool: config.pool || { max: 10, min: 2, idle: 10000 }, define: { timestamps: config.timestamps || false }, //logging: config.log || console.log }); try { this.sequelize.authenticate(); } catch (error) { console.error("Unable to connect to the database:", error); } this.sequelize.dialect.supports.schemas = true; this.db.sequelize = this.sequelize; this.db.Sequelize = Sequelize this.sequelize.sync({ alter: config['alter_sync'] || false, force: config['force_sync'] || false }) } public async init() { await getFiles(join(dirname(require.main.filename), 'models')).then((files: any) => { return files.filter((file) => validateFile(file) ) .forEach((file) => { const model = require(file)(this.sequelize, Sequelize) this.db[model.name] = model; }) }).catch(e => { console.log('Error Parsing Model', e) }); Object.keys(this.db).forEach((modelName) => { if ("associate" in this.db[modelName]) { this.db[modelName].associate(this.db); } }) return this.db } } export const Database = async (c) => { const dbs = new DataBaseModel(c) return dbs.init(); }