Build your own website
سجلّ التغييرات
كل تغيير في واجهة Wzgate العامّة — ما أُضيف، وما هُجر ومتى يُحذف، وما أُزيل بالفعل.
الواجهة العامّة عقد. يُعلن التغيير الكاسر هنا أولًا، ويبقى السلوك القديم يعمل مدّة معلنة، ثم يُحذف بعدها. ولا يُسحب شيء دون أن يظهر في هذه الصفحة بتاريخ.
راقب هذه الصفحة — فهي المكان الوحيد الذي يُعلن فيه الحذف.
١٩ سبتمبر ٢٠٢٦
تغيّر — عروض المُلّاك
POST /public/owner-listingsيتطلّب زائرًا مسجّل الدخول ومؤكَّد الحساب. أرسل رمز الزائر فيAuthorization: Bearer <token>. والنداء المجهول يحصل على401؛ ولا يسجّل الدخول إلا حساب مؤكَّد، فالرمز وحده دليل كافٍ. ويُسجَّل العرض باسم ذلك الحساب — ولم تعد الواجهة تطابق المالك بهاتف أو بريد مكتوب.nameوphoneاختياريّان؛ ويُسمّى المالك باسم الحساب عند غيابهما. و**emailيُقبل ويُتجاهل** — فعنوان الحساب معروف أصلًا. وسيُحذف من جسم الطلب بإعلان هنا.- أُزيل
mediaUrls. الجسم الذي ما زال يرسله يحصل على400. تُرفع الصور إلى العرض نفسه، فصار المسار ثلاثة نداءات:POST /public/owner-listingsمعdraft: true— ينشئ مسوّدة.POST /public/owner-listings/:id/media— ارفع الصور (multipart، حتى 20 صورة، 8 ميغابايت لكلٍّ منها، JPEG/PNG/WebP).POST /public/owner-listings/:id/submit— يرسله للمراجعة.
- الإرسال يتطلّب خمس صور على الأقل. الإرسال وإعادة الإرسال والإنشاء بغير
مسوّدة تجيب بـ
400 PHOTOS_TOO_FEWمعdetails: { min, count }تحت هذا الحدّ. ولا تُمنع المسوّدات ولاPATCHبسببه أبدًا. PATCH /public/owner-listings/:idيقبلnameوphone، و**GET /public/owner-listings/:idيعيدهما**، فيملأ نموذج التعديل ما حُفظ لا ما في الملف الشخصي.mineو:idيعيدانlisting: { slug, status }بعد أن يوافق فريق العمل على الطلب ويُنشأ العقار. ولا يظهرslugإلا ما دام الإعلان منشورًا — اربط به حين يوجد، ولا تربط حين يغيب.- مسارات عروض المُلّاك تتطلّب وحدة
realestate.secondary. المؤسّسة التي لا تملكها تجيب بـ403 MODULE_NOT_ENABLEDعلى كل مسارات/public/owner-listings/*. اقرأfeatures.ownerListings(أدناه) وأخفِ مداخل «بِع وحدتك» حين تكونfalse.
تغيّر — جلسات الزائر
- صار إلغاء الرموز ممكنًا. تسجيل الخروج وتغيير كلمة المرور واستعادتها وحذف
الحساب وتعطيل فريق العمل له — كلّها تنهي كل جلسات الحساب. والرمز الملغى يحصل
على
401 VISITOR_SESSION_EXPIRED: امسحه ووجّه الزائر إلى تسجيل الدخول. والحساب المعطّل يحصل على403 VISITOR_DISABLEDعند الدخول وعلى أي نداء بعده. POST /public/me/passwordيعيدtokenجديدًا. التغيير يلغي الرمز الذي أجرى النداء، فاحفظ الجديد وإلّا كان الطلب التالي401 VISITOR_SESSION_EXPIRED. وكلمة المرور الحالية الخاطئة401لا تنهي الجلسة.- تسجيل الخروج يقرأ رمز Bearer من
Authorizationمثل كل نداء لمسجّل دخول — بلا جسم. resend-otpصار محميًّا من الروبوتات ومحدودًا لكل حساب. أرسلX-Turnstile-Tokenكما في عمليات الكتابة المحميّة الأخرى؛ وإعادة الإرسال خلال مهلة الانتظار تحصل على429 RESEND_TOO_SOONمعdetails.retryAfterSeconds— اعرض عدًّا تنازليًّا بدل إعادة المحاولة.- تسجيل الدخول لحساب غير مؤكَّد يعيد
details.visitorIdمع401 VISITOR_EMAIL_NOT_VERIFIED، فتنتقل مباشرة إلى شاشة رمز التحقّق وتناديresend-otpدون أن تطلب من الزائر التسجيل من جديد. - روابط الاستعادة تحمل الرمز بصيغة
<visitorId>.<secret>. مرّره كما هو. والرمز المشوّه أو القديم الصيغة أو المستخدم أو المنتهي يحصل على400 RESET_TOKEN_INVALID.
أُضيف
- التسجيل يقبل
intentوacceptTerms.intentاختياري،BUYERأوSELLER— تلميح يُسجَّل للنظام ولا يمنح أي صلاحية. وacceptTermsاختياري لكنه يجب أن يكونtrueحين يُرسل؛ أرسله حين يحوي نموذجك مربّع الموافقة على الشروط. GET /public/company-profileيكتسبfeatures.ownerListings(منطقي — هل عروض المُلّاك مفتوحة في هذا الموقع) وsite.ownerReviewSlaHours(رقم أوnull— المدّة التي يستهدفها فريق العمل للمراجعة، لنصوص «نردّ خلال …»).- النطاق المُضاف وحده يعرّف الموقع على كل المسارات العامّة. النداء من المتصفّح
على أحد نطاقات الموقع لا يحتاج ترويسة:
Originتكفي، بما فيها المسارات المقيّدة بوحدة، التي كانت ما زالت تطلبX-Subdomain. وما زالتX-SiteوX-Subdomainتعملان. انظر تعريف موقعك.
رموز الأخطاء
| الرمز | الحالة | المعنى | Meaning |
|---|---|---|---|
VISITOR_TOKEN_REQUIRED | 401 | استُدعي مسار يتطلّب تسجيل الدخول (ومنه الآن POST /public/owner-listings) بلا رمز. | A signed-in route was called with no token. |
VISITOR_SESSION_EXPIRED | 401 | أُلغي الرمز بتسجيل الخروج أو تغيير كلمة المرور أو استعادتها أو حذف الحساب. | The token was revoked by logout, a password change or reset, or account deletion. |
VISITOR_DISABLED | 403 | عطّل فريق العمل الحساب. | Staff disabled the account. |
VISITOR_EMAIL_NOT_VERIFIED | 401 | تسجيل دخول قبل تأكيد البريد؛ ويأتي details.visitorId. | Sign-in before the email is verified; details.visitorId is set. |
RESEND_TOO_SOON | 429 | إعادة إرسال الرمز خلال مهلة الانتظار؛ انتظر details.retryAfterSeconds. | resend-otp inside the cooldown; wait details.retryAfterSeconds. |
RESET_TOKEN_INVALID | 400 | رمز الاستعادة مشوّه أو بالصيغة القديمة أو مستخدم أو منتهٍ. | The reset token is malformed, old-format, used or expired. |
PHOTOS_TOO_FEW | 400 | إرسال عرض بأقل من خمس صور؛ ويأتي details: { min, count }. | Submitting a listing with fewer than five photos; details: { min, count }. |
MODULE_NOT_ENABLED | 403 | المؤسّسة لا تملك realestate.secondary، فعروض المُلّاك مغلقة. | The organization does not have realestate.secondary, so owner listings are closed. |
١٤ سبتمبر ٢٠٢٦
أُضيف
X-Site— تعريف الموقع بمفتاحه بدل تعريفه بمؤسّسته. صار بإمكان المؤسّسة أن تدير عدّة مواقع عامّة (عقارات، إقامات، ملف شركة)، وصار الطلب يعرّف موقعًا لا مستأجرًا فقط. والنطاق المُضاف يعرّف الموقع بلا ترويسة أصلًا. انظر تعريف موقعك.X-Api-Key— مفاتيح قابلة للنشر (pk_…) وسرّية (sk_…) لكل موقع، تُنشأ في النظام من الإعدادات ← المواقع ← اربط موقعك. المفتاح القابل للنشر لا يصلح إلا من نطاقات الموقع نفسه، والسرّي لخادمك وله خمسة أضعاف حدود المعدّل. والحالة الآن وضع المراقبة: يُخدَم النداء بلا مفتاح ويُسجَّل الرفض. وسيُعلن الإلزام هنا قبل تشغيله. انظر المفاتيح وCORS.X-Turnstile-Token— رمز Cloudflare Turnstile على عمليات الكتابة الخمس التي يستغلّها الروبوتات: العملاء المحتملون وطلبات المعاينة وتسجيل الزائر واستعادة كلمة المرور والنشرة البريدية. مطلوب مع المفتاح القابل للنشر، ومتجاوَز مع السرّي، ومعطّل حيث لا Turnstile مضبوط للموقع. انظر الحماية من الروبوتات.GET /public-openapi.json— وثيقة OpenAPI 3 قابلة للقراءة آليًّا تحتوي/api/public/*وحدها، وفيها الترويسات أعلاه معلنة على كل عملية. وهي مصدر مرجع الواجهة في هذه الوثائق، وهي ما تُوجّه إليه مولّد عميل.- النصوص القانونية في ملف الشركة — تصل
legal.privacyوlegal.termsنصًّا منسّقًا بصيغة{ en, ar }بجوارprivacyUrlوtermsUrlالقائمين. صار بإمكان الموقع أن يرسم صفحتَي/privacy-policyو/termsمن النظام بدل تثبيت النصّ في الكود: إن كان الرابط مضبوطًا فحوِّل إليه، وإلّا فاعرض النصّ إن وُجد، وإلّا فاعرض صفحتك الثابتة. - أخطاء التحقّق في المعاينات —
VIEWING_SLOT_INVALIDوVIEWING_DAY_CLOSEDوVIEWING_SLOT_TOO_SOON(400) وVIEWING_SLOT_TAKEN(409). صار الحجز يحترم أيام عمل الموقع وقائمة مواعيده ومنطقته الزمنية ومهلة الإشعار الدنيا، ولا يحمل الموعد الواحد إلا طلبًا حيًّا واحدًا. وقبل ذلك كان الحجز خارج القواعد يُقبل وكان بإمكان زائرَين أخذ الموعد نفسه. انظر الأخطاء.
هُجر
X-Subdomain— ما زالت محترمة وما زالت تعرّف الموقع الافتراضي للمؤسّسة، فتبقى المواقع القائمة تعمل كما هي. لكنها لا تستطيع تسمية موقع بعينه من عدّة مواقع، ولهذا حلّتX-Siteمحلّها. تاريخ الحذف: سيُعلن هنا مع مهلة، بعد انتقال المواقع الحيّة. والانتقال سطر واحد: أرسلX-Site: <مفتاح الموقع>(من تبويب «اربط موقعك») بدلًا منX-Subdomainأو إلى جانبها.
أُزيل
/api/public/promotion/*— اختفى مسار «روّج وحدتك» للمُلّاك وخططه من الواجهة ومن النظام. ولا بديل له. والموقع الذي ما زال ينادي تلك المسارات يحصل على404؛ احذف النداءات وأي واجهة كانت تعرض الترويج.