تخطَّ إلى المحتوى الرئيسي

Developer Page Specifications

API Contracts

6 endpoints — listing, summary (landing rails), details, submit (rate-limited + CAPTCHA), .ics generation.

مكتمل

ستّ endpoints: القائمة (مع scope)، الملخّص (شرائط الهبوط)، التفاصيل، التقديم، تَحميل ics (مُتولَّد جانب-الخادم)، و iCal feed عام لكل scope (مُخَطَّط، انظر roadmap).

1 · GET /api/calendar/events — القائمة

  • Query: scope (all|country|category|audience|stage|time)، scopeValue?، country (csv)، category (csv)، audience (csv)، stage (csv)، status، mode (physical|online|hybrid)، sort (start-asc افتراضي|start-desc|deadline-asc|created-desc)، page، pageSize، lang.
  • عناصر الاستجابة: { id، slug، title، shortDescription، status، category {slug، label، iconKey}، country {code، name}، city، mode، startDate، endDate?، applicationDeadline?، registrationDeadline?، organizer {name، logoUrl}، isFeatured، isSpotlight، audiences[]، stages[]، coverImageUrl }.
  • Cache: 60s public + 180s s-maxage (التقويم يُحَدَّث بشكل متكرّر).

2 · GET /api/calendar/summary

  • يُرجع شرائط صفحة-الهبوط: { thisWeek[]، closingSoon[]، spotlight?، countryCounts (عدد فعاليات لكل دولة)، categoryCounts (عدد فعاليات لكل فئة)، totalUpcoming }.
  • Cache: 60s — العَدَّادات يجب أن تَعكس الفعاليات التي تَنقلب إلى closing-soon فوراً.

3 · GET /api/calendar/events/{slug}

  • الاستجابة: CalendarEvent كامل + relatedEntities مُحَلَّة + coverage[] (كل CoverageArticle بـ parentEventId = this.id) + seo.
  • Cache: 300s + 1800s s-maxage. أبطل عند update أو نشر/إلغاء نشر coverage يَلمس هذه الفعالية.

4 · POST /api/calendar/events/submissions

  • الـ Body: حمولة تقديم-فعالية كاملة (انظر حقول النموذج §13.4.2). الخادم يَتحقّق من الحقول المطلوبة + على الأقل URL خارجي واحد + title/short-description bilingual موجودة.
  • الخادم: يَكتب صف CalendarEvent مع verificationStatus=pending، يَكتب صف تدقيق CalendarEventSubmission، يُدرج 2 emails (تأكيد المُقدِّم + تنبيه فرز admin).
  • حد المعدّل: 3 تقديمات/IP/يوم. 429 عند ضرب الحد. CAPTCHA مطلوب لـ IP بـ ≥2 تقديم/يوم.
  • الاستجابة: 201 { submissionId، eventId، status: 'pending' }.

5 · GET /api/calendar/events/{slug}/ics

  • يُرجع text/calendar VEVENT. Cache 300s. اسم الملف: {slug}.ics. يُطلق حدث تحليلات calendar_ics_download عند فَتح أو نقر العميل.