انتقل إلى المقال
Aniq-UI

Food Studioمرجع واجهة API

مرجع واجهة API

كل مسار تقدّمه واجهة API، ومن يحق له استدعاؤه، وكيف تعمل تسجيلات الدخول والصلاحيات والأخطاء والقوائم والحدود.

لحزمة الحزمة الكاملة

العنوان الأساسي وصيغة الاستجابة

كل مسار يُقدَّم تحت البادئة /api. محليًا يكون العنوان الأساسي http://localhost:8000/api. وعلى الخادم يكون عنوان واجهة API الخاصة بك متبوعًا بـ /api، وهي القيمة نفسها التي تقرؤها الواجهتان الأماميتان من NEXT_PUBLIC_API_BASE_URL (متغيرات البيئة).

تخدم واجهة API جمهورين لا يتشاركان رمزًا أبدًا: العملاء، الذين يستخدمون مسارات الموقع، والفريق، الذي يستخدم مسارات لوحة التحكم. أجسام الطلبات بصيغة JSON، ما عدا رفع الملفات. كل إجابة تأتي في الغلاف نفسه:

الغلاف
{
  "success": true,
  "data": { },
  "message": ""
}

يحتوي data على النتيجة. وmessage جملة قصيرة تملؤها بعض عمليات الكتابة، بلغة الطلب، وتكون فارغة في غير ذلك. المال بالدولار العشري في JSON، مثل 14.99، وكل إجمالي تحسبه واجهة API: لا يُوثق بأي شيء يرسله العميل عن المال.

فحص السلامة لا يحتاج إلى رمز:

الطرفية
curl http://localhost:8000/api/health
الاستجابة
{"success":true,"data":{"status":"ok","database":"up"},"message":""}

عندما يتعذر قراءة قاعدة البيانات يجيب أيضًا بـ 200، مع "status":"degraded" و"database":"down". يقرأ فحص السلامة في صورة Docker هذا الحقل.

الأخطاء

يحتفظ الفشل بالغلاف، مع success: false وحالة HTTP:

الخطأ
{
  "success": false,
  "data": null,
  "message": "errors.kitchen_closed",
  "errors": { "email": ["…"] },
  "code": "…"
}
  • الأخطاء التي يراها العميل مفاتيح مثل errors.kitchen_closed أو errors.outside_area أو errors.rate_limited، يترجمها الموقع بنفسه. الرسائل الأخرى جمل بلغة الطلب.
  • يظهر errors عند فشل التحقق، مع المشكلات لكل حقل.
  • يحمل code سببًا قابلًا للقراءة آليًا عندما يوجد، مثل changes مع قائمة changes عندما يتغير سعر قبل إرسال الطلب.
  • المسار المحمي من دون رمز يجيب بـ 401؛ والرمز من دون الصلاحية يجيب بـ 403.

القوائم والتقسيم إلى صفحات

تأخذ مسارات القوائم page وlimit (ويُقبل page_count بدلًا من limit). الحد الأقصى لـ limit هو 100. ما لم يحدد المستدعي الترتيب، تأتي الصفوف من الأحدث تحديثًا أولًا، مع المعرّف لفض التعادل، لذلك يكون التقسيم إلى صفحات ثابتًا.

القائمة والطلبات
{ "items": [ ], "total": 64, "page": 1, "limit": 12, "totalPages": 6 }

تضع قائمتا الأطباق والطلبات الصفوف تحت items. وتضعها قوائم الفئات والتقييمات والعملاء والفريق والأدوار والإعدادات تحت data، مع حقول التقسيم نفسها. القوائم التي تُقرأ بتسلسل، مثل أقسام الصفحة الرئيسية وقائمة انتظار المطابخ، تحافظ على ذلك التسلسل.

اللغة

أرسل Accept-Language: ar للرسائل العربية؛ وأي قيمة أخرى تجيب بالإنجليزية. تحمل سجلات القائمة اللغتين بالشكل { "en": "…", "ar": "…" } أيًا كانت قيمة الترويسة، ويختار العميل إحداهما.

