مرجع واجهة 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": "…" } أيًا كانت قيمة الترويسة، ويختار العميل إحداهما.
تسجيل الدخول
سجّل الدخول كعضو في الفريق
الطرفية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العضو المسجّل مع صلاحياته.استدعِ مسارًا محميًا
الطرفيةcurl http://localhost:8000/api/orders -H "Authorization: Bearer YOUR_TOKEN"سجّل الدخول كعميل
يجيب
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 | أي شخص | أي مطبخ يمكنه خدمة رمز بريدي |
{ "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 | العميل | دمج سلة الزائر عند تسجيل الدخول، من دون استبدال أي سطر أبدًا |
{
"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/:provider | Stripe أو 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/login | 10 محاولات تسجيل دخول فاشلة كل 15 دقيقة، لكل نموذج | RATE_LIMIT_LOGIN |
POST /api/orders | 10 كل 10 دقائق | RATE_LIMIT_ORDERS |
POST /api/payments/checkout-session | 30 كل 10 دقائق | RATE_LIMIT_PAYMENT_SESSION |
GET /api/orders/track | 30 كل 10 دقائق | RATE_LIMIT_TRACKING |
POST /api/auth/customer/register | 10 في الساعة | RATE_LIMIT_REGISTER |
POST /api/contact | 5 في الساعة | RATE_LIMIT_CONTACT |
POST /api/auth/customer/forgot-password | 10 في الساعة، و5 رسائل لكل مستلم في اليوم | RATE_LIMIT_PASSWORD_RESET, MAIL_MAX_PER_ADDRESS_PER_DAY |
الطلب الذي يتجاوز حدًا يجيب بـ 429 مع errors.rate_limited. الأعداد محفوظة في ذاكرة واجهة API، لذلك تمسحها إعادة التشغيل. خلف خادم وكيل عكسي، اضبط TRUST_PROXY حتى يُحسب كل زائر على عنوانه الخاص.
المساعد الذكي ومحادثاته
مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.
مسارات البث في المساعد، وقائمة نماذجه، والمحادثات المحفوظة.
استوديو الذكاء الاصطناعي
مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.
مسارات الاستوديو: التفاصيل، والإنشاءات، وحفظ النتائج، وإزالة الخلفية.
خادم MCP
مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.
نقطة نهاية MCP لوكلاء البرمجة وكيفية التصريح لها.
التحديثات المباشرة عبر WebSocket
مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.
مساحات أسماء Socket.IO التي تستمع إليها لوحة التحكم، وأحداثها، وكيفية التصريح للاتصال.
مسارات وضع العرض التجريبي
مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.
المسارات الموجودة فقط في بناء النسخة التجريبية العامة.