@A0533057932 כתב בבירור | nodejs תקינות פונקציה:
איך זה נראה בקוד (הוכחה שזה אפשרי ונקי)
תראה כמה זה קריא וקל לתחזוקה כשמפרידים:
ה-Repository (מטפל רק ב-SQL, בלי לוגיקה)
פונקציה גנרית שיודעת לקבל אובייקט ולדחוף ל-DB. כתבת אותה פעם אחת, והיא עובדת לכל הטבלאות.
// dbUtils.js
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);
}
2. ה-Service (הפונקציה הראשית שלך - מתוקנת)
עכשיו הפונקציה שלך מתעסקת רק במה ולא באיך.
// adService.js
import { validateAdInput } from './validators'; // קובץ נפרד לבדיקות
import { insertRecord } from './dbUtils';
export async function addAd(params) {
// 1. ולידציה - זורק שגיאה אם משהו לא תקין
// הפונקציה הזו מכילה את כל ה-checkType, checkPhone שלך
const cleanData = validateAdInput(params);
// 2. הכנת המידע (לוגיקה עסקית)
// בניית האובייקט בצורה נקייה
const adToInsert = {
type: cleanData.type,
profession: cleanData.profession,
phone: cleanData.phone,
recording_path: cleanData.path
};
// לוגיקה עסקית: טיפול במחיר לפי סוג
if (cleanData.type === 'מחפש') {
adToInsert.max_payment = cleanData.price;
adToInsert.ring_mode = cleanData.ringMode; // הולדיציה כבר וידאה שזה קיים
} else {
adToInsert.min_payment = cleanData.price;
// למפרסם אין ring_mode, אז פשוט לא מכניסים אותו לאובייקט
}
// 3. עבודה מול ה-DB (תשתית)
const connection = await pool.getConnection();
try {
await connection.beginTransaction();
// הכנסת המודעה - שים לב כמה זה נקי! בלי פסיקים ובלי שרשורים
const [result] = await insertRecord(connection, 'ads', adToInsert);
const adId = result.insertId;
// טיפול בערים (לוגיקה עסקית נוספת)
if (cleanData.cities && cleanData.cities.length > 0) {
// כאן תהיה קריאה לפונקציית עזר להכנסת ערים (Bulk Insert)
await insertCities(connection, adId, cleanData.cities);
}
await connection.commit();
return { success: true, id: adId };
} catch (e) {
await connection.rollback();
throw e;
} finally {
connection.release();
}
}
הAI מתעלם מזה שיש פרמטרים אופציונליים, הרי אם יש פרמטרים אופציונליים אני חייב לעבור לראות אם הם שם, זה כבר די מחזיר אותנו לקוד שלי...
נכון, הוא הוציא פונקציה גנרית להוספה למסד נתונים, וככל הנראה עוד פונקציה שתעבור בעצמה על כל הפרמטרים ותעשה להם ולידציה (אותה הוא לא כתב) אבל חוץ ממנה הוא השאיר הכל אותו הדבר. כולל המון שאילתות למסד נתונים.