به محتوای اصلی

قوانین

موتور قوانین همان جایی است که «بدون کد» از CRUD فراتر می‌رود: اعتبارسنجی، محرک و فیلد محاسباتی — منطق تجاری واقعی، بدون نوشتن سرور.

شرط‌ها و فرمول‌ها با زبان امن CEL (Common Expression Language) نوشته می‌شوند و در محیط ایزوله با محدودیت منابع اجرا می‌شوند؛ یعنی یک فرمول اشتباه نمی‌تواند سرویس شما را از کار بیندازد.

۱. اعتبارسنجی (Validation)

اگر شرط برقرار باشد، درخواست با پیام خطای شما رد می‌شود. مثال — مبلغ سفارش نباید صفر یا منفی باشد:

  • وقتی: قبل از ایجاد order
  • اگر: total <= 0.0
  • آنگاه: رد با پیام «مبلغ سفارش باید بزرگ‌تر از صفر باشد»

کلاینت در این حالت خطای ۴۲۲ با همین پیام می‌گیرد — قالب خطا در کار با API.

۲. محرک (Trigger)

هنگام رخدادی (ایجاد، ویرایش، حذف)، فیلدی را مقداردهی یا زیاد می‌کند. مثال — سفارش‌های بزرگ نیاز به تأیید دارند:

  • وقتی: قبل از ایجاد order
  • اگر: total > 1000000.0
  • آنگاه: مقداردهی requires_approval = true

ارسال ایمیل به کاربر

یک محرک می‌تواند به‌جای مقداردهی فیلد، به کاربرِ اپ شما ایمیل بفرستد — مثلاً تأیید سفارش:

  • وقتی: بعد از ایجاد order
  • گیرنده: record.customer_id
  • موضوع: سفارش {{tracking_code}} ثبت شد
  • متن: سلام، سفارش شما به مبلغ {{total}} تومان ثبت شد.

هر {{نام_فیلد}} از همان رکورد پر می‌شود. فیلدی که وجود نداشته باشد خالی رندر می‌شود، نه اینکه آکولادها در ایمیل کاربر باقی بماند.

گیرنده باید یکی از کاربران ثبت‌نام‌شدهٔ همین پروژه باشد؛ record.customer_id یا ایمیل او. آدرس دلخواه پذیرفته نمی‌شود، حتی اگر در رکورد نوشته شده باشد. دلیلش این است که دامنه و IP ارسال بین همهٔ پروژه‌ها مشترک است: اگر یک فرم تماس عمومی می‌توانست به هر آدرسی ایمیل بفرستد، اعتبار ارسال همهٔ پروژه‌ها با هم از بین می‌رفت.

نکته‌های دیگر:

  • فقط on_create، on_update و on_delete. یک قانون before_* قبل از ثبت شدن رکورد اجرا می‌شود و ممکن است آن نوشتن بعداً رد شود — ایمیلی که دربارهٔ سفارشی خبر داده که هرگز ثبت نشده، پس‌گرفتنی نیست.
  • ایمیل در همان تراکنشِ نوشتن صف می‌شود. اگر نوشتن برگردد، ایمیل هم با آن می‌رود.
  • اگر ارسال ممکن نباشد — گیرنده کاربر این پروژه نیست، یا سهمیهٔ روزانه تمام شده — رکورد همچنان ثبت می‌شود. دلیلِ درخواست، رکورد است؛ اطلاع‌رسانی کنارِ آن است.
  • سهمیهٔ روزانه به پلن پروژه بستگی دارد.

۳. فیلد محاسباتی (Computed)

فیلدی که ذخیره نمی‌شود و هنگام خواندن رکورد محاسبه می‌شود:

total_with_tax = total * 1.09

نکته‌های مهم

اعداد در CEL اعشاری‌اند. در مقایسه‌ها مقدار اعشاری بنویسید: total <= 0.0 درست است، total <= 0 خطا می‌دهد.

قانون تازه‌ساخته‌شده به‌صورت پیش‌نویس غیرفعال است و روی API اثر ندارد. بعد از ساخت، از منوی همان قانون آن را «فعال» کنید. قبل از فعال‌سازی هم می‌توانید با «پیش‌نمایش»، قانون را روی دادهٔ نمونه آزمایش کنید.

بیشتر بخوانید