דלגו לתוכן

או התחילו מנקודה בטוחה: אינדקס הכלים המלא · מפת הטבלאות המרכזיות

מערכת חדשה — 14 יום חינם

פונקציות צד שרת

עודכן 31.08.2026
POST https://api.mbapps.co.il/functions/{appId}/{functionName}
הכיוון מי מפעיל איך
מהחוץ פנימה דף נחיתה, מערכת חיצונית, שרת ביניים POST /functions/{appId}/{fn}
מבפנים טריגר על שינוי נתונים פעולה מסוג server-side-code עם functionName

בשני המקרים הפונקציה נוגעת בנתוני המערכת (עם master key מוזרק), קוראת למערכות חיצוניות (סליקה, SMS, מרכזייה), ומשאירה עקבות ב‑_syslogTriggers וב‑_Timeline.

פעולת הטריגר מעבירה לפונקציה את הרשומה שהפעילה אותה כהקשר:

JSON
{
"actionType": "server-side-code",
"actionData": {
"server-side-code": { "functionName": "calculateCommission", "useQueue": true }
}
}

הטבלה הזו היא גם התשובה ל“הגדרה או פיתוח”:

הצורך למה קונפיגורציה לא מספיקה
חישובים חוצי‑רשומות, סכומי גלגול, עמלות מדורגות טריגר פועל על רשומה אחת; אין שדות מחושבים ואין אגרגציה מובנית
חישוב זמן לפי ימי עסקים וחגים (SLA, חלונות שליחה) הפרשי הזמן בטריגר הם דקות לוח שנה בלבד
קריאות לשער סליקה — חיוב, טוקנים, זיכויים API חיצוני + סודות
טלפוניה — קליטת CDR, חיוג מהמערכת, מסך קופץ דורש receiver לוובהוקים של ספק המרכזייה
מיזוג כפילויות, ולידציה מורכבת אין מנוע דה‑דופליקציה מובנה
סנכרון עם מערכות חיצוניות (הנהלת חשבונות, יומנים, מרשמים) API חיצוני, מיפוי, ניסיונות חוזרים
זרימות אימות לפורטל (OTP, הרשמה עצמית עם קישור לרשומה) יצירת משתמש + שיוך תפקיד + הנפקת סשן

לעבוד מול פונקציה קיימת

Section titled “לעבוד מול פונקציה קיימת”

1 · השיגו את החוזה. לכל פונקציה מבנה קלט משלה, ואין מפרט גנרי: קבלו אותו מהצוות שפיתח, או קראו את הטריגר שקורא לה.

2 · בדקו קריאה בודדת לפני השילוב:

