# نموذج المستخدمين وملكية السجلات

يطبق النظام نموذج **عزل منطقي للبيانات**: كل سجل طالب يرتبط بحساب مستخدم واحد عبر `ownerId`، ولا تعرض واجهة أو واجهات الخادم سجلاً لحساب آخر. هذا النموذج مناسب لقاعدة MySQL واحدة على لابتوب أو خادم واحد، ويحقق حدود ملكية واضحة بين المستخدمين.

> هذا ليس نظام قواعد بيانات موزعاً مادياً بين خوادم متعددة. إنه تطبيق لمفهوم **تقسيم البيانات حسب المالك** داخل قاعدة مركزية. التحويل إلى DDBMS حقيقي لاحقاً يتطلب عقد قواعد بيانات مستقلة، وتوجيه طلبات لكل عقدة، وآلية نسخ وتزامن للبيانات.

| الدور | ما يستطيع عمله | ما لا يستطيع رؤيته |
|---|---|---|
| المدير (`admin`) | إنشاء حسابات المدير أو المحرر، وإيقاف المحررين وإعادة تعيين كلمات مرورهم، وإدارة سجلاته وفتح تقريره المفلتر بالتاريخ | أرقام سجلات المستخدمين الآخرين وتفاصيل تقاريرهم |
| المحرر (`editor`) | إضافة سجلاته والبحث فيها واستيرادها وتعديلها وحذفها | أي سجل أو تقرير يخص مستخدماً آخر، وأي تقرير PDF |

## قواعد الحماية

يجب أن تكون جميع العمليات، بما فيها البحث برقم الجلوس والاستيراد والتقرير، مبنية على `ownerId` المأخوذ من جلسة المستخدم لا من أي قيمة يرسلها المتصفح. لا يقبل الخادم تعديل مالك السجل من الواجهة.

فرضت قاعدة البيانات أيضاً أن `ownerId` **غير فارغ**، وأضيف القيد المرجعي `student_records.ownerId → users.id` بمنع حذف حساب يملك سجلات. لذلك لا يمكن حفظ سجل بلا مالك أو ربطه بحساب غير موجود حتى خارج طبقة التطبيق.

يبقى رقم الجلوس ورقم الاستمارة البنكية **فريدين على مستوى قاعدة البيانات كلها**. عندما يحاول مستخدم إدخال رقم موجود، يعيد النظام رسالة عامة عن وجود رقم مستخدم دون كشف اسم المستخدم أو بيانات سجله.

## ترحيل السجلات الحالية

تعطى السجلات الموجودة قبل هذا التحديث لحساب المدير المحلي الحالي. بعد الترحيل، لا يمكن لحساب مستخدم عادي الوصول إليها إلا إذا أنشأها هو مستقبلاً ضمن حسابه.