تسجيل الدخول

  1. سجّل الدخول كعضو في الفريق

    الطرفية
    curl -X POST http://localhost:8000/api/auth/login \
      -H "Content-Type: application/json" \
      -d '{"email":"owner@foodstudio.example","password":"FoodDemo2026!"}'

    data.access_token هو رمز الفريق، مع token_type بقيمة Bearer، وexpires_in (7d افتراضيًا، JWT_EXPIRATION) والعضو مع أدواره. ويعيد GET /api/auth/me العضو المسجّل مع صلاحياته.

  2. استدعِ مسارًا محميًا

    الطرفية
    curl http://localhost:8000/api/orders -H "Authorization: Bearer YOUR_TOKEN"
  3. سجّل الدخول كعميل

    يجيب POST /api/auth/customer/login بالجسم نفسه بـ { token, user }؛ ويأخذ POST /api/auth/customer/register القيم first_name وlast_name وemail وpassword (8 أحرف أو أكثر) وphone اختياريًا، ويجيب بالشكل نفسه. العميل التجريبي هو sam@foodstudio.example مع FoodDemo2026!.

  • يُرفض رمز العميل في كل مسار خاص بالفريق، ويُرفض رمز الفريق في كل مسار خاص بالعملاء.
  • البريد غير المعروف وكلمة المرور الخاطئة يجيبان كلاهما بـ 401 مع الرسالة نفسها.
  • عشر محاولات تسجيل دخول فاشلة من عنوان واحد خلال 15 دقيقة، لكل نموذج، تجيب بـ 429 حتى يمر 15 دقيقة على أقدم محاولة فاشلة (RATE_LIMIT_LOGIN). لا تُحتسب تسجيلات الدخول الناجحة.
  • لا يوجد مسار لتسجيل الخروج: يسجّل العميل خروجه بنسيان رمزه.
الطريقةالمسارمن يحق له استدعاؤهوظيفته
POST/api/auth/loginأي شخصتسجيل دخول الفريق
GET/api/auth/meأي عضو مسجّل في الفريقالعضو المسجّل وأدواره وصلاحياته
POST/api/auth/customer/registerأي شخصأنشئ حساب عميل وسجّل الدخول. تكرار client_token يعيد حساب المحاولة الأولى
POST/api/auth/customer/loginأي شخصتسجيل دخول العميل
GET/api/auth/customer/meالعميلالملف الشخصي، مع reward_points
PATCH/api/auth/customer/meالعميلتعديل first_name وlast_name وemail وphone
PATCH/api/auth/customer/me/passwordالعميلتغيير كلمة المرور: current_password وnew_password
POST/api/auth/customer/forgot-passwordأي شخصإرسال رابط إعادة التعيين بالبريد. يجيب دائمًا بـ { sent: true }، لأي عنوان
POST/api/auth/customer/reset-passwordأي شخصإتمام إعادة التعيين: token وpassword. يعمل الرمز مرة واحدة، خلال ساعة

الصلاحيات

تتحقق مسارات الفريق من صلاحية، اسمها بالشكل <module>.<action>. يحمل العضو كل صلاحيات كل أدواره.