Bash
curl -sS -i -X POST "https://api.mbapps.co.il/functions/${APP_ID}/${FN}" \
-H "Content-Type: application/json" \
-H "X-Parse-Application-Id: ${APP_ID}" \
-d '{"exampleKey":"exampleValue"}'
JavaScript
const APP_ID = process.env.APP_ID, FN = process.env.FN;
const res = await fetch(`https://api.mbapps.co.il/functions/${APP_ID}/${FN}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Parse-Application-Id': APP_ID,
},
body: JSON.stringify({ exampleKey: 'exampleValue' }),
});
console.log(res.status);
const data = await res.json();
Python
import os, requests
APP_ID = os.environ["APP_ID"]
FN = os.environ["FN"]
res = requests.post(
f"https://api.mbapps.co.il/functions/{APP_ID}/{FN}",
headers={
"Content-Type": "application/json",
"X-Parse-Application-Id": APP_ID,
},
json={"exampleKey": "exampleValue"},
)
print(res.status_code)
data = res.json()
PHP
<?php
$appId = getenv('APP_ID');
$fn = getenv('FN');
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://api.mbapps.co.il/functions/$appId/$fn",
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Parse-Application-Id: $appId",
],
CURLOPT_POSTFIELDS => json_encode(["exampleKey" => "exampleValue"]),
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);

3 · הראיות אחרי הריצה:

מה לבדוק איפה
האם הפונקציה רצה בכלל, והאם נכשלה _syslogTriggers — כשהופעלה מטריגר; שדה error
מה השתנה בנתונים _Timeline — אם הטבלה מנוטרת. שורה שנכתבה מפונקציה נושאת Referer: "server-side-code:<functionName>", וזו הדרך הטובה ביותר לזהות שהפונקציה נגעה ברשומה
האם הקריאה בכלל הגיעה מבחוץ _RequestLog (path, method, statusCode, usingMK, ip, duration…) — מתמלא באיחור: כשעה אחרי הקמת מערכת חדשה המחלקה עדיין אינה מוגדרת, וכעבור כמה שעות היא כבר מכילה אלפי שורות מתוארכות מרגע ההקמה. אל תסיקו “הקריאה לא הגיעה” מיומן ריק. ראו יומנים

טבלת Config — מאיפה הפונקציה קוראת הגדרות

Section titled “טבלת Config — מאיפה הפונקציה קוראת הגדרות”

פונקציות קוראות מפתחות ספקים ודגלי תכונה מטבלת Config (Name → Value כאובייקט):

JSON
{ "Name": "AcceptWebLeads", "Value": { "AcceptWebLeads": true } }
{ "Name": "AcceptWebToTable","Value": { "AcceptWebToTable": true } }

במערכת חדשה קיימות מהקופסה רק AcceptWebLeads (דלוקה) ו‑Payment; את AcceptWebToTable ו‑AcceptWebToCaseLeads יוצרים בעצמכם. בלי השורה, הפונקציה מחזירה 400 {"error":"AcceptWebToTable is Disabled"}. ראו דגלי הפעלה.

Bash
# בדיקת דגל — Master Key, API Key, או Session Token של משתמש מורשה
curl -sS -G "https://api.mbapps.co.il/parse/classes/Config" \
-H "X-Parse-Application-Id: $APP_ID" \
-H "X-Parse-Master-Key: $MASTER_KEY" \
--data-urlencode 'where={"Name":"AcceptWebToTable"}'
JavaScript
const APP_ID = process.env.APP_ID, MASTER_KEY = process.env.MASTER_KEY;
const params = new URLSearchParams({
where: '{"Name":"AcceptWebToTable"}',
});
const res = await fetch(`https://api.mbapps.co.il/parse/classes/Config?${params}`, {
headers: {
'X-Parse-Application-Id': APP_ID,
'X-Parse-Master-Key': MASTER_KEY,
},
});
const data = await res.json();
Python
import os, requests
APP_ID = os.environ["APP_ID"]
MASTER_KEY = os.environ["MASTER_KEY"]
res = requests.get(
"https://api.mbapps.co.il/parse/classes/Config",
headers={
"X-Parse-Application-Id": APP_ID,
"X-Parse-Master-Key": MASTER_KEY,
},
params={
"where": '{"Name":"AcceptWebToTable"}',
},
)
data = res.json()
PHP
<?php
$appId = getenv('APP_ID');
$masterKey = getenv('MASTER_KEY');
$query = http_build_query([
'where' => '{"Name":"AcceptWebToTable"}',
]);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://api.mbapps.co.il/parse/classes/Config?$query",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Parse-Application-Id: $appId",
"X-Parse-Master-Key: $masterKey",
],
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
  1. הפונקציה עוקפת הרשאות. היא רצה עם Master Key, ו‑CLP אינו מגביל אותה: פונקציה באגית נוגעת בכל דבר. קריטריון קבלה ובדיקת יומנים אינם מותרות.
  2. הכתיבות שלה מפעילות טריגרים כמו כל כתיבה. פונקציה שכותבת 500 רשומות מפעילה 500 שרשראות. עומק שרשרת מרבי: 3 רמות; הרמה הרביעית נחסמת ונרשמת ב‑_syslogTriggers עם error: "blocked! trigger step is to deep -3. source trigger: <id>".
  3. התאמת טלפון לפי הספרות האחרונות נפוצה באינטגרציות טלפוניה ומייצרת התנגשויות בקווים משותפים. הגדירו את כלל ההתאמה במפורש במפרט.