انتقل إلى المقال

Velraمرجع واجهة API

مرجع واجهة API

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

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

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

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

مسارات الموقع عامة؛ أما مسارات لوحة التحكم فتحتاج إلى رمز Bearer لمسؤول، ومعظمها يحتاج أيضًا إلى صلاحية. أجسام الطلبات JSON، عدا رفع الملفات. تأتي كل إجابة في الغلاف نفسه:

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

يحمل data النتيجة. وmessage جملة قصيرة تملؤها بعض عمليات الكتابة، بلغة الطلب، وفارغة في غير ذلك. الأسعار أعداد عشرية بعملة العقار.

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

الطرفية
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": { "email": ["…"] }
}
  • message جملة بلغة الطلب.
  • يظهر errors عند فشل التحقق، مع المشكلات لكل حقل، مفهرسة بالمسار الذي أرسله العميل (مثل title.en). ويُرفض أي حقل غير معروف في الجسم.
  • المسار المحمي من دون رمز، أو برمز منتهي، يجيب بـ 401؛ والرمز الذي ينقصه الصلاحية يجيب بـ 403.
  • الطلب الذي يتجاوز حدًّا يُجاب بـ 429.

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

قائمة
{ "data": [ ], "page": 1, "limit": 12, "total": 15, "totalPages": 2 }
  • تُقسَّم العقارات والاستفسارات والمعاينات إلى صفحات بـ page وpage_size: 12 في الصفحة افتراضيًا في الموقع (وأقصاه 24)، و10 في لوحة التحكم (وأقصاه 50). وتعيد قوائم لوحة التحكم أيضًا أعدادها لكل حالة.
  • يُقسَّم المسؤولون والأدوار والإعدادات إلى صفحات بـ page وpage_count.
  • ما لم يكن للمسار ترتيبه الخاص، تأتي الصفوف بالأحدث تحديثًا أولًا، مع المعرّف لكسر التعادل، فيكون الترقيم مستقرًا.
  • يُتحقق من مرشحات عقارات الموقع: تُرفض القيمة غير المعروفة بالرمز 400 بدل تجاهلها، بينما يُتجاهل المفتاح الذي لا تقرؤه واجهة API، فيعمل الرابط المشارَك ذو المعاملات الإضافية.

اللغة

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

تسجيل الدخول

  1. تسجيل دخول مسؤول

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

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

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

    الطرفية
    curl http://localhost:8000/api/leads -H "Authorization: Bearer YOUR_TOKEN"
  • البريد غير المعروف وكلمة المرور الخاطئة يجيبان كلاهما بـ 401 مع الرسالة نفسها.
  • عشر محاولات دخول فاشلة من عنوان واحد خلال 15 دقيقة تُجاب بـ 429 حتى يمضي 15 دقيقة على أقدم محاولة فاشلة (RATE_LIMIT_LOGIN). ولا تُحتسب عمليات الدخول الناجحة.
  • لا يوجد مسار تسجيل ولا مسار تسجيل خروج: الحسابات تأتي من البيانات الأولية أو من إدارة المسؤولين، ويسجّل العميل الخروج بنسيان رمزه.
الطريقةالمسارمن يحق له استدعاؤهوظيفته
POST/api/auth/loginأي شخصتسجيل دخول المسؤول: email وpassword
GET/api/auth/meأي مسؤول مسجّل دخولهالمسؤول المسجّل وأدواره وصلاحياته

الصلاحيات

تفحص مسارات لوحة التحكم صلاحية اسمها <area>.<action>. يملك المسؤول كل صلاحية من كل دور لديه، والمسار الذي يسمّي عدة صلاحيات يقبل أيًّا منها. الصلاحيات الـ 31 والدوران الأوليان مسرودة في المسؤولون والأدوار والصلاحيات.

عقارات الموقع

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/propertiesأي شخصالمنازل المنشورة. purpose (sale وrent)، وtype (apartment وvilla وtownhouse)، وneighborhood (المعرّف النصي)، وmin_price وmax_price، وbedrooms (0 للاستوديوهات، وإلا حد أدنى)، وamenities (معرّفات نصية مفصولة بفواصل، كلها مطلوبة)، وq (العنوان أو المرجع)، وsort (newest وprice_asc وprice_desc)، وpage وpage_size
GET/api/properties/featuredأي شخصالمنازل المميزة في الصفحة الرئيسية: المراجع في إعداد home_featured_references بالترتيب، أو المنازل المنشورة المعلَّمة بأنها مميزة عندما لا ينشر أي منها
GET/api/properties/facetsأي شخصالمنازل المنشورة معدودة حسب الغرض والنوع والحي، للمرشحات والصفحة الرئيسية
GET/api/properties/lookupأي شخصالمنازل المنشورة بالمعرّف، للمنازل المحفوظة والمقارنة: ?ids=1,2,3، وأقصاه 12
GET/api/properties/:slug/similarأي شخصحتى ثلاثة منازل منشورة مشابهة
GET/api/properties/:slugأي شخصمنزل منشور واحد كاملًا، مع معرضه وحيّه وغرفته المؤثثة العامة