الوحدةالصلاحيات
الفريقadmins.view, admins.create, admins.edit, admins.delete, admins.assign_roles
الأدوارroles.view, roles.create, roles.edit, roles.delete, roles.assign_permissions
الإعدادات، والمطابخ، ورموز الخصمsettings.view, settings.edit
العملاءusers.view, users.create, users.update, users.delete, users.restore, users.verify
الفئاتcategories.view, categories.create, categories.edit, categories.delete, categories.restore
القائمة، والعروض، والصفحة الرئيسيةproducts.view, products.create, products.edit, products.delete, products.restore
الطلبات والنظرة العامةorders.view, orders.edit
الذكاء الاصطناعيai_studio.use, ai_chat.use, ai_chat.view_models
الدور التجريبييمنح
المالككل الصلاحيات
المدير (Manager)كل الصلاحيات ما عدا admins.* وroles.*
المطبخorders.view وorders.edit، مقصورتان على طلبات مطبخه، من دون أسعار ومن دون بريد العميل، ومع الانتقالات من مؤكد إلى قيد التحضير ومن قيد التحضير إلى جاهز فقط
الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/productsأي شخص؛ ويرى الفريق الصفوف المخفية أيضًاالقائمة المنشورة. q، وcategory (slug)، وdietary (مفصولة بفواصل)، وavailable، وsort (popularity، price_asc، price_desc، name)، وpage، وlimit (12 افتراضيًا). مع scope=admin وproducts.view تُعرض كل الأطباق، بما فيها المسودات
GET/api/products/featuredأي شخصالأطباق المميزة
GET/api/products/slug/:slugأي شخص؛ ويرى الفريق الصفوف المخفية أيضًاطبق واحد بالـ slug الخاص به، مع الأطباق المرتبطة related
GET/api/products/:idأي شخص؛ ويرى الفريق الصفوف المخفية أيضًاطبق واحد بالمعرّف
GET/api/products/:id/relatedأي شخصأطباق من الفئة نفسها، ثم الأكثر مبيعًا
GET/api/categoriesأي شخص؛ ويرى الفريق الصفوف المخفية أيضًاالفئات، بترتيبها في القائمة
GET/api/categories/rootsأي شخصالفئات الرئيسية
GET/api/categories/slug/:slugأي شخص؛ ويرى الفريق الصفوف المخفية أيضًافئة واحدة بالـ slug الخاص بها
GET/api/categories/:idأي شخص؛ ويرى الفريق الصفوف المخفية أيضًاتصنيف واحد حسب المعرّف (id)
GET/api/offersأي شخص؛ ويرى الفريق الصفوف المخفية أيضًاعروض الكومبو، مع خياراتها ورسومها الإضافية وما توفّره
GET/api/offers/:codeأي شخص؛ ويرى الفريق الصفوف المخفية أيضًاكومبو واحد، مثل classic-combo
GET/api/homepage-sectionsأي شخص؛ ويرى الفريق الصفوف المخفية أيضًاأقسام الصفحة الرئيسية، بترتيب الصفحة
GET/api/homepage-sections/:key/productsأي شخصالأطباق التي يعرضها القسم، بالترتيب
GET/api/reviews/product/:productIdأي شخصتقييمات الطبق
GET/api/reviews/product/:productId/summaryأي شخصالمتوسط، والإجمالي، والعدد لكل نجمة

يحمل الطبق name وdescription وingredients باللغتين، وprice، وcategory الخاصة به، وimages، وoption_groups مع choices الخاصة بها وprice_delta لكل اختيار، وallergens، وdietary_tags، وpreparation_minutes، والمفاتيح is_active (منشور)، وis_available (يمكن طلبه الآن)، وis_featured وis_best_seller.

المطابخ وفحص الرمز البريدي

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/kitchensأي شخص؛ ويرى الفريق الصفوف المخفية أيضًاالمطابخ، لكل منها ساعاتها ومنطقتها الزمنية ومدة التحضير ورموز التوصيل البريدية وما إذا كانت مفتوحة الآن
GET/api/kitchens/:codeأي شخص؛ ويرى الفريق الصفوف المخفية أيضًامطبخ واحد، مثل central
POST/api/kitchens/checkأي شخصأي مطبخ يمكنه خدمة رمز بريدي
POST /api/kitchens/check
{ "postcode": "10001", "mode": "delivery", "kitchen_code": "central" }

يجيب بـ { result, kitchen, alternatives }، حيث result هي match أو outside_area أو closed. لا يتقيد الاستلام بالرمز البريدي. وتعتمد حالة فتح المطبخ على إعداد ساعة الخدمة.

التسعير، ورموز الخصم، والسلة

