- مقدمة
- العرض
- MVP
- خارطة الطريق
- متطلبات المنتج
- ابدأ الآن
- البيئة المحلية
- البنية المعمارية
- الهيكل
- الأنماط
- الحزمة التقنية
- قاعدة البيانات
- تعدّد المستأجرين
- الفهرس (Catalog)
- العمل دون اتصال
- المصادقة
- التهيئة (Onboarding)
- تدفق التكامل (Integration Flow)
- التهيئة (Provision)
- القبول
- الحضور
- الامتثال التنظيمي
- الملف الشخصي
- الاجتماعات
- إدارة الرسوم
- الفاتورة
- التدويل
- الترجمة
- دليل الترجمة
- أمان قاعدة البيانات
- المساهمة
- هَوْغوارتس
- عرض حي
- الإلهام
Hogwarts منصة SaaS متعدّدة المستأجرين — قاعدة بيانات واحدة تخدم كل المدارس. أمر DROP TABLE أو TRUNCATE شارد، أو migration بلا مراجعة، يمسح بيانات كل المستأجرين. الحماية متعدّدة الطبقات.
الآليات الفعّالة
| الطبقة | الآلية | ما تحظره |
|---|---|---|
| PreToolUse hook | Grep على كل أمر Bash | migrate reset, db execute, accept-data-loss, DROP TABLE, TRUNCATE, DELETE FROM, ALTER TABLE...DROP |
| قائمة منع الأذونات | منع صلب في settings.json | pnpm db:seed, prisma migrate reset, prisma db push --accept-data-loss, prisma db execute |
| فحص seed قبل الـcommit | يفحص ملفات seed المُجَهَّزة | deleteMany, .delete(), TRUNCATE, DROP, $executeRaw |
ensure-demo.ts | سكربت بناء idempotent | آمن للتكرار |
علامة global في single.ts | تتجاوز حلّ المدرسة لـseeds عامة | فشل عندما يكون جدول schools فارغاً |
نظام الـseed
Seeds مقسومة إلى عامة ومُحدَّدة بالمدرسة في prisma/seeds/single.ts.
عامة (global: true) — تملأ بيانات مرجعية على مستوى المنصة:
| Seed | الوصف |
|---|---|
catalog | الكتالوج العام (مواد، فصول، دروس) |
us | كتالوج US K-12 من مخزون US |
school | المدرسة التجريبية + علامتها |
مُحدَّدة بالمدرسة — تتطلب وجود المدرسة التجريبية (طلاب، مدرّسون، فصول، حضور، وما إلى ذلك).
pnpm db:seed:single --list # عرض كل الـseeds
pnpm db:seed:single catalog # seed عام (يعمل على DB فارغة)
pnpm db:seed:single subjects # seed مُحدَّد بالمدرسة (يتطلب التجريبية)
pnpm db:seed # محظور — راجع أدناهلماذا pnpm db:seed محظور
الـseed الكامل يشغّل كل معيار بالتسلسل ويأخذ 45–120 دقيقة. محظور لأن: بطيء ودائماً ينتهي بـtimeout في CI، يعيد seed الأساسات مع خطر التكرار، وseed المعيار الواحد يكفي دائماً للتطوير. شغّله يدوياً خارج Claude Code فقط لو احتجت فعلاً إعادة تعيين كاملة. الحظر مفروض تلقائياً عبر hook حسب القاعدة رقم 8 في CLAUDE.md.
Neon branch-before-touch
قبل أي تغيير في schema أو عملية قد تؤثر على البيانات الموجودة:
- أنشئ Neon branch (Neon MCP
create_branch). - اختبر العملية على الـbranch.
- لو نجحت → طبّقها على main.
- لو فشلت → احذف الـbranch — صفر ضرر.
neon branches create --name "test-migration"
prisma migrate dev --create-only
cat prisma/migrations/<timestamp>/migration.sql # راجع SQL
# لو آمنة → طبّق على main. وإلا → neon branches delete "test-migration"مرجع الأوامر
آمنة (مسموحة دائماً)
| الأمر | الغرض |
|---|---|
prisma generate | إعادة توليد Prisma client من الـschema |
prisma db push | مزامنة الـschema (بدون --accept-data-loss) |
prisma migrate dev --create-only | توليد SQL الـmigration للمراجعة |
pnpm db:seed:single <name> | seed معيار واحد |
pnpm db:seed:single --list | عرض الـseeds المتاحة |
محظورة
| الأمر | السبب |
|---|---|
pnpm db:seed | بطيء، خطر على كامل DB |
prisma migrate reset | يُسقط كامل قاعدة البيانات |
prisma db push --accept-data-loss | يُسقط الجداول مع البيانات |
prisma db execute | SQL خام |
DROP TABLE / TRUNCATE | يدمّر البيانات |
DELETE FROM | حذف صفوف بالجملة |
ALTER TABLE...DROP | إسقاط أعمدة |
اسأل أولاً
| الأمر | متى |
|---|---|
prisma migrate dev | إنشاء + تطبيق migration (راجع SQL أولاً) |
ALTER TABLE...ADD COLUMN | إضافة الأعمدة آمنة لكن أكّد الـschema |
الاسترداد
Schema غير متزامن — prisma db push. يضيف الجداول/الأعمدة الناقصة بدون إسقاط البيانات.
جداول ناقصة —
prisma db push
pnpm db:seed:single school
pnpm db:seed:single authتحتاج عموداً — اكتب SQL مستهدفاً:
ALTER TABLE "YourTable" ADD COLUMN IF NOT EXISTS "newColumn" TEXT;فقدان بيانات عرضي — لو كان هناك Neon branch قبل العملية، استرجع منه. وإلا تواصل مع الفريق للاسترجاع من نسخ Neon الاحتياطية التلقائية.