crud-middleware-package
Version:
A dynamic CRUD middleware for Express.js that handles database operations
864 lines (753 loc) • 32.1 kB
JavaScript
// function objectToQueryAll(tableName, conditions) {
// // Get the keys from the conditions object
// const keys = Object.keys(conditions);
// // Build the WHERE clause by combining the conditions
// const whereClause = keys
// .map((key) => {
// const value = conditions[key];
// if (typeof value === "number") {
// return `${key} = ${value}`; // No quotes for numbers
// }
// return `${key} = '${value}'`; // Add quotes for strings
// })
// .join(" AND ");
// // Return the complete SQL query
// return `SELECT * FROM ${tableName} WHERE ${whereClause};`;
// }
function objectToQueryAll(tableName, conditions) {
const keys = Object.keys(conditions);
const values = [];
const whereClause = keys
.map((key) => {
values.push(conditions[key]); // Store values separately to maintain types
return `${key} = ?`; // Use placeholders to prevent SQL injection
})
.join(" AND ");
return {
query: `SELECT * FROM ${tableName} WHERE ${whereClause};`,
values
};
}
// function SqlQueryUpdate(req) {
// const { CompulsoryKeys, TempKeys, filterValues, Table_Name } = req.body;
// // Error handling for missing keys
// if (!filterValues) {
// throw new Error("filterValues is not provided in the request.");
// }
// if (!Table_Name) {
// throw new Error("Table_Name is not provided in the request.");
// }
// const setClauses = filterValues;
// const ks = Object.keys(setClauses);
// const setClause = ks.map((k) => {
// const value = setClauses[k];
// if (typeof value === "number") {
// return `${k} = ${value}`; // No quotes for numbers
// }
// return `${k} = '${value}'`; // Add quotes for strings
// }).join(",");
// if (!CompulsoryKeys && !TempKeys) {
// return `UPDATE ${Table_Name} SET ${setClause}`;
// } else if (!CompulsoryKeys && TempKeys) {
// // Handle TempKeys only
// const Tkeys = Object.keys(TempKeys);
// const Tcond = Tkeys.map((Tkey) => {
// const value = TempKeys[Tkey];
// if (Array.isArray(value)) {
// return `(${value.map((subVal) => {
// return typeof subVal === "number" ? `${Tkey} = ${subVal}` : `${Tkey} = '${subVal}'`;
// }).join(" OR ")})`;
// }
// // Handle comparison operators
// if (typeof value === 'string' && value.match(/^[><=]+[\d.]+$/)) {
// // If value contains a comparison operator (>, <, >=, <=, etc.)
// return `${Tkey} ${value}`;
// }
// return typeof value === "number" ? `${Tkey} = ${value}` : `${Tkey} = '${value}'`;
// }).join(" OR ");
// return `UPDATE ${Table_Name} SET ${setClause} WHERE (${Tcond});`;
// } else if (CompulsoryKeys && !TempKeys) {
// // Handle CompulsoryKeys only
// const Ckeys = Object.keys(CompulsoryKeys);
// const Ccond = Ckeys.map((Ckey) => {
// const value = CompulsoryKeys[Ckey];
// if (Array.isArray(value)) {
// return `(${value.map((subVal) => {
// return typeof subVal === "number" ? `${Ckey} = ${subVal}` : `${Ckey} = '${subVal}'`;
// }).join(" OR ")})`;
// }
// // Handle comparison operators
// if (typeof value === 'string' && value.match(/^[><=]+[\d.]+$/)) {
// return `${Ckey} ${value}`;
// }
// return typeof value === "number" ? `${Ckey} = ${value}` : `${Ckey} = '${value}'`;
// }).join(" AND ");
// return `UPDATE ${Table_Name} SET ${setClause} WHERE (${Ccond});`;
// } else {
// // Handle both CompulsoryKeys and TempKeys
// const Ckeys = Object.keys(CompulsoryKeys);
// const Tkeys = Object.keys(TempKeys);
// const Ccond = Ckeys.map((Ckey) => {
// const value = CompulsoryKeys[Ckey];
// if (Array.isArray(value)) {
// return `(${value.map((subVal) => {
// return typeof subVal === "number" ? `${Ckey} = ${subVal}` : `${Ckey} = '${subVal}'`;
// }).join(" OR ")})`;
// }
// // Handle comparison operators
// if (typeof value === 'string' && value.match(/^[><=]+[\d.]+$/)) {
// return `${Ckey} ${value}`;
// }
// return typeof value === "number" ? `${Ckey} = ${value}` : `${Ckey} = '${value}'`;
// }).join(" AND ");
// const Tcond = Tkeys.map((Tkey) => {
// const value = TempKeys[Tkey];
// if (Array.isArray(value)) {
// return `(${value.map((subVal) => {
// return typeof subVal === "number" ? `${Tkey} = ${subVal}` : `${Tkey} = '${subVal}'`;
// }).join(" OR ")})`;
// }
// // Handle comparison operators
// if (typeof value === 'string' && value.match(/^[><=]+[\d.]+$/)) {
// return `${Tkey} ${value}`;
// }
// return typeof value === "number" ? `${Tkey} = ${value}` : `${Tkey} = '${value}'`;
// }).join(" OR ");
// return `UPDATE ${Table_Name} SET ${setClause} WHERE (${Ccond}) AND (${Tcond});`;
// }
// }
function processCondition(keyObj, joinType = "AND", values = []) {
return Object.keys(keyObj)
.map((key) => {
const value = keyObj[key];
// Handle IS NULL and IS NOT NULL
if (typeof value === "string" && value.toUpperCase() === "IS NULL") {
return `${key} IS NULL`;
}
if (typeof value === "string" && value.toUpperCase() === "IS NOT NULL") {
return `${key} IS NOT NULL`;
}
// Handle arrays with IN clause
if (Array.isArray(value)) {
values.push(...value);
const placeholders = value.map(() => "?").join(", ");
return `${key} IN (${placeholders})`;
}
// Handle comparison operators (>, <, >=, <=, !=)
if (typeof value === "string" && /^[><=!]+[\d.]+$/.test(value)) {
const match = value.match(/^([><=!]+)\s*(\d+(\.\d+)?)/);
if (match) {
const operator = match[1];
const numVal = parseFloat(match[2]);
values.push(numVal);
return `${key} ${operator} ?`;
}
}
// Default equality condition
values.push(value);
return `${key} = ?`;
})
.join(` ${joinType} `);
}
function SqlQueryUpdate(req) {
const { CompulsoryKeys, TempKeys, filterValues, Table_Name } = req.body;
if (!filterValues) throw new Error("filterValues is not provided.");
if (!Table_Name) throw new Error("Table_Name is not provided.");
const values = [];
// Build SET clause
const setClause = Object.keys(filterValues)
.map((key) => {
values.push(filterValues[key]);
return `${key} = ?`;
})
.join(", ");
// No WHERE clause — unsafe, but allowed
if (!CompulsoryKeys && !TempKeys) {
return {
query: `UPDATE ${Table_Name} SET ${setClause};`,
values
};
}
let whereParts = [];
if (CompulsoryKeys && Object.keys(CompulsoryKeys).length > 0) {
const cClause = processCondition(CompulsoryKeys, "AND", values);
whereParts.push(`(${cClause})`);
}
if (TempKeys && Object.keys(TempKeys).length > 0) {
const tClause = processCondition(TempKeys, "OR", values);
whereParts.push(`(${tClause})`);
}
const whereClause = whereParts.length ? ` WHERE ${whereParts.join(" AND ")}` : "";
return {
query: `UPDATE ${Table_Name} SET ${setClause}${whereClause};`,
values
};
}
function objectToQuery(tableName, conditions, count) {
// Get the keys from the conditions object
const keys = Object.keys(conditions);
// Build the WHERE clause by combining the conditions
const whereClause = keys
.map((key) => {
const value = conditions[key];
if (typeof value === "number") {
return `${key} = ${value}`; // No quotes for numbers
}
return `${key} = '${value}'`; // Add quotes for strings
})
.join(" AND ");
// Return the complete SQL query
return `SELECT * FROM ${tableName} WHERE ${whereClause} LIMIT ${count};`;
}
const MongoQueryDa = (CompulsoryKeys, TempKeys) => {
let Ccond = [];
let Tcond = [];
// Function to handle comparison operators in values
const handleComparisonOperators = (key, value) => {
if (typeof value === 'string' && /^[><=]+\s*\d+(\.\d+)?$/.test(value)) {
// Extract operator and numeric value correctly
const match = value.match(/^([><=]+)\s*(\d+(\.\d+)?)$/);
if (match) {
const operator = match[1]; // Extract operator (>, <, >=, <=)
const numValue = parseFloat(match[2]); // Convert value to a number
switch (operator) {
case '>':
return { [key]: { $gt: numValue } };
case '<':
return { [key]: { $lt: numValue } };
case '>=':
return { [key]: { $gte: numValue } };
case '<=':
return { [key]: { $lte: numValue } };
default:
return { [key]: numValue }; // Default case (direct match)
}
}
}
return { [key]: value }; // Return as-is if not a comparison string
};
// Process CompulsoryKeys
if (CompulsoryKeys && Object.keys(CompulsoryKeys).length > 0) {
Ccond = Object.keys(CompulsoryKeys).map((Ckey) => {
const value = CompulsoryKeys[Ckey];
return Array.isArray(value)
? { [Ckey]: { $in: value } }
: handleComparisonOperators(Ckey, value);
});
}
// Process TempKeys
if (TempKeys && Object.keys(TempKeys).length > 0) {
Tcond = Object.keys(TempKeys).map((Tkey) => {
const value = TempKeys[Tkey];
return Array.isArray(value)
? { [Tkey]: { $in: value } }
: handleComparisonOperators(Tkey, value);
});
}
// Construct final MongoDB query
if (Ccond.length > 0 && Tcond.length > 0) {
return { $and: [{ $and: Ccond }, { $or: Tcond }] };
} else if (Ccond.length > 0) {
return { $and: Ccond };
} else if (Tcond.length > 0) {
return { $or: Tcond };
} else {
return {}; // Empty condition
}
};
function SqlQueryDa(CompulsoryKeys, TempKeys, TableName) {
// Helper function to handle comparison operators
const handleComparisonOperators = (key, value) => {
if (typeof value === 'string' && value.match(/^[><=]+ *[\d.]+$/)) {
const operator = value.trim().split(' ')[0]; // ">", "<", etc.
const numValue = parseFloat(value.trim().split(' ')[1]); // Get the numeric part
switch (operator) {
case '>':
return `${key} > ${numValue}`;
case '<':
return `${key} < ${numValue}`;
case '>=':
return `${key} >= ${numValue}`;
case '<=':
return `${key} <= ${numValue}`;
default:
return `${key} = '${value}'`; // If no valid operator, return as is
}
}
return `${key} = '${value}'`; // Default case for equality
};
// Case when neither CompulsoryKeys nor TempKeys are provided
if (!CompulsoryKeys && !TempKeys) {
return `DELETE FROM ${TableName};`;
}
// Case when only TempKeys are provided
else if (!CompulsoryKeys && TempKeys) {
const Tkeys = Object.keys(TempKeys);
const Tcond = Tkeys.map((Tkey) => {
const value = TempKeys[Tkey];
if (Array.isArray(value)) {
// Handle arrays in TempKeys
return `(${value
.map((subVal) => handleComparisonOperators(Tkey, subVal))
.join(" OR ")})`; // Wrap in parentheses
} else {
return handleComparisonOperators(Tkey, value); // Handle single values
}
}).join(" OR ");
return `DELETE FROM ${TableName} WHERE (${Tcond});`;
}
// Case when only CompulsoryKeys are provided
else if (CompulsoryKeys && !TempKeys) {
const Ckeys = Object.keys(CompulsoryKeys);
const Ccond = Ckeys.map((Ckey) => {
const value = CompulsoryKeys[Ckey];
if (Array.isArray(value)) {
return `(${value
.map((subVal) => handleComparisonOperators(Ckey, subVal))
.join(" OR ")})`; // Wrap in parentheses
} else {
return handleComparisonOperators(Ckey, value); // Handle single values
}
}).join(" AND ");
return `DELETE FROM ${TableName} WHERE (${Ccond});`;
}
// Case when both CompulsoryKeys and TempKeys are provided
else {
const Ckeys = Object.keys(CompulsoryKeys);
const Tkeys = Object.keys(TempKeys);
// Generate conditions for compulsory keys
const Ccond = Ckeys.map((Ckey) => {
const value = CompulsoryKeys[Ckey];
if (Array.isArray(value)) {
return `(${value
.map((subVal) => handleComparisonOperators(Ckey, subVal))
.join(" OR ")})`; // Wrap in parentheses
} else {
return handleComparisonOperators(Ckey, value); // Handle single values
}
}).join(" AND ");
// Generate conditions for temporary keys
const Tcond = Tkeys.map((Tkey) => {
const value = TempKeys[Tkey];
if (Array.isArray(value)) {
return `(${value
.map((subVal) => handleComparisonOperators(Tkey, subVal))
.join(" OR ")})`; // Wrap in parentheses
} else {
return handleComparisonOperators(Tkey, value); // Handle single values
}
}).join(" OR ");
return `DELETE FROM ${TableName} WHERE (${Ccond}) AND (${Tcond});`;
}
}
function SqlQuerySa(CompulsoryKeys, TempKeys, TableName) {
// const processConditions = (keys, values, joiner) => {
// return keys.map((key) => {
// const value = values[key];
// if (Array.isArray(value)) {
// return `(${value.map((subVal) => processCondition(key, subVal)).join(` OR `)})`;
// } else {
// return processCondition(key, value);
// }
// }).join(` ${joiner} `);
// };
// const processCondition = (key, value) => {
// if (typeof value === "string" && /^[<>]=?\s*\d+/.test(value)) {
// return `${key} ${value}`;
// } else if (typeof value === "number") {
// return `${key} = ${value}`;
// }
// return `${key} = '${value}'`;
// };
// if (!CompulsoryKeys && !TempKeys) {
// return `SELECT * FROM ${TableName};`;
// } else if (!CompulsoryKeys && TempKeys) {
// return `SELECT * FROM ${TableName} WHERE (${processConditions(Object.keys(TempKeys), TempKeys, "OR")});`;
// } else if (CompulsoryKeys && !TempKeys) {
// return `SELECT * FROM ${TableName} WHERE (${processConditions(Object.keys(CompulsoryKeys), CompulsoryKeys, "AND")});`;
// } else {
// return `SELECT * FROM ${TableName} WHERE (${processConditions(Object.keys(CompulsoryKeys), CompulsoryKeys, "AND")}) AND (${processConditions(Object.keys(TempKeys), TempKeys, "OR")});`;
// }
const params = [];
let paramIndex = 1;
const processConditions = (keys, values, joiner) => {
return keys.map((key) => {
const value = values[key];
if (Array.isArray(value)) {
return `(${value.map((subVal) => processCondition(key, subVal)).join(" OR ")})`;
} else {
return processCondition(key, value);
}
}).join(` ${joiner} `);
};
const processCondition = (key, value) => {
if (typeof value === "string" && /^[<>]=?\s*\d+$/.test(value)) {
// safe numeric comparison like "<= 10"
return `${key} ${value}`;
} else {
params.push(value);
return `${key} = $${paramIndex++}`;
}
};
let query = `SELECT * FROM ${TableName}`;
if (CompulsoryKeys || TempKeys) {
query += " WHERE ";
const clauses = [];
if (CompulsoryKeys) {
clauses.push(`(${processConditions(Object.keys(CompulsoryKeys), CompulsoryKeys, "AND")})`);
}
if (TempKeys) {
clauses.push(`(${processConditions(Object.keys(TempKeys), TempKeys, "OR")})`);
}
query += clauses.join(" AND ");
} else {
query += ";";
}
return { query, values: params };
}
function SqlQuerySs(CompulsoryKeys, TempKeys, TableName, count) {
// if (!CompulsoryKeys && !TempKeys) {
// return `SELECT * FROM ${TableName} LIMIT ${count};`;
// } else if (!CompulsoryKeys && TempKeys) {
// const Tkeys = Object.keys(TempKeys);
// const Tcond = Tkeys.map((Tkey) => {
// const value = TempKeys[Tkey];
// if (Array.isArray(value)) {
// return `(${value.map((subVal) => {
// if (typeof subVal === "number" || subVal.startsWith(">") || subVal.startsWith("<")) {
// return `${Tkey} ${subVal.startsWith(">") || subVal.startsWith("<") ? subVal : "= " + subVal}`;
// }
// return `${Tkey} = '${subVal}'`;
// }).join(" OR ")})`;
// } else {
// if (typeof value === "number" || value.startsWith(">") || value.startsWith("<")) {
// return `${Tkey} ${value.startsWith(">") || value.startsWith("<") ? value : "= " + value}`;
// }
// return `${Tkey} = '${value}'`;
// }
// }).join(" OR ");
// return `SELECT * FROM ${TableName} WHERE (${Tcond}) LIMIT ${count};`;
// } else if (CompulsoryKeys && !TempKeys) {
// const Ckeys = Object.keys(CompulsoryKeys);
// const Ccond = Ckeys.map((Ckey) => {
// const value = CompulsoryKeys[Ckey];
// if (Array.isArray(value)) {
// return `(${value.map((subVal) => {
// if (typeof subVal === "number" || subVal.startsWith(">") || subVal.startsWith("<")) {
// return `${Ckey} ${subVal.startsWith(">") || subVal.startsWith("<") ? subVal : "= " + subVal}`;
// }
// return `${Ckey} = '${subVal}'`;
// }).join(" OR ")})`;
// } else {
// if (typeof value === "number" || value.startsWith(">") || value.startsWith("<")) {
// return `${Ckey} ${value.startsWith(">") || value.startsWith("<") ? value : "= " + value}`;
// }
// return `${Ckey} = '${value}'`;
// }
// }).join(" AND ");
// return `SELECT * FROM ${TableName} WHERE (${Ccond}) LIMIT ${count};`;
// } else {
// const Ckeys = Object.keys(CompulsoryKeys);
// const Tkeys = Object.keys(TempKeys);
// const Ccond = Ckeys.map((Ckey) => {
// const value = CompulsoryKeys[Ckey];
// if (Array.isArray(value)) {
// return `(${value.map((subVal) => {
// if (typeof subVal === "number" || subVal.startsWith(">") || subVal.startsWith("<")) {
// return `${Ckey} ${subVal.startsWith(">") || subVal.startsWith("<") ? subVal : "= " + subVal}`;
// }
// return `${Ckey} = '${subVal}'`;
// }).join(" OR ")})`;
// } else {
// if (typeof value === "number" || value.startsWith(">") || value.startsWith("<")) {
// return `${Ckey} ${value.startsWith(">") || value.startsWith("<") ? value : "= " + value}`;
// }
// return `${Ckey} = '${value}'`;
// }
// }).join(" AND ");
// const Tcond = Tkeys.map((Tkey) => {
// const value = TempKeys[Tkey];
// if (Array.isArray(value)) {
// return `(${value.map((subVal) => {
// if (typeof subVal === "number" || subVal.startsWith(">") || subVal.startsWith("<")) {
// return `${Tkey} ${subVal.startsWith(">") || subVal.startsWith("<") ? subVal : "= " + subVal}`;
// }
// return `${Tkey} = '${subVal}'`;
// }).join(" OR ")})`;
// } else {
// if (typeof value === "number" || value.startsWith(">") || value.startsWith("<")) {
// return `${Tkey} ${value.startsWith(">") || value.startsWith("<") ? value : "= " + value}`;
// }
// return `${Tkey} = '${value}'`;
// }
// }).join(" OR ");
// return `SELECT * FROM ${TableName} WHERE (${Ccond}) AND (${Tcond}) LIMIT ${count};`;
// }
const params = [];
let paramIndex = 1;
const processConditions = (keys, values, joiner) => {
return keys.map((key) => {
const value = values[key];
if (Array.isArray(value)) {
return `(${value.map((subVal) => processCondition(key, subVal)).join(" OR ")})`;
} else {
return processCondition(key, value);
}
}).join(` ${joiner} `);
};
const processCondition = (key, value) => {
if (typeof value === "string" && /^[<>]=?\s*\d+$/.test(value)) {
// safe numeric comparison like "<= 10"
return `${key} ${value}`;
} else {
params.push(value);
return `${key} = $${paramIndex++}`;
}
};
let query = `SELECT * FROM ${TableName}`;
if (CompulsoryKeys || TempKeys) {
query += " WHERE ";
const clauses = [];
if (CompulsoryKeys) {
clauses.push(`(${processConditions(Object.keys(CompulsoryKeys), CompulsoryKeys, "AND")})`);
}
if (TempKeys) {
clauses.push(`(${processConditions(Object.keys(TempKeys), TempKeys, "OR")})`);
}
query += clauses.join(" AND ");
} else {
query += ";";
}
query+=`LIMIT=${count}`;
return { query, values: params };
}
function SqlQueryDa0(CompulsoryKeys, TempKeys, TableName, count) {
// Helper function to handle comparison operators
const handleComparisonOperators = (key, value) => {
if (typeof value === 'string' && value.match(/^[<>!=]+[\s]*[\d.]+$/)) {
const operator = value.trim().split(' ')[0]; // Extract operator ("<", ">", etc.)
const numValue = value.trim().split(' ')[1]; // Get the numeric part
return `${key} ${operator} ${numValue}`; // Build condition like "salary < 5000"
}
return `${key} = '${value}'`; // Default equality check for non-operator values
};
// Helper function to build conditions from keys and values
const buildCondition = (keys, conditionType) => {
return keys
.map((key) => {
const value = conditionType[key];
if (Array.isArray(value)) {
// Handle array conditions
return `(${value
.map((subVal) => handleComparisonOperators(key, subVal))
.join(" OR ")})`; // Wrap in parentheses
} else {
return handleComparisonOperators(key, value); // Handle single values
}
})
.join(conditionType === CompulsoryKeys ? " AND " : " OR ");
};
switch (true) {
case (!CompulsoryKeys && !TempKeys):
return `DELETE FROM ${TableName} LIMIT ${count};`;
case (!CompulsoryKeys && TempKeys):
const Tkeys = Object.keys(TempKeys);
const Tcond = buildCondition(Tkeys, TempKeys);
return `DELETE FROM ${TableName} WHERE (${Tcond}) LIMIT ${count};`;
case (CompulsoryKeys && !TempKeys):
const Ckeys = Object.keys(CompulsoryKeys);
const Ccond = buildCondition(Ckeys, CompulsoryKeys);
return `DELETE FROM ${TableName} WHERE (${Ccond}) LIMIT ${count};`;
default:
const CkeysDefault = Object.keys(CompulsoryKeys);
const TkeysDefault = Object.keys(TempKeys);
const CcondDefault = buildCondition(CkeysDefault, CompulsoryKeys);
const TcondDefault = buildCondition(TkeysDefault, TempKeys);
return `DELETE FROM ${TableName} WHERE (${CcondDefault}) AND (${TcondDefault}) LIMIT ${count};`;
}
}
// function SqlQuerySa0(CompulsoryKeys, TempKeys, TableName, count) {
// const Ckeys = Object.keys(CompulsoryKeys);
// const Tkeys = Object.keys(TempKeys);
// // Generate conditions for compulsory keys
// const Ccond = Ckeys.map((Ckey) => {
// const value = CompulsoryKeys[Ckey];
// if (Array.isArray(value)) {
// // Handle arrays in CompulsoryKeys
// return `(${value
// .map((subVal) => {
// if (typeof subVal === "number") {
// return `${Ckey} = ${subVal}`; // No quotes for numbers
// }
// return `${Ckey} = '${subVal}'`; // Add quotes for strings
// })
// .join(" OR ")})`; // Wrap in parentheses
// } else {
// // Handle single values in CompulsoryKeys
// if (typeof value === "number") {
// return `${Ckey} = ${value}`; // No quotes for numbers
// }
// return `${Ckey} = '${value}'`; // Add quotes for strings
// }
// }).join(" AND ");
// // Generate conditions for temporary keys
// const Tcond = Tkeys.map((Tkey) => {
// const value = TempKeys[Tkey];
// if (Array.isArray(value)) {
// // Handle arrays in TempKeys
// return `(${value
// .map((subVal) => {
// if (typeof subVal === "number") {
// return `${Tkey} = ${subVal}`; // No quotes for numbers
// }
// return `${Tkey} = '${subVal}'`; // Add quotes for strings
// })
// .join(" OR ")})`; // Wrap in parentheses
// } else {
// // Handle single values in TempKeys
// if (typeof value === "number") {
// return `${Tkey} = ${value}`; // No quotes for numbers
// }
// return `${Tkey} = '${value}'`; // Add quotes for strings
// }
// }).join(" OR ");
// return `SELECT FROM ${TableName} WHERE (${Ccond}) AND (${Tcond}) LIMIT ${count};`;
// }
function SqlQuerySa0(CompulsoryKeys, TempKeys, TableName, count) {
const Ckeys = Object.keys(CompulsoryKeys);
const Tkeys = Object.keys(TempKeys);
const values = [];
// Generate conditions for compulsory keys with placeholders
const Ccond = Ckeys
.map((Ckey) => {
const value = CompulsoryKeys[Ckey];
if (Array.isArray(value)) {
return `(${value.map(() => `${Ckey} = ?`).join(" OR ")})`;
} else {
return `${Ckey} = ?`;
}
})
.join(" AND ");
// Generate conditions for temporary keys with placeholders
const Tcond = Tkeys
.map((Tkey) => {
const value = TempKeys[Tkey];
if (Array.isArray(value)) {
return `(${value.map(() => `${Tkey} = ?`).join(" OR ")})`;
} else {
return `${Tkey} = ?`;
}
})
.join(" OR ");
// Collect values in the correct order
Ckeys.forEach((key) => {
const value = CompulsoryKeys[key];
values.push(...(Array.isArray(value) ? value : [value]));
});
Tkeys.forEach((key) => {
const value = TempKeys[key];
values.push(...(Array.isArray(value) ? value : [value]));
});
// Return the final safe query and values
return {
query: `SELECT * FROM ${TableName} WHERE (${Ccond}) AND (${Tcond}) LIMIT ?;`,
values: [...values, count] // Include count as a parameter
};
}
function objectToQueryC(tableName, conditions) {
const keys = Object.keys(data);
const placeholders = keys.map((_, i) => `$${i + 1}`);
const values = keys.map((k) => data[k]);
const query = `INSERT INTO ${tableName} (${keys.join(", ")}) VALUES (${placeholders.join(", ")});`;
return { query, values };
}
function objectToQueryD(tableName, conditions) {
// Get the keys from the conditions object
const keys = Object.keys(conditions);
// Build the WHERE clause by combining the conditions
const keysGroup = keys.map((key) => `${key}`).join(",");
const valueGroups = keys.map((key) => `${conditions[key]}`).join(",");
// Return the complete SQL query
return `INSERT INTO ${tableName} (${keysGroup}) VALUES (${valueGroups});`;
}
const crudMiddleware = async (req, res, next) => {
const requestType = req.method;
const modelInstance = req.body.model;
// const filterFields = req.body.filterField;
const filterValues = req.body.filterValues;
try {
if (["POST", "PUT"].includes(requestType)) {
if (!requestType || !modelInstance) {
return res.status(400).json({ error: "Missing required parameters" });
}
}
if (requestType === "GET") {
if (req.body.DatabaseName === "mongo") {
const query = MongoQueryDa(req.body.CompulsoryKeys, req.body.TempKeys);
const data = req.body.getNumberOfResults === "all"
? await modelInstance.find(query)
: await modelInstance.find(query).limit(req.body.getNumberOfResults);
return data.length > 0 ? res.status(200).json(data):res.status(404).json({ message: "No data found" });
} else if (req.body.DatabaseName === "mysql") {
const pool = req.body.model; // Assume `pool` is a promise-based MySQL client
const CompulsoryKeys = req.body.CompulsoryKeys;
const TempKeys = req.body.TempKeys;
const query = req.body.getNumberOfResults === "all"
? SqlQuerySa(CompulsoryKeys, TempKeys, req.body.Table_Name)
: SqlQuerySs(CompulsoryKeys, TempKeys, req.body.Table_Name , req.body.getNumberOfResults);
const [results] = await pool.query(query);
return results.length > 0
? res.json(results)
: res.status(404).json({ message: "No data found" });
}
} else if (requestType === "POST") {
if (req.body.DatabaseName === "mongo") {
const newItem = new modelInstance(filterValues);
await newItem.save();
return res.status(201).json(newItem);
} else if (req.body.DatabaseName === "mysql") {
const pool = req.body.model;
const query = objectToQueryC(req.body.Table_Name, filterValues);
const [results] = await pool.query(query);
return res.status(201).json(results);
}
} else if (requestType === "PUT") {
if (req.body.DatabaseName === "mongo") {
const query = MongoQueryDa(req.body.CompulsoryKeys, req.body.TempKeys);
const updatedItem = await modelInstance.updateMany(query, filterValues, { new: true });
if (!updatedItem) {
return res.status(404).json({ error: "No record found to update" });
}
return res.status(200).json(updatedItem);
} else if (req.body.DatabaseName === "mysql") {
const pool = req.body.model;
const { query, values } = SqlQueryUpdate(req);
const [results] = await pool.query(query, values);
return res.status(200).json(results);
}
} else if (requestType === "DELETE") {
const CompulsoryKeys = req.body.CompulsoryKeys;
const TempKeys = req.body.TempKeys;
if (req.body.DatabaseName === "mongo") {
const query = MongoQueryDa(CompulsoryKeys, TempKeys);
const deletedItem = req.body.deleteType === "one"
? await modelInstance.findOneAndDelete(query)
: await modelInstance.deleteMany(query);
return res.status(200).json(deletedItem);
} else if (req.body.DatabaseName === "mysql") {
const pool = req.body.model;
const query = req.body.getNumberOfResults === "all"
? SqlQueryDa(CompulsoryKeys, TempKeys, req.body.Table_Name)
: SqlQueryDa0(CompulsoryKeys, TempKeys, req.body.Table_Name, req.body.getNumberOfResults);
const [results] = await pool.query(query);
return res.status(200).json(results);
}
} else {
return res.status(400).json({ error: "Invalid request type" });
}
} catch (err) {
console.error("Server error:", err);
return res.status(500).json({ error: "Server error", message: err.message });
}
};
module.exports = crudMiddleware;