الطريقةالمسارمن يحق له استدعاؤهوظيفته
POST/api/checkout/quoteأي شخص؛ ويُقرأ رمز العميل عند إرسالهتسعير سلة مقابل مطبخ من دون كتابة أي شيء
POST/api/promo/validateأي شخصما سيخصمه رمز من مجموع فرعي: { code, subtotal }
GET/api/cartالعميلسلة العميل المسجّل على الخادم، مع تسعيرها
POST/api/cart/itemsالعميلإضافة اختيار
PATCH/api/cart/items/:idالعميلتغيير كمية سطر أو خياراته أو ملاحظته
DELETE/api/cart/items/:idالعميلحذف سطر
DELETE/api/cartالعميلإفراغ السلة
PUT/api/cart/metaالعميلتغيير المطبخ والتوصيل أو الاستلام
POST/api/cart/mergeالعميلدمج سلة الزائر عند تسجيل الدخول، من دون استبدال أي سطر أبدًا
POST /api/checkout/quote
{
  "lines": [
    { "product_id": 9, "quantity": 1, "options": [{ "group": "size", "choice": "double" }], "instructions": "no onions" },
    { "offer_id": 1, "quantity": 1, "offer_choices": { "main": 9, "side": 5, "drink": 3 } }
  ],
  "kitchen_code": "central",
  "fulfillment": "delivery",
  "address": { "street": "12 Main St", "city": "Demo City", "postcode": "10001" },
  "promo_code": "TASTE10"
}
  • يحدد السطر product_id أو offer_id، مع quantity من 1 إلى 10 وinstructions لا تتجاوز 200 حرف.
  • يُبلغ التسعير عن المجموع الفرعي، والخصومات، والرسوم، والإجمالي، والنقاط التي سيكسبها الطلب، وما إذا كان التوصيل ممكنًا (address_incomplete، outside_area، closed، below_minimum)، وقائمة changes لأي سطر تغيّر سعره أو لا يمكن طلبه.
  • يخصم رمز الخصم نسبته من المجموع الفرعي للقائمة، ولا يخصم أبدًا من رسوم التوصيل. يخصم redeem_points: true استبدالًا واحدًا لعميل مسجّل لديه نقاط كافية.

إرسال الطلب وتتبّعه

الطريقةالمسارمن يحق له استدعاؤهوظيفته
POST/api/ordersأي شخص؛ ويُقرأ رمز العميل عند إرسالهإرسال طلب. يحتاج إلى الترويسة Idempotency-Key
GET/api/orders/myالعميلطلبات العميل، الأحدث أولًا
GET/api/orders/number/:orderNumberالعميلطلب واحد من طلبات العميل نفسه، مثل FS-1042
GET/api/orders/trackأي شخصتتبّع الزائر: ?number=FS-1042&email=…
GET/api/orders/track/statusأي شخصحالة الطلب، لمن يحمل رمز تتبّع: ?token=…
  • يأخذ POST /api/orders القيم lines وkitchen_code وfulfillment وaddress من التسعير، إضافة إلى phone، وpayment_method (stripe أو paypal أو demo، كما يعرضها GET /api/payments/methods)، وterms_accepted: true، وللزائر name وemail. اختياري: promo_code، وredeem_points، وdelivery_instructions، وlocale، وaccept_changes، وreturn_url_ok وreturn_url_cancel، اللذان يجب أن يكونا على عنوان موجود في CORS_ORIGIN.
  • يجيب بـ 201 مع { order, payment, tracking }. تكون payment.kind إما redirect، مع صفحة المزوّد في payment.url، أو none للدفع التجريبي، الذي يدفعه بعد ذلك POST /api/payments/checkout-session. وtracking رمز موقّع، صالح لثلاث ساعات، لـ GET /api/orders/track/status.
  • القيمة نفسها لـ Idempotency-Key من الشخص نفسه تعيد الطلب المحفوظ بدلًا من إنشاء طلب ثانٍ.
  • السعر الذي تغيّر، أو الطبق الذي أصبح غير متوفر، يجيب بـ 422 مع code: "changes" حتى يرسل العميل مفتاح التغيير في accept_changes.
  • يجيب تتبّع الزائر بـ 404 نفسها للرقم غير المعروف والبريد الخاطئ والمعاملات الناقصة.

