legendaryjs
Version:
LegendaryJS – The ultimate backend framework for speed, power, and simplicity.
70 lines (58 loc) • 2.17 kB
JavaScript
const mongoose = require('mongoose');
const { Sequelize, DataTypes } = require('sequelize');
const dbConfig = require('../../legendary.config').db;
const connections = {
mysql: null,
postgres: null,
};
function createModel({ name, db, fields }) {
if (!name || !fields || !db) throw new Error('❌ Missing model name, db or fields');
if (db === 'mongo' && dbConfig.mongo) {
// 🧠 Mongoose Schema Builder
const schemaObj = {};
for (const key in fields) {
const val = fields[key];
schemaObj[key] = typeof val === 'string' ? { type: eval(val) } : val;
}
const schema = new mongoose.Schema(schemaObj);
return mongoose.model(name, schema);
}
if ((db === 'mysql' && dbConfig.mysql) || (db === 'postgres' && dbConfig.postgres)) {
// 🔌 Connect Sequelize once
if (!connections[db]) {
const dialect = db;
const dbName = process.env[`${db.toUpperCase()}_DB`] || 'legendarydb';
const dbUser = process.env[`${db.toUpperCase()}_USER`] || 'root';
const dbPass = process.env[`${db.toUpperCase()}_PASS`] || '';
const dbHost = process.env[`${db.toUpperCase()}_HOST`] || 'localhost';
connections[db] = new Sequelize(dbName, dbUser, dbPass, {
host: dbHost,
dialect,
logging: false,
});
}
const sequelize = connections[db];
const modelFields = {};
for (const key in fields) {
const val = fields[key];
modelFields[key] = typeof val === 'string' ? mapType(val) : val;
}
return sequelize.define(name, modelFields, {
timestamps: false,
});
}
throw new Error('❌ Unsupported or inactive database');
}
// 🔁 Type Mapper for Sequelize
function mapType(type) {
switch (type.toLowerCase()) {
case 'string': return DataTypes.STRING;
case 'int': case 'integer': return DataTypes.INTEGER;
case 'float': return DataTypes.FLOAT;
case 'boolean': return DataTypes.BOOLEAN;
case 'date': return DataTypes.DATE;
case 'text': return DataTypes.TEXT;
default: return DataTypes.STRING;
}
}
module.exports = { createModel };