@A0533057932 טוב, עשיתי שינויים לפי ההמלצות שלכם כאן (השתדלתי לא לקחת את הקוד המוכן של הAI חוץ מבניית השאילתא), יצא לי משהו מסובך...
מערך פרמטרים ופונקציות אימות
const validetFunctions = {
phone: isValidIsraeliPhone,
type: checkType,
profession: checkProfession,
min_max_price: checkNumber,
ringMode: checkRingMode,
area: checkArea,
city: checkCity
};
פונקציה מאמתת
function validateAdParams(params) {
let cleanParams = [];
params.forEach(key => {
const validateFunc = validetFunctions[key];
if (validateFunc) {
if (validateFunc(params[key]))
{
cleanParams.push(params[key]);
}
else { return { status: "error", message: `Invalid value for ${key}` }; }
} else {
return { status: "error", message: ``Unknown parameter: ${key}` };
}
});
return { status: "success", data: cleanParams };
}
פונקציה שמכניסה למסד נתונים
async function insertRecord(connection, tableName, dataObject) {
const columns = Object.keys(dataObject);
const values = Object.values(dataObject);
const placeholders = columns.map(() => '?').join(', ');
// בונה SQL באופן דינמי - אין יותר שרשור מחרוזות ידני עם פסיקים!
const sql = `INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders})`;
return connection.execute(sql, values);
}
הפונקציה שמטפלת בהכל
export async function addAdNEw(params) {
// בדיקת הפרמטרים והכנת אובייקט נקי להוספה למסד הנתונים
const validateResult = validateAdParams(params);
if (validateResult.status === "error") {
return validateResult;
}
// הכנת אובייקט להוספה למסד הנתונים
let adToAdd = {
phone: validateResult.data.phone,
type: validateResult.data.type,
profession: validateResult.data.profession,
}
if (validateResult.data.min_max_price) {adToAdd.min_max_price = validateResult.data.min_max_price;}
if (validateResult.data.type === "מחפש" && validateResult.data.ringMode) {adToAdd.ringMode = validateResult.data.ringMode;}
// הכנת רשימת הערים להכנסה
let citiesToInsert = [];
// אזור - לא חובה, אבל אם קיים חייב להיות תקין
if (validateResult.data.area) {
if (checkArea(validateResult.data.area)) {
citiesToInsert.push(validateResult.data.area);
}
else { return { status: "error", message: "Invalid area" }; }
}
// עיר - לא חובה, אבל אם קיים חייב להיות תקין
else if (validateResult.data.city) {
if (Array.isArray(validateResult.data.city)) {
for (const city of validateResult.data.city) {
if (checkCity(city)) {
citiesToInsert.push(city);
}
else { return { status: "error", message: `Invalid city: ${city}` }; }
}
}
// אם לא נבחר אזור ולא עיר, נכניס "all" כדי לסמן שהמודעה תקפה לכל הערים
} else { citiesToInsert.push("all"); }
// הוספת המודעה למסד הנתונים
let connection;
try {
connection = await pool.getConnection(); // לוקחים חיבור מהמאגר
await connection.beginTransaction();
const [result] = await insertRecord(connection, 'ads', adToAdd);
const adId = result.insertId;
citiesToInsert = citiesToInsert.map(city => [adId, city]);
await insertRecord(connection, 'ad_cities', citiesToInsert);
await connection.commit();
return { status: "success", message: "Ad added successfully", adId: adId };
} catch (error) {
if (connection) {
console.log("Error adding ad:", error);
await connection.rollback();
throw error;
}}
finally {
if (connection) {
connection.release();
}
}
}
אבל עכשיו מסתבכים עם הוספת הערים לטבלת הערים, כי בשביל למנוע יצירת כמה שאילתות השתמשתי ב insert עם מערך שמכניס הכל בבת אחת, והפונקציה הגנארית insertRecord לא מתאימה לזה. צריך לעשות עוד פונקציה בשביל זה?