تنتقل حالة الطلب عبر pending وconfirmed وpreparing وready، ثم out_for_delivery وdelivered للتوصيل، أو مباشرة إلى delivered للاستلام. يمكن أن يصبح cancelled مع ذكر السبب قبل أن يغادر المطبخ، ولا يصبح refunded إلا عندما يُبلغ مزوّد الدفع عن استرداد.

المدفوعات

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/payments/methodsأي شخصما يمكن أن تعرضه صفحة إتمام الطلب: { methods, hosted, modes }، وكل طريقة test أو live
POST/api/payments/checkout-sessionأي شخص؛ ويُقرأ رمز العميل عند إرسالهدفع طلب غير مدفوع قيد الانتظار، أو إعادة فتح دفعه: { order_number, email? }
GET/api/payments/return/stripeالمتصفح، عائدًا من Stripe (عنوان موقّع)يؤكد الدفع مع Stripe، ثم يعيد التوجيه إلى الموقع مع ?order=…&payment=paid|pending|cancelled|failed
GET/api/payments/return/paypalالمتصفح، عائدًا من PayPal (عنوان موقّع)يحصّل الدفعة الموافق عليها، ثم يعيد التوجيه بالطريقة نفسها
POST/api/payments/webhooks/:providerStripe أو PayPal أو مستدعي الدفع التجريبيstripe أو paypal أو demo. الاستدعاء غير الموقّع أو المعدَّل يجيب بـ 401

العناوين، والأطباق المحفوظة، والمكافآت، والتقييمات، والتواصل

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/addressesالعميلعناوين التوصيل المحفوظة
GET/api/addresses/:idالعميلعنوان واحد
POST/api/addressesالعميلحفظ عنوان
PATCH/api/addresses/:idالعميلتعديل عنوان
PATCH/api/addresses/:id/defaultالعميلجعله العنوان الافتراضي
DELETE/api/addresses/:idالعميلحذف عنوان
GET/api/wishlistالعميلالأطباق المحفوظة
PUT/api/wishlist/:productIdالعميلحفظ طبق
DELETE/api/wishlist/:productIdالعميلإزالة طبق
DELETE/api/wishlistالعميلإزالة كل الأطباق المحفوظة
POST/api/wishlist/mergeالعميلإضافة الأطباق المحفوظة لدى الزائر عند تسجيل الدخول
GET/api/rewards/meالعميلرصيد النقاط، وتكلفة الاستبدال الواحد وقيمته، والسجل
POST/api/reviewsالعميلتقييم طبق
PATCH/api/reviews/:idالعميلتعديل التقييم الخاص بك
DELETE/api/reviews/:idالعميلحذف التقييم الخاص بك
POST/api/contactأي شخصنموذج التواصل: name وemail وmessage وclient_token. يصل إلى الفريق كإشعار

الفريق: القائمة، والفئات، وعروض الكومبو، والصفحة الرئيسية

