@krishnapawar/mysql-models-builder
Version:
`mysql-models-builder` is a lightweight, easy-to-use, and promise-based Node.js ORM tool designed for MySQL. It simplifies database interactions by offering features like model-based query building, CRUD operations, and support for advanced queries such a
630 lines (610 loc) • 19.1 kB
JavaScript
const {
isLatest,isLimit,isCheck,isTable,isOne,isInt,isNotObject
} = require('./supporterMethodes');
const getKeyValue = (data, setType = "WHERE") => {
if (isCheck(data)) return "";
let setItem = [];
for (const [key, value] of Object.entries(data)) {
setItem.push(`${key}='${value}'`);
}
return " " + setType + " " + setItem.toString();
};
const selectOption = (data) => {
if (data != undefined && data.select != undefined && data.select != null && data.select != "" && data.select.length > 0)
return data.select.toString();
return "*";
};
//where clause condition
const whereAnd = (data) => {
if (isCheck(data)) return "";
let setItem = [];
for (const [key, value] of Object.entries(data)) {
if (setItem.length > 0) {
setItem.push(` AND ${key}='${value}'`);
} else {
setItem.push(`${key}='${value}'`);
}
}
return `${setItem.toString()}`;
};
const whereOr = (data) => {
if (isCheck(data)) return "";
let setItem = [];
for (const [key, value] of Object.entries(data)) {
if (setItem.length > 0) {
setItem.push(` OR ${key}='${value}'`);
} else {
setItem.push(`${key}='${value}'`);
}
}
return `${setItem.toString()}`;
};
const whereIs = (data) => {
if (isCheck(data)) return "";
let setItem = [];
for (const [key, value] of Object.entries(data)) {
if (setItem.length > 0) {
setItem.push(` AND ${key} IS ${value}`);
} else {
setItem.push(`${key} IS ${value}`);
}
}
return `${setItem.toString()}`;
};
const whereIsNull = (data) => {
if (isCheck(data)) return "";
let setItem = [];
for (const [key, value] of Object.entries(data)) {
if (setItem.length > 0) {
setItem.push(` AND ${value} IS NULL`);
} else {
setItem.push(`${value} IS NULL`);
}
}
return `${setItem.toString()}`;
};
const whereIsNotNull = (data) => {
if (isCheck(data)) return "";
let setItem = [];
for (const [key, value] of Object.entries(data)) {
if (setItem.length > 0) {
setItem.push(` AND ${value} IS NOT NULL`);
} else {
setItem.push(`${value} IS NOT NULL`);
}
}
return `${setItem.toString()}`;
};
const whereIn = (data) => {
if (isCheck(data)) return "";
let setItem = [];
for (const [key, value] of Object.entries(data)) {
if (setItem.length > 0) {
setItem.push(` AND ${key} IN (${value.toString()})`);
} else {
setItem.push(`${key} IN (${value.toString()})`);
}
}
return ` ${setItem.toString()}`;
};
const whereNotIn = (data) => {
if (isCheck(data)) return "";
let setItem = [];
for (const [key, value] of Object.entries(data)) {
if (setItem.length > 0) {
setItem.push(` AND ${key} NOT IN (${value.toString()})`);
} else {
setItem.push(`${key} NOT IN (${value.toString()})`);
}
}
return `${setItem.toString()}`;
};
const whereRaw = (data) => {
if (isCheck(data)) return "";
return `${data}`;
};
const onlyTrashed= (data) => {
if (isCheck(data)) return "";
if (data === true ) return " deleted_at IS NOT NULL ";
return "";
};
const whereClause = (data, resData) => {
if (isCheck(data)) return "";
let addCondition = "";
const where_not_in = whereNotIn(data.whereNotIn).replace(/,/g, "");
if (where_not_in != "") addCondition += where_not_in;
const where_in = whereIn(data.whereIn);
if (where_in != "" && where_not_in != "") {
addCondition += ` AND ${where_in}`;
} else if (where_in != "") {
addCondition += where_in;
}
const where_and = whereAnd(data.where).replace(/,/g, "");
if (where_and != "" && (where_in != "" || where_not_in != "")) {
addCondition += ` AND ${where_and}`;
} else if (where_and != "") {
addCondition += where_and;
}
const where_or = whereOr(data.whereOr).replace(/,/g, "");
if (
where_or != "" &&
(where_and != "" || where_in != "" || where_not_in != "")
) {
addCondition += ` OR ${where_or}`;
} else if (where_or != "") {
addCondition += where_or;
}
const where_is = whereIs(data.whereIs).replace(/,/g, "");
if (
where_is != "" &&
(where_or != "" || where_and != "" || where_in != "" || where_not_in != "")
) {
addCondition += ` AND ${where_is}`;
} else if (where_is != "") {
addCondition += where_is;
}
const connect_tb = connect(data, resData);
if (
connect_tb != "" &&
(where_is != "" ||
where_or != "" ||
where_and != "" ||
where_in != "" ||
where_not_in != "")
) {
addCondition += ` AND ${connect_tb}`;
} else if (connect_tb != "") {
addCondition += connect_tb;
}
const where_row = whereRaw(data.whereRaw);
if (
where_row != "" &&
(connect_tb != "" ||
where_is != "" ||
where_or != "" ||
where_and != "" ||
where_in != "" ||
where_not_in != "")
) {
addCondition += ` AND ${where_row}`;
} else if (where_row != "") {
addCondition += where_row;
}
const only_trashed = onlyTrashed(data.onlyTrashed);
if (
only_trashed != "" &&
(where_row != "" || connect_tb != "" ||
where_is != "" ||
where_or != "" ||
where_and != "" ||
where_in != "" ||
where_not_in != "")
) {
addCondition += ` AND ${only_trashed}`;
} else if (only_trashed != "") {
addCondition += only_trashed;
}
const where_is_null = whereIsNull(data.whereIsNull);
if (where_is_null != "" &&
(only_trashed != "" || where_row != "" || connect_tb != "" ||
where_is != "" ||
where_or != "" ||
where_and != "" ||
where_in != "" ||
where_not_in != "")
) {
addCondition += ` AND ${where_is_null}`;
} else if (where_is_null != "") {
addCondition += where_is_null;
}
const where_is_not_null = whereIsNotNull(data.whereIsNotNull);
if (where_is_not_null != "" &&
(where_is_null != "" || only_trashed != "" || where_row != "" || connect_tb != "" ||
where_is != "" ||
where_or != "" ||
where_and != "" ||
where_in != "" ||
where_not_in != "")
) {
addCondition += ` AND ${where_is_not_null}`;
} else if (where_is_not_null != "") {
addCondition += where_is_not_null;
}
return addCondition != "" ? `WHERE ${addCondition.trim()}` : "";
};
// on clause condition
const onAnd = (data) => {
if (isCheck(data)) return "";
let setItem = [];
for (const [key, value] of Object.entries(data)) {
if (setItem.length > 0) {
setItem.push(` AND ${key}=${value}`);
} else {
setItem.push(`${key}=${value}`);
}
}
return `${setItem.toString()}`;
};
const onOr = (data) => {
if (isCheck(data)) return "";
let setItem = [];
for (const [key, value] of Object.entries(data)) {
if (setItem.length > 0) {
setItem.push(` OR ${key}='${value}'`);
} else {
setItem.push(`${key}=${value}`);
}
}
return `${setItem.toString()}`;
};
const onIs = (data) => {
if (isCheck(data)) return "";
let setItem = [];
for (const [key, value] of Object.entries(data)) {
if (setItem.length > 0) {
setItem.push(` AND ${key} IS ${value}`);
} else {
setItem.push(`${key} IS ${value}`);
}
}
return `${setItem.toString()}`;
};
const onIn = (data) => {
if (isCheck(data)) return "";
let setItem = [];
for (const [key, value] of Object.entries(data)) {
if (setItem.length > 0) {
setItem.push(` AND ${key} IN (${value.toString()})`);
} else {
setItem.push(`${key} IN (${value.toString()})`);
}
}
return ` ${setItem.toString()}`;
};
const onNotIn = (data) => {
if (isCheck(data)) return "";
let setItem = [];
for (const [key, value] of Object.entries(data)) {
if (setItem.length > 0) {
setItem.push(` AND ${key} NOT IN (${value.toString()})`);
} else {
setItem.push(`${key} NOT IN (${value.toString()})`);
}
}
return `${setItem.toString()}`;
};
const onRaw = (data) => {
if (isCheck(data)) return "";
return `${data}`;
};
const onClause = (data) => {
let addCondition = "";
const on_not_in = onNotIn(data.onNotIn).replace(/,/g, "");
if (on_not_in != "") addCondition += on_not_in;
const on_in = onIn(data.onIn);
if (on_in != "" && on_not_in != "") {
addCondition += ` AND ${on_in}`;
} else if (on_in != "") {
addCondition += on_in;
}
const on_and = onAnd(data.on).replace(/,/g, "");
if (on_and != "" && (on_in != "" || on_not_in != "")) {
addCondition += ` AND ${on_and}`;
} else if (on_and != "") {
addCondition += on_and;
}
const on_or = onOr(data.onOr).replace(/,/g, "");
if (on_or != "" && (on_and != "" || on_in != "" || on_not_in != "")) {
addCondition += ` OR ${on_or}`;
} else if (on_or != "") {
addCondition += on_or;
}
const on_is = onIs(data.onIs).replace(/,/g, "");
if (
on_is != "" &&
(on_or != "" || on_and != "" || on_in != "" || on_not_in != "")
) {
addCondition += ` AND ${on_is}`;
} else if (on_is != "") {
addCondition += on_is;
}
const on_row = onRaw(data.onRaw);
if (
on_row != "" &&
(on_is != "" ||
on_or != "" ||
on_and != "" ||
on_in != "" ||
on_not_in != "")
) {
addCondition += ` AND ${on_row}`;
} else if (on_row != "") {
addCondition += on_row;
}
return addCondition != "" ? `ON ${addCondition.trim()}` : "";
};
//end on
const pagination = (data) => {
if (isCheck(data)) return "";
if (isCheck(data.pagination) || data.pagination == NaN) return "";
if (
isLimit(data) == "" ||
(isCheck(data.pagination) && isLimit(data) == 0)
)
return "";
return `OFFSET ${parseInt(data.pagination>=1 ? data.pagination-1:data.pagination) * parseInt(data.limit)}`;
};
const paginationData = (totalData, data, page = 0) => {
if (isCheck(totalData) && data.pagination < 0) return "";
let pageCountExce =
totalData > 0 ? totalData / data.limit : 0;
let totalPage =
isInt(pageCountExce) == 0
? pageCountExce
: pageCountExce - isInt(pageCountExce) + 1;
let currentPage = data.pagination>0?data.pagination:1;
let pagelenth = [];
for (let index = 1; index <= totalPage; index++) {
pagelenth.push(index);
}
let pageDataLimit=data.limit;
return {pageDataLimit, totalPage, totalData, currentPage, pagelenth };
};
const joinTable = (data) => {
if (data !== undefined && isCheck(data) && data.length <= 0) return "";
let str = " ";
for (const join of data) {
if (isTable(join.table)) return "";
if (
join.type != undefined &&
join.type != null &&
joinType(join.type) != ""
) {
str += ` ${joinType(join.type)} ${join.table} ${onClause(join)}`;
} else {
str += ` JOIN ${join.table} ${onClause(join)}`;
}
}
return str;
};
const withTable = (data) => {
if (data !== undefined && isCheck(data) && data.length <= 0) return "";
let str = " ";
for (const key in data) {
if (Object.hasOwnProperty.call(data, key)) {
const element = data[key];
for (const join of data[key]) {
if (isTable(join.table)) return "";
if (key != undefined && key != null && joinType(key) != "") {
str += ` ${joinType(key)} ${join.table} ${onClause(join)}`;
} else {
str += ` JOIN ${join.table} ${onClause(join)}`;
}
}
}
}
return str;
};
const withdata = (errThrow, resData, datas,dbcon=null) => {
return new Promise((r,e)=>{
try {
let db = dbcon ?? pool;
if(isCheck(datas)) return r(resData);
if (datas.with !== undefined && isCheck(datas.with) && datas.with.length <= 0)
return r(resData);
let totalKeyCount = 0;
for (const _ in datas.with) {
totalKeyCount++;
}
let keyIndex = 0;
for (const key in datas.with) {
let data = datas.with[key];
db.query(
`SELECT ${selectOption(data)} FROM ${data.table} ${whereClause(
data,
resData
)} ${isLatest(data)} ${isLimit(data)} ${pagination(data)}`,
async(err, res) => {
if (err) {
return errThrow(err);
}
if (data!= undefined && !isOne(data) && (!isCheck(data.pagination) || data.pagination >= 0)) {
db.query(
`SELECT count(*) as totalData FROM ${data.table} ${whereClause(
data,
resData
)} ${isLatest(data)}`,
async(err, resp) => {
if (err) {
return errThrow(err);
}
let paginate = paginationData(resp[0].totalData, data);
resData[key] = { res, paginate };
}
);
} else if(isOne(data)) {
if (isCheck(data.with)) {
resData[key] = res.length>0 ? res[0]:{};
} else {
console.log("ok");
resData[key] = res.length>0 ? await withdata(e, res[0], data,db):{};
}
}else{
if (isCheck(data.with)) {
resData[key] = res;
} else {
resData[key] = await withdata(e, res, data,db);
}
}
keyIndex++;
if (keyIndex === totalKeyCount) {
return r(resData);
}
}
);
}
if (keyIndex === totalKeyCount) {
return r(resData);
}
} catch (error) {
return e(error);
}
});
};
const withdataForGet = (errThrow, resData, datas,dbcon=null) => {
let db = dbcon ?? pool;
return new Promise((resolve, reject) => {
try {
if(isCheck(datas)) return resolve(resData);
if (datas.with !== undefined && isCheck(datas.with) && datas.with.length <= 0)
return resolve(resData);
let totalKeyCount = 0;
for (const _ in datas.with) {
totalKeyCount++;
}
let keyIndex = 0;
for (const key in datas.with) {
// console.log(key);
let data = datas.with[key];
db.query(
`SELECT ${selectOption(data)} FROM ${data.table} ${whereClause(
data,
resData
)} ${isLatest(data)} ${isLimit(data,isOne(data))} ${pagination(data)}`,
async(err, res) => {
if (err) {
return errThrow(err);
}
if (!isOne(data) && data!= undefined && (!isCheck(data.pagination) || data.pagination >= 0)) {
db.query(
`SELECT count(*) as totalData FROM ${data.table} ${whereClause(
data,
resData
)} ${isLatest(data)}`,
async (err, resp) => {
if (err) {
return errThrow(err);
}
let paginate = paginationData(resp[0].totalData, data);
resData[key] = { res, paginate };
}
);
} else if(isOne(data)) {
if(isCheck(data.with)){
// console.log("1",data.with);
resData[key] = res.length>0?res[0]:{};
}else{
// console.log("2",data.with);
resData[key] = res.length>0 ? await withdataForGet(errThrow, res[0], data,db):{};
}
}else{
if(isCheck(data.with)){
resData[key] = res;
}else{
resData[key] = await withdataForGet(errThrow, res, data,db);
}
}
keyIndex++;
if (keyIndex === totalKeyCount) {
return resolve(resData);
}
}
);
}
if (keyIndex === totalKeyCount) {
return resolve(resData);
}
} catch (error) {
return errThrow(error);
}
});
};
const connect = (conn, resdata) => {
if (isCheck(conn.connect) && isCheck(conn.hasOne) && isCheck(conn.belongsTo) && isCheck(conn.hasMany)) return "";
let str = "";
let tbcon = (conn.connect || conn.hasOne || conn.belongsTo || conn.hasMany);
for (const key in tbcon) {
let baseColunm = isCheck(resdata[key]) ? resdata[tbcon[key]] : resdata[key];
let colunm = isCheck(resdata[key]) ? key : tbcon[key];
if (str === "") {
str += `${colunm} = ${baseColunm} `;
} else {
str += `AND ${colunm} = ${baseColunm}`;
}
}
return str;
};
const joinType = (data) => {
let send = "";
if (data == "belongsTo" || data == "INNER JOIN" || data == "inner join") {
send = "INNER JOIN";
}
if (data == "hasOne" || data == "JOIN" || data == "join") {
send = "JOIN";
}
if (data == "belongsToMany" || data == "LEFT JOIN" || data == "left join") {
send = "LEFT JOIN";
}
if (data == "hasMany" || data == "RIGHT JOIN" || data == "right join") {
send = "RIGHT JOIN";
}
return send;
};
const addDeletedAt = (table, connection) => {
if (isTable(table)) return reject(isTable(table));
return new Promise((resolve, reject) => {
if (sqlConnect(connection)) {
return reject(sqlConnect(connection));
}
connection.query(
`SHOW COLUMNS FROM ${table} LIKE "deleted_at"`,
async (err, res) => {
if (err) {
return reject(err);
}
if (res.length > 0) return resolve(true);
try {
const colunm = await dbQuery(
`SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '${table}' ORDER BY ORDINAL_POSITION DESC LIMIT 1`,
connection
);
if (colunm.length) {
connection.query(
`ALTER TABLE ${table} ADD deleted_at TIMESTAMP NULL DEFAULT NULL AFTER ${colunm[0].COLUMN_NAME}`,
(err, res) => {
if (err) {
return reject(err);
}
return resolve(true);
}
);
} else {
return resolve(false);
}
} catch (error) {
return reject(error);
}
}
);
});
};
const sqlConnect = (pool) => {
try {
if(isCheck(pool) || isNotObject(pool)){
return "Hey! Please Check You Database Connection!";
}
} catch (error) {
return "Hey! Please Check You Database Connection!";
}
};
module.exports={
addDeletedAt,
sqlConnect,
joinType,
connect,
withdataForGet,
withdata,
withTable,joinTable,paginationData,pagination,onClause,onRaw,onNotIn,
onIn,onIs,onOr,onAnd,whereClause,onlyTrashed,whereRaw,whereNotIn,whereIn,whereIs,whereOr,whereAnd,
selectOption,getKeyValue,
}