الأحياء وإعدادات الوكالة

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/neighborhoodsأي شخصالأحياء المعلَّمة بأنها ظاهرة، بترتيب فرزها
GET/api/settings/publicأي شخصالإعدادات التي يعرضها الموقع: agency_name والعبارات التعريفية والأوصاف باللغتين، وcontact_email وagency_city وcurrency وtimezone وhome_featured_references وhome_staging_property_slug

نموذج التواصل وطلبات المعاينة

الطريقةالمسارمن يحق له استدعاؤهوظيفته
POST/api/leadsأي شخصنموذج التواصل: name وemail وintent (buy وrent وother) وclient_token (UUID v4)، واختياريًا phone وpreferred_areas (معرّفات نصية) وbudget وmessage (1000 حرف) وproperty_id. يردّ 201 مع { id, received_at }
POST/api/viewingsأي شخصطلب معاينة: property_id (منزل منشور) وname وemail وpreferred_date (YYYY-MM-DD) وpreferred_time (HH:MM، بتوقيت الوكالة) وclient_token، واختياريًا phone وmessage. يردّ 201 مع { reference, status, preferred_at, timezone }
  • يعيد client_token المكرر إيصال الإرسال الأول بدل تخزين إرسال ثانٍ.
  • يُعامل الحقل company المملوء كأنه روبوت: يبدو الرد نفسه، ولا يُخزَّن شيء.
  • يجب أن تبدأ المعاينة بعد ساعة على الأقل، بتوقيت Asia/Dubai؛ وما كان أبكر يُجاب بـ 400 مع preferred_time_too_soon على preferred_at.
  • يمكن لكل عنوان إرسال خمسة من كل منهما في عشر دقائق؛ والتالي يُجاب بـ 429.

إدارة العقارات

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/properties/manageالمسؤولون الذين لديهم properties.viewكل عقار، بما فيها المسودات. purpose وtype وstatus وq وpage وpage_size؛ ويعيد counts للكل والمنشورة والمسودات
GET/api/properties/manage/:idالمسؤولون الذين لديهم properties.viewعقار واحد كاملًا، مع معرضه وأزواج التأثيث
POST/api/properties/manageالمسؤولون الذين لديهم properties.createأنشئ مسودة. المطلوب: title (en وar) وpurpose وtype وprice وbedrooms وbathrooms وarea_sqm
PUT/api/properties/manage/:idالمسؤولون الذين لديهم properties.editغيّر أي حقل، بما فيه المعرض (media، حتى 40 عنصرًا)
PATCH/api/properties/manage/:id/statusالمسؤولون الذين لديهم properties.publishاضبط status: draft أو published أو sold أو rented أو archived
PUT/api/properties/manage/:id/mediaالمسؤولون الذين لديهم properties.editاستبدل المعرض، بالترتيب، مع عنصر واحد معلَّم بـ is_cover
DELETE/api/properties/manage/:idالمسؤولون الذين لديهم properties.deleteاحذف العقار

الاستفسارات والمعاينات

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/leadsالمسؤولون الذين لديهم leads.viewالاستفسارات. status وq وreceived_within_days وpage وpage_size؛ مع أعداد لكل حالة
GET/api/leads/:idالمسؤولون الذين لديهم leads.viewاستفسار واحد مع عقاره وملاحظاته ومعاينته
PATCH/api/leads/:idالمسؤولون الذين لديهم leads.editاضبط status (new وcontacted وqualified وclosed) وnotes
GET/api/viewingsالمسؤولون الذين لديهم viewings.viewالمعاينات. status وq وscheduled_from وscheduled_to وpage وpage_size؛ مع أعداد لكل حالة
GET/api/viewings/:idالمسؤولون الذين لديهم viewings.viewمعاينة واحدة مع استفسارها وعقارها
PATCH/api/viewings/:idالمسؤولون الذين لديهم viewings.editaction (confirm وcomplete وcancel) وconfirmed_at (ISO 8601) وadmin_notes. الإجراء من حالة غير مناسبة يُجاب بـ 400
GET/api/overviewالمسؤولون الذين لديهم overview.viewالنظرة العامة: الأعداد المنشورة، والاستفسارات الجديدة، والمعاينات بانتظار التأكيد والقادمة، وآخر الصفوف، والمنازل المميزة، ونقاط الخريطة