الطريقةالمسارمن يحق له استدعاؤهوظيفته
POST/api/productsأعضاء الفريق الذين لديهم products.createإنشاء طبق
PATCH/api/products/:idأعضاء الفريق الذين لديهم products.editتعديل طبق. عند إرسال images وoption_groups تستبدلان المجموعة كاملة
PATCH/api/products/:id/availabilityأعضاء الفريق الذين لديهم products.edit{ is_available }: المفتاح الذي يقلبه المطبخ أثناء الخدمة
DELETE/api/products/:idأعضاء الفريق الذين لديهم products.deleteأرشفة طبق
GET/api/products/deletedأعضاء الفريق الذين لديهم products.deleteالأطباق المؤرشفة
POST/api/products/deleted/:id/restoreأعضاء الفريق الذين لديهم products.restoreاستعادة طبق
GET/api/products/statisticأعضاء الفريق الذين لديهم products.viewأعداد القائمة
GET/api/products/draftsأي عضو مسجّل في الفريقالمسودة المحفوظة تلقائيًا لنموذج الطبق
PUT/api/products/draftsأي عضو مسجّل في الفريقحفظ المسودة
DELETE/api/products/draftsأي عضو مسجّل في الفريقتجاهل المسودة
POST/api/categoriesأعضاء الفريق الذين لديهم categories.createإنشاء فئة
PATCH/api/categories/:idأعضاء الفريق الذين لديهم categories.editتعديل فئة
DELETE/api/categories/:idأعضاء الفريق الذين لديهم categories.deleteأرشفة فئة
GET/api/categories/deletedأعضاء الفريق الذين لديهم categories.deleteالفئات المؤرشفة
POST/api/categories/deleted/:id/restoreأعضاء الفريق الذين لديهم categories.restoreاستعادة فئة
GET/api/categories/statisticأعضاء الفريق الذين لديهم categories.viewأعداد التصنيفات
POST/api/offersأعضاء الفريق الذين لديهم products.createإنشاء كومبو
PATCH/api/offers/:codeأعضاء الفريق الذين لديهم products.editتعديل كومبو
DELETE/api/offers/:codeأعضاء الفريق الذين لديهم products.deleteحذف كومبو
GET/api/homepage-sections/:keyأعضاء الفريق الذين لديهم products.viewقسم واحد من الصفحة الرئيسية
PUT/api/homepage-sections/:keyأعضاء الفريق الذين لديهم products.editتعديل قسم: title وcontent وposition وis_visible وproduct_ids. ما لا يُرسل يبقى كما كان

الفريق: الطلبات والنظرة العامة

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/ordersأعضاء الفريق الذين لديهم orders.viewكل طلب يحق للعضو رؤيته: status (مفصولة بفواصل)، وfulfillment، وdate (today أو yesterday أو يوم محدد)، وq، وsort_by، وsort_order، والتقسيم إلى صفحات
GET/api/orders/:idأعضاء الفريق الذين لديهم orders.viewطلب واحد مع جدوله الزمني
GET/api/orders/statisticأعضاء الفريق الذين لديهم orders.viewالأعداد لكل حالة، والإيرادات المدفوعة للحسابات التي ترى الأموال
PATCH/api/orders/:id/statusأعضاء الفريق الذين لديهم orders.editنقل طلب: { status, reason? }. يحتاج الإلغاء إلى سبب
GET/api/overviewأعضاء الفريق الذين لديهم orders.viewالصفحة الأولى في لوحة التحكم: ?range=today أو yesterday. مرفوض لحسابات المطبخ
  • الانتقال الذي لا يسمح به تسلسل الحالات يجيب بـ 409 errors.transition_not_allowed؛ والانتقال الذي لا يحق لهذا الحساب إجراؤه بـ 403 errors.transition_forbidden؛ وتأكيد طلب غير مدفوع بـ 409 errors.payment_required.
  • لا يرى حساب المطبخ إلا طلبات مطبخه، من دون أسعار، وأي طلب آخر يجيب بـ 404.

