MoonStack — إصلاح ثغرة الـ Seeder في التحديث

الخطة · 2026-06-17 · للمراجعة قبل التنفيذ — بتعدّل مسار تحديث كل العملاء (حسّاس)

1) المشكلة bug

التحديث بيشغّل migrate بس مابيشغّلش seeders. تعريفات الإعدادات (setting definitions) بتتزرع عبر SettingDefinitionSeeder وLabSettingDefinitionSeeder (مش migrations) — فالتعريفات الجديدة: النتيجة: SettingsService::get() بيرجّع null لأي مفتاح ملوش definition، وشاشة الإعدادات مابتعرضوش.
الدليل: المدينة على 2.2.8 (آخر نسخة) كانت عندها 14 من 53 تعريف LIS فقط.

2) الجذر

الخطوةInstallUpdate
migrate
seed (تعريفات)⚠️ جزئي (ناقص LIS)❌ مفيش خالص

3) الحل 4 أجزاء

1
أضيف LabSettingDefinitionSeeder لـ config('moonstack.installer.seeders') → التركيب الجديد ياخد كل تعريفات LIS.
2
قايمة جديدة config('moonstack.updater.seeders') = seeders التعريفات الـ idempotent فقط (SettingDefinitionSeeder + LabSettingDefinitionSeeder).
3
في public/moonstack-update.php بعد الـ migrate وقبل caches: أشغّلهم best-effort / non-fatal داخل timeout 300 bash -c '…'.
4
Bridge migration بتشغّل نفس الـ seeders → العملاء الحاليين (على الـ updater القديم) يلحقوا التعريفات في أول تحديث، لأن migrate بيشتغل دايمًا.

4) ليه مش هنضيف RolePermissionSeeder مهم

صلاحياته idempotent (firstOrCreateلكنه كمان بيعيد تعيين أدوار لليوزرز (بيدّي owner/employee). تشغيله في كل تحديث ممكن يغيّر أدوار مستخدمين العميل — فمستبعد من القايمة. (لو احتجنا صلاحيات جديدة، نفصل جزء الصلاحيات لوحده لاحقًا.)

5) الأمان — الـ crash-safe محفوظ safe

6) الملفات اللي هتتعدّل

7) خطة الاختبار

8) الإطلاق

commit على lis/lab-updates + سطر في الـ what's-new، وبعد الموافقة release. العملاء ياخدوا الإصلاح في أول تحديث (الجسر يلحّقهم فورًا).
السياق الكامل: knowledge-base/topics/moonstack-update.md