الأحياء والإعدادات

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/neighborhoods/manageالمسؤولون الذين لديهم neighborhoods.viewكل حي، بما فيها المخفية
POST/api/neighborhoods/manageالمسؤولون الذين لديهم neighborhoods.createأضف واحدًا: name (en وar)، واختياريًا slug وshort_description وcity وis_featured وsort_order وis_active وcover_url وcover_alt
PUT/api/neighborhoods/manage/:idالمسؤولون الذين لديهم neighborhoods.editغيّر واحدًا
DELETE/api/neighborhoods/manage/:idالمسؤولون الذين لديهم neighborhoods.deleteاحذف واحدًا؛ وتبقى منازله موجودة بلا حي
GET/api/settingsالمشرفون الذين لديهم settings.viewكل إعداد. search وcategory وpage وpage_count
GET/api/settings/:keyالمشرفون الذين لديهم settings.viewإعداد واحد بالمفتاح
PATCH/api/settings/:keyالمشرفون الذين لديهم settings.editغيّر قيمة إعداد واحد
DELETE/api/settings/:keyالمشرفون الذين لديهم settings.editاحذف إعدادًا واحدًا

المسؤولون والأدوار

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/adminsالمشرفون الذين لديهم admins.viewالمسؤولون. email وname وphone وpage وpage_count
GET/api/admins/statisticsالمشرفون الذين لديهم admins.viewأعداد لقائمة المسؤولين
GET/api/admins/:idالمشرفون الذين لديهم admins.viewمسؤول واحد، بالمعرّف أو اسم المستخدم
POST/api/adminsالمشرفون الذين لديهم admins.createأضف مسؤولًا: first_name وlast_name وemail وpassword وpassword_confirmation (6 خانات أو أكثر)، واختياريًا phone
PATCH/api/admins/:idالمشرفون الذين لديهم admins.editغيّر مسؤولًا
PATCH/api/admins/:id/rolesالمشرفون الذين لديهم admins.assign_rolesاضبط أدوار مسؤول: role_ids
DELETE/api/admins/:idالمشرفون الذين لديهم admins.deleteاحذف مسؤولًا
PATCH/api/admins/profileأي مسؤول مسجّل دخولهغيّر first_name أو last_name أو email أو phone أو profile_picture أو country_id للمسؤول المسجّل نفسه. وجود password أو role_ids في الجسم يُجاب بـ 400: فلبيانات الدخول مسارها الخاص
PATCH/api/admins/profile/passwordأي مسؤول مسجّل دخولهغيّر بيانات دخول المسؤول المسجّل نفسه: current_password وpassword وpassword_confirmation
GET/api/rolesالمشرفون الذين لديهم roles.viewالأدوار. name وguard_name وcreated_from وcreated_to وpage وpage_count
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/notificationsأي مسؤول مسجّل دخولهأحدث 30 إشعارًا للمسؤول المسجّل
PATCH/api/notifications/read-allأي مسؤول مسجّل دخولهحدّدها كلها كمقروءة
PATCH/api/notifications/:id/readأي مسؤول مسجّل دخولهتعليم إشعار واحد كمقروء
DELETE/api/notifications/:idأي مسؤول مسجّل دخولهحذف إشعار واحد
POST/api/helpers/uploadأي مسؤول مسجّل دخولهخزّن ملفًا (file متعدد الأجزاء، مع path للمجلد وfor لمقاس الحجم المسبق مثل property وtype). تُعاد ترميز الصور، بعرض لا يتجاوز 1920 بكسل؛ وتُقبل مقاطع الفيديو بصيغة MP4 أو WebM أو MOV أو M4V؛ و150 ميغابايت على الأكثر. يردّ بعنوان الملف المخزَّن

ليس للملف المرفوع صلاحية خاصة به: يفحص المسار الذي يحفظه ما يصير إليه الملف. تُحفظ الإشعارات 30 يومًا.

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

المسارالحدالمتغير
POST /api/auth/login10 محاولات دخول فاشلة كل 15 دقيقةRATE_LIMIT_LOGIN
POST /api/leads5 كل 10 دقائقلا شيء
POST /api/viewings5 كل 10 دقائقلا شيء

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

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

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

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

استوديو التأثيث

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

مسارات الاستوديو: الإنشاءات، وحفظ زوج مؤثث واعتماده.

خادم MCP

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

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

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

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

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

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

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

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

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

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

حل المشكلات

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

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