الفريق: العملاء، والفريق، والأدوار

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/usersأعضاء الفريق الذين لديهم users.viewالعملاء، مع البحث والتصفية
GET/api/users/statisticأعضاء الفريق الذين لديهم users.viewأعداد العملاء
GET/api/users/:usernameأعضاء الفريق الذين لديهم users.viewعميل واحد
POST/api/usersأعضاء الفريق الذين لديهم users.createإنشاء عميل
PATCH/api/users/:usernameأعضاء الفريق الذين لديهم users.updateتعديل عميل
PATCH/api/users/:username/change-passwordأعضاء الفريق الذين لديهم users.updateتعيين كلمة مرور عميل
POST/api/users/:username/make-verifiedأعضاء الفريق الذين لديهم users.verifyتعليم البريد الإلكتروني كموثَّق
POST/api/users/:username/make-unverifiedأعضاء الفريق الذين لديهم users.verifyتعليم البريد الإلكتروني كغير موثَّق
DELETE/api/users/:usernameأعضاء الفريق الذين لديهم users.deleteحذف عميل
GET/api/users/deletedأعضاء الفريق الذين لديهم users.viewالعملاء المحذوفون
GET/api/users/deleted/:usernameأعضاء الفريق الذين لديهم users.viewعميل محذوف واحد
POST/api/users/deleted/:username/restoreأعضاء الفريق الذين لديهم users.restoreاستعادة عميل
GET/api/adminsأعضاء الفريق الذين لديهم admins.viewالفريق
GET/api/admins/statisticsأعضاء الفريق الذين لديهم admins.viewأعداد الفريق
GET/api/admins/:idأعضاء الفريق الذين لديهم admins.viewعضو واحد، بالمعرّف أو اسم المستخدم
POST/api/adminsأعضاء الفريق الذين لديهم admins.createإضافة عضو
PATCH/api/admins/:idأعضاء الفريق الذين لديهم admins.editتعديل عضو، بما في ذلك مطبخه
PATCH/api/admins/:id/rolesأعضاء الفريق الذين لديهم admins.assign_rolesتعيين أدوار عضو
DELETE/api/admins/:idأعضاء الفريق الذين لديهم admins.deleteحذف عضو
PATCH/api/admins/profileأعضاء الفريق الذين لديهم admins.editتعديل الملف الشخصي الخاص بك
PATCH/api/admins/profile/passwordأي عضو مسجّل في الفريقتغيير كلمة المرور الخاصة بك
GET/api/rolesأعضاء الفريق الذين لديهم roles.viewالأدوار
GET/api/roles/statisticsأعضاء الفريق الذين لديهم roles.viewأعداد الأدوار
GET/api/roles/selectأعضاء الفريق الذين لديهم roles.viewالأدوار، بصيغة مناسبة لقائمة اختيار
GET/api/roles/permissionsأعضاء الفريق الذين لديهم roles.viewكل الصلاحيات
GET/api/roles/:idأعضاء الفريق الذين لديهم roles.viewدور واحد بصلاحياته
POST/api/rolesأعضاء الفريق الذين لديهم roles.createإنشاء دور
PUT/api/roles/:idأعضاء الفريق الذين لديهم roles.editإعادة تسمية دور
POST/api/roles/:id/permissionsأعضاء الفريق الذين لديهم roles.assign_permissionsتعيين صلاحيات دور
DELETE/api/roles/:idأعضاء الفريق الذين لديهم roles.deleteحذف دور

