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

Control Panel Specifications

PDF Storage (Azure)

Azure Blob path structure, versioning (last 5), SAS signed URLs (1h public, 30d Admin), virus scanning, hotlink protection.

مكتمل

كل PDFs الـ Founder Files مخزَّنة في Azure Blob Storage تحت بنية مسار حتمية. خطوة الرفع في الـ CP تسلّم الملف لـ endpoint على السيرفر يكتب على Azure ويرجع رابط الـ blob + الميتاداتا المحسوبة.

بنية المسار

الـ Container: `founder-files`. مجلّد لكل ملف: `{slug}/`. ملف لكل لغة: `{lang}/v{N}.pdf` حيث lang ∈ {en, ar, fr} و N هو رقم النسخة (1-based).

مثال: `founder-files/before-you-ask-for-funding/en/v3.pdf`. صورة الغلاف: `founder-files/{slug}/cover.jpg`.

سياسة النسخ

  • آخر 5 نسخ محفوظة لكل لغة. النسخ الأقدم تُحذف تلقائياً عند الاستبدال السادس.
  • العملاء اللي استلموا نسخة قديمة يحتفظون بمرجع لها؛ لو المستخدم حمّل من جديد لاحقاً يحصل على `vN` الحالية.
  • تبويب "History" في الـ CP لكل ملف يدرج كل النسخ المحفوظة مع الحجم، عدد الصفحات، الرافِع، والتاريخ.

التحكّم في الوصول

  • الـ blobs المخزَّنة خاصّة — لا يُصل لها مباشرة عبر URL عامّ.
  • تدفّق التحميل العامّ يُولِّد URL موقَّع قصير العمر (SAS token، TTL = ساعة واحدة) لكل طلب تحميل.
  • معاينات الـ Admin CP تستخدم SAS أطول عمراً (TTL = 30 يوم، يُجدَّد تلقائياً) لجزء المعاينة في صفحة التعديل.
  • الـ Hotlinking مستحيل — الـ SAS تنتهي قبل أن تتمكّن المواقع المرآة من فهرسته.

قيود الرفع

  • الحد الأقصى: 50 MB لكل PDF. الملفات الأكبر تُرفض من الـ client قبل بدء الرفع.
  • تحقّق MIME: `application/pdf` فقط. السيرفر يعيد التحقّق بعد الرفع (دفاع متعدّد الطبقات).
  • فحص الفيروسات: كل رفع يُفحَص بـ Azure Defender قبل أن يصبح متاحاً للـ CP.
  • الرفع الفاشل (حجم، MIME، فيروس): المستخدم يرى خطأ محدّد، الـ blob لا يُحفَظ.