الفريق: الإعدادات، والمطابخ، ورموز الخصم، والملفات المرفوعة، والإشعارات

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/settingsأعضاء الفريق الذين لديهم settings.viewكل إعداد محفوظ: search وcategory والتقسيم إلى صفحات
GET/api/settings/:keyأعضاء الفريق الذين لديهم settings.viewإعداد واحد، مثل delivery_fee
PATCH/api/settings/:keyأعضاء الفريق الذين لديهم settings.editتغيير إعداد
DELETE/api/settings/:keyأعضاء الفريق الذين لديهم settings.editحذف إعداد
POST/api/kitchensأعضاء الفريق الذين لديهم settings.editإضافة مطبخ
PATCH/api/kitchens/:codeأعضاء الفريق الذين لديهم settings.editتعديل مطبخ
DELETE/api/kitchens/:codeأعضاء الفريق الذين لديهم settings.editحذف مطبخ
GET/api/promoأعضاء الفريق الذين لديهم settings.viewرموز الخصم
POST/api/promoأعضاء الفريق الذين لديهم settings.editإنشاء رمز: code وpercent وexcludes_delivery وstackable_with_rewards وis_active
PATCH/api/promo/:idأعضاء الفريق الذين لديهم settings.editتعديل رمز
DELETE/api/promo/:idأعضاء الفريق الذين لديهم settings.editحذف رمز. تحتفظ به الطلبات كنص
POST/api/helpers/uploadأي عضو مسجّل في الفريقرفع صورة أو فيديو، multipart/form-data مع file، حتى 150 MB
GET/api/notificationsأي عضو مسجّل في الفريقأحدث 30 إشعارًا للعضو وعدد غير المقروء
PATCH/api/notifications/read-allأي عضو مسجّل في الفريقتعليم كل الإشعارات كمقروءة
PATCH/api/notifications/:id/readأي عضو مسجّل في الفريقتعليم إشعار واحد كمقروء
DELETE/api/notifications/:idأي عضو مسجّل في الفريقحذف إشعار واحد
  • الإعدادات التي يعمل بها المطعم هي delivery_fee وpickup_fee وdelivery_minimum وrewards_points_per_dollar وrewards_redeem_points وrewards_redeem_value وservice_clock (real أو demo-fixed)، إلى جانب site_name وsite_tagline وsupport_email وsupport_phone.
  • تُحفظ الصورة المرفوعة بصيغة JPEG بعدة أحجام، وتربط الإجابة كل نسخة بعنوانها. تذهب الملفات إلى المخزن عندما تكون متغيرات R2_* مضبوطة، وإلى /media/uploads/… على واجهة API في غير ذلك.
  • كل مسار للإشعارات يجيب بالقائمة كاملة، لذلك يستبدل العميل ما لديه بالإجابة.

الحدود لكل عنوان

المسارالحدالمتغير
POST /api/auth/login, POST /api/auth/customer/login10 محاولات تسجيل دخول فاشلة كل 15 دقيقة، لكل نموذجRATE_LIMIT_LOGIN
POST /api/orders10 كل 10 دقائقRATE_LIMIT_ORDERS
POST /api/payments/checkout-session30 كل 10 دقائقRATE_LIMIT_PAYMENT_SESSION
GET /api/orders/track30 كل 10 دقائقRATE_LIMIT_TRACKING
POST /api/auth/customer/register10 في الساعةRATE_LIMIT_REGISTER
POST /api/contact5 في الساعةRATE_LIMIT_CONTACT
POST /api/auth/customer/forgot-password10 في الساعة، و5 رسائل لكل مستلم في اليومRATE_LIMIT_PASSWORD_RESET, MAIL_MAX_PER_ADDRESS_PER_DAY

الطلب الذي يتجاوز حدًا يجيب بـ 429 مع errors.rate_limited. الأعداد محفوظة في ذاكرة واجهة API، لذلك تمسحها إعادة التشغيل. خلف خادم وكيل عكسي، اضبط TRUST_PROXY حتى يُحسب كل زائر على عنوانه الخاص.

المساعد الذكي ومحادثاته

مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.

مسارات البث في المساعد، وقائمة نماذجه، والمحادثات المحفوظة.

استوديو الذكاء الاصطناعي

مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.

مسارات الاستوديو: التفاصيل، والإنشاءات، وحفظ النتائج، وإزالة الخلفية.

خادم MCP

مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.

نقطة نهاية MCP لوكلاء البرمجة وكيفية التصريح لها.

التحديثات المباشرة عبر WebSocket

مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.

مساحات أسماء Socket.IO التي تستمع إليها لوحة التحكم، وأحداثها، وكيفية التصريح للاتصال.

مسارات وضع العرض التجريبي

مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.

المسارات الموجودة فقط في بناء النسخة التجريبية العامة.

توقفت عند خطوة؟

ابحث عن الحل قبل أن تبدأ من جديد.

حل المشكلات

تفضيلات ملفات تعريف الارتباط

نستخدم ملفات تعريف الارتباط لتعزيز تجربة التصفح الخاصة بك وتحليل حركة المرور على الموقع وتخصيص المحتوى. بالنقر على "قبول الكل"، فإنك توافق على استخدامنا لملفات تعريف الارتباط للتحليلات والإعلانات المخصصة.