STUDYNEXUS
منصة لم يمتلكها أي طالب في HsH.
بنيتها طالب احتاجها.
Chapter I: The Origin
من إحباط حقيقي إلى منتج حقيقي.
تنظيم الدراسة فوضى حقيقية
كل طالب في HS Hannover يعرف هذا: QIS للدرجات، Moodle للمواد، Excel لتتبع ECTS، دفتر لمواعيد الامتحانات — وبعد كل هذا تضيع الخيوط. لا أداة تتحدث بلغة الطالب. لا واحدة تعرف اللوائح الأكاديمية. ولا واحدة تحسب المعدل تلقائياً.
هذه ليست مشكلة راحة — إنها خلل في النظام. وأخطاء النظام تستحق حلولاً منهجية.
- لا مرجع مركزي لمتابعة تقدم الدراسة
- تتبع ECTS يدوياً في Excel
- مواعيد الامتحانات موزعة على أنظمة متعددة
- حساب المعدل التراكمي يدوياً بالآلة الحاسبة
- اكتشاف التعارضات في الجدول فقط داخل قاعة المحاضرات
# Aktuelle Realität an der HsH
# Die StudyNexus Lösung
[✓] backend started on :8000
[✓] postgres ready — migrations applied
[READY] StudyNexus is running.
Platform Scope
نظام تشغيل لدراستك.
StudyNexus ليس تطبيق مهام آخر. إنه نظام تشغيل دراسي متكامل — مُصمَّم خصيصاً لـ HS Hannover. المنصة تعرف اللوائح الأكاديمية الفعلية، وتحسب GPA مُرجَّح بالـ ECTS، وتكشف تعارضات الجدول تلقائياً.
الوصول حصري عمداً: فقط عناوين @stud.hs-hannover.de مقبولة. لا ضجيج، لا حسابات وهمية — مجتمع طلابي حقيقي.
رغم أن المشروع لا يزال في تطوير نشط، MVP كامل full-stack يعمل بالفعل: مصادقة مع تحقق البريد الإلكتروني، خطة دراسية مع حساب GPA تلقائي، Kanban Board مع Drag & Drop، جدول دراسي مع كشف التعارضات وخطة دراسية مرئية.
200+
الملفات المصدرية
(Frontend + Backend)
17
هجرات
Alembic
22+
سجلات قرارات
المعمارية (ADRs)
122
اختبارات Backend
كلها ناجحة
37
وحدات BIN
مُعبَّأة بالكامل
5
خدمات Docker
(Compose Stack)
Chapter II: System Architecture
خمسة containers. منصة واحدة متماسكة.
Frontend & Backend. مستودع واحد.
StudyNexus مبني كـ monorepo — الـ frontend (Next.js) والـ backend (FastAPI) في نفس المستودع، يتشاركان سجل الـ commits وينشران معاً. هذا يُلغي التبديل بين السياقات ويُبقي API contracts متسقة.
كل تغيير في API contract يظهر فوراً في الـ frontend. لا تفاوت بين مستودعين.
مسار الطلب
كل تعديل في الـ frontend يمر عبر pipeline آمن: Next.js API Routes تُوكّل جميع الطلبات للـ FastAPI backend. هذا يُلغي مشاكل CORS ويُخفي عنوان الـ backend بالكامل. الـ backend يتحقق بـ Pydantic، يفحص JWT، ثم يكتب في PostgreSQL.
Docker Compose: خمسة Services
كامل البنية التحتية تنطلق بأمر واحد. في الإنتاج، نفس الـ containers تُنشر — لا «يعمل عندي فقط».
PostgreSQL وRedis لهما فحوصات صحة. الـ backend لا يبدأ إلا بعد جهوزية قاعدة البيانات.
✓ redis healthy (redis:7-alpine)
✓ backend started → :8000
✓ frontend started → :3000
✓ adminer started → :8080
Chapter III: Engineering Decisions
أكثر من 22 سجل قرار معماري. هذه هي الأكثر تأثيراً.
قرارات المعمارية يجب توثيقها — ليس فقط ما قُرِّر، بل لماذا وأي بدائل رُفضت. لدى StudyNexus أكثر من 22 ADR. هذه هي التي شكّلت النظام أكثر.
FastAPI بدلاً من Django
Django هو إطار Python «الآمن». FastAPI هو الصحيح لهذه الحالة: دعم async أصيل، Pydantic v2 مباشرة في الـ schema، توثيق OpenAPI تلقائي على /api/docs — ومعمارية جاهزة للتوسع بالذكاء الاصطناعي.
httpOnly Cookies بدلاً من localStorage
تخزين JWT في localStorage ثغرة XSS كلاسيكية: أي سكريبت مُحقَن يستطيع قراءة localStorage. httpOnly cookies غير مرئية لـ JavaScript أساساً. المتصفح يرسلها تلقائياً — لا سكريبت يستطيع سرقتها.
bcrypt مباشرة — بدون passlib
passlib غير مُصانة فعلياً. آخر إصدار 2022، مشاكل توافق معروفة مع Python 3.13+. استخدام bcrypt 4.1.3 مباشرة أكثر أماناً وأنظف ومستدام — بدون طبقة تجريد قد تنكسر غداً.
CSRF عبر Custom Header
إدارة CSRF token الكلاسيكية تحتاج server state. عوضاً عن ذلك، كل طلب تعديل يحمل الـ header x-studynexus-client: true. المتصفحات لا تسمح لطلبات Cross-Origin بتعيين custom headers بدون CORS preflight — هذه هي الحماية. Stateless، بسيط، فعّال.
استراتيجية HsH-Only
تقييد الوصول لـ @stud.hs-hannover.de ليس قيداً — إنه قرار تصميم. بدلاً من منصة عامة لجميع الجامعات: نظام متكامل بعمق لجامعة واحدة. لوائح الامتحانات مُدمَجة. هيكل المواد حقيقي.
Redis لرموز جلسة المشرف
لا يمكن إلغاء صلاحية JWT من جانب الخادم. لعمليات المشرف (حذف، أرشفة، إعادة تعيين) نحتاج رمزاً يمكن إلغاؤه فوراً. Redis بـ TTL 15 دقيقة — مفهوم sudo للويب.
is_admin في حمولة JWT
تعمل Next.js Middleware في Edge Runtime — لا يمكن الوصول إلى قاعدة البيانات. وضع is_admin: true في JWT مباشرةً يُتيح حراسة مسارات المشرف بدون استعلامات DB وبدون تأخير.
Chapter IV: Feature Deep-Dive
ما تستطيع المنصة فعله اليوم.
القلب النابض: Mission Control Dashboard
أول ما تراه بعد تسجيل الدخول. الـ dashboard يجمع كل المهم في الوقت الحقيقي: حالة GPA، تقدم ECTS، الامتحانات القادمة وأحداث اليوم — محسوبة مباشرة من قاعدة البيانات، بلا caching.
كل widget وظيفي. عداد الامتحان ينبض بالأحمر حين تكون المدة أقل من 14 يوماً. التركيز اليومي يتحول تلقائياً لـ «غداً» بعد الساعة 8 مساءً.
- متتبع GPA مع حساب لحظي مُرجَّح بالـ ECTS
- عداد تنازلي للامتحانات مع أنيميشن نبضي (أقل من 14 يوماً = أحمر)
- التركيز اليومي: أحداث اليوم، تبديل تلقائي بعد 8 مساءً
- Timeline ذكي: ترتيب حسب الأولوية وتاريخ الاستحقاق
Kanban Board مع Drag & Drop حقيقي
ليس localStorage ولا useState tricks — @dnd-kit v6 كأساس. أربعة أعمدة: To Do وIn Progress وExam Ready وDone. للمهام أولويات، يمكن ربطها بمواد وتحمل علامة تسليم.
ترتيب قائم على الموضع: كل عملية Drag-Drop تُكتب فوراً في قاعدة البيانات. إعادة تحميل الصفحة لا تغيّر شيئاً — الـ board محفوظ بالكامل.
محرك CSS Grid بدقة 15 دقيقة
الجدول الدراسي ليس جدولاً — إنه CSS Grid حقيقي بدقة 15 دقيقة من 8 صباحاً حتى 8 مساءً. الأحداث تتموضع بدقة البكسل. خط أحمر يُظهر الوقت الحالي في الوقت الفعلي. التعارضات تُكشَف وتُرجَع بـ HTTP 409.
10 أنواع أحداث: LECTURE, EXERCISE, TUTORIAL, SEMINAR, PRACTICUM, CUSTOM_STUDY, FOCUS, EXAM, WORK, LIFE. الربط بالفصل الدراسي يمنع فقدان البيانات عند الانتقال. وضع Ghosting يُخفي الأحداث مؤقتاً دون حذفها.
الخطة الدراسية المرئية
مواد في أعمدة قائمة على الفصول الدراسية. Drag & Drop بين الفصول، حساب ECTS تلقائي لكل عمود، ترميز لوني حسب نوع المادة. البيانات مأخوذة من لوائح الامتحانات الفعلية لـ HsH — لا بيانات تجريبية.
- الوحدات الإلزامية تُحمَّل تلقائياً
- الوحدات الاختيارية والتكميلية قابلة للإضافة يدوياً
- سحب وإفلات بين الفصول الدراسية عبر @dnd-kit
- مجموع ECTS لكل عمود يُحسَب في الوقت الفعلي
MilestoneWidget — مراقبة §6 من لوائح الامتحانات مباشرةً
يضم لوح التحكم أداة جانبية جديدة تُقيِّم لائحة امتحانات BIN §6 في الوقت الفعلي: أيّ فصول اكتملت؟ هل تم اجتياز الامتحان التمهيدي؟
- Sem 1 complete: alle 6 Module BIN-100..116
- الامتحان التمهيدي: اجتياز جميع وحدات الفصول 1-3 الـ 17
- القبول في البكالوريوس: الامتحان التمهيدي + ≥ 134 ECTS
- شريط تقدم مباشر لكل معلم
مشرف المؤسسة — 14 صفحة، 35+ نقطة وصول
مركز تحكم مشرف كامل: إدارة المستخدمين، إدارة لوائح الامتحانات، لوحة تحليلات، سجل مراجعة واستيراد JSON — تم تسليمه بالكامل في يومين.
لوائح الدراسة في لمحة
صفحة لوح تحكم مخصصة تعرض جميع قواعد اللائحة ذات الصلة: قواعد القبول §6، سلم الدرجات §10، قواعد الإعادة §11 — مع شارات حالة مباشرة من قاعدة البيانات.
- Programm-aware: erkennt BIN via API-Response
- أنواع الامتحانات PX / EA / R / BAA+Ko مُرمَّزة بالألوان
- القبول في البكالوريوس: شريط تقدم ECTS مباشر
- بدون بيانات مُضمَّنة — الـ Sprint 7 سيضيف لوائح إضافية
Chapter V: لوائح امتحانات BIN
3 PDFs. 37 مادة. جميع قواعد §6 مُطبَّقة تلقائياً.
مبني من وثائق حقيقية
لا توجد بيانات وهمية. تم استخراج جميع وحدات BIN الـ 37 مباشرةً من ثلاثة وثائق رسمية لـ HsH وإدخالها في قاعدة البيانات.
- §5 — Modulstruktur Abschnitt 1 + 2
- §6 — قواعد القبول والمتطلبات
- الملحق B1/B2 — قوائم الوحدات الكاملة
- §7 — Prüfungsarten (PX, EA, R, BAA+Ko)
- §10 — 11 درجة رسمية لـ HsH
- §11 — قواعد الإعادة (حتى 3 محاولات)
- ساعات الدراسة الأسبوعية لكل وحدة (SWS)
- نوع الامتحان لكل وحدة
- 37 وصفاً كاملاً للوحدات
أربعة أنواع. مباشرةً من ATPO-FIV §7.
كل وحدة من وحدات BIN الـ 37 تحمل نوع الامتحان الرسمي من دليل الوحدات — محفوظ في قاعدة البيانات، مُرمَّز بالألوان في الواجهة.
يضمن التحقق عبر Pydantic إدخال الدرجات الـ 11 الرسمية لـ HsH فقط. HTTP 422 عند درجة غير صالحة.
§6 قواعد القبول — مُطبَّقة بالكامل
التقدم الدراسي وفق §6 — مباشر
GET /me/stats يوفر 8 حقول جديدة. تُقيِّمها أداة لوح التحكم في الوقت الفعلي. بدون polling — يُحسَب الحالة عند تحميل الصفحة.
Chapter VI: Security by Design
الأمن ليس لاحقة. الأمن هو المعمارية.
CSRF Stateless عبر Custom Header
كل طلب تعديل (POST, PUT, DELETE, PATCH) يحمل الـ custom header x-studynexus-client: true. طلبات Cross-Origin لا تستطيع تعيين custom headers بدون CORS preflight. بالدمج مع فحص Origin header، يتشكل حماية CSRF كاملة — بدون أي تخزين للـ tokens.
JWT في httpOnly Cookies
JWT token يعيش حصراً في httpOnly cookie مع Secure وSameSite=Lax. JavaScript لا تستطيع قراءة هذا الـ cookie. المتصفح يرسله تلقائياً — لا إدارة token يدوية في الـ frontend.
HttpOnly; Secure; SameSite=Lax
Path=/; Max-Age=604800 (7d)
التحقق برمز 6 أرقام
بعد التسجيل، يتلقى الطالب بريداً إلكترونياً برمز مكون من 6 أرقام عبر Resend API. الرمز ينتهي بعد 15 دقيقة. الحساب لا يُفعَّل إلا بعد التحقق — وفقط عناوين @stud.hs-hannover.de مقبولة.
عزل البيانات على مستوى الصف
كل استعلام قاعدة بيانات يُفلتَر بـ user_id. لا طالب يستطيع رؤية بيانات طالب آخر، حتى لو عرف الـ UUID. لا نظام صلاحيات منفصل — نموذج ORM يُطبِّق العزل هيكلياً.
.filter(Task.user_id == current_user.id)
.all()
مفهوم Sudo: القراءة مقابل الحذف
رمز JWT للمشرف المسروق وحده لا يستطيع إحداث ضرر. العمليات المدمِّرة تتطلب عاملاً ثانياً — رمز Redis قصير العمر يُصدَر عبر إعادة التحقق بكلمة المرور.
فحص المشرف عبر JWT
is_admin: true في حمولة JWT (ADR-021). متوافق مع Edge Runtime — بدون استعلام DB، بدون تأخير. كافٍ لجميع عمليات المشرف القرائية.
رمز جلسة Redis (Sudo)
يُدخل المشرف كلمة المرور من جديد → رمز Redis بـ TTL 15 دقيقة. هذا الرمز وحده يُفتح العمليات المدمِّرة. قابل للإلغاء فوراً — بدون انتظار انتهاء JWT.
Chapter VII: Admin Panel
مركز تحكم على مستوى المؤسسات. مُخطَّط لأسبوع. سُلِّم في يومين.
ما يستطيع لوحة المشرف فعله
لوحة التحكم والـ KPI
استجابة KPI بـ 13 حقلاً، مخطط نمو (Recharts LineChart، 7d/30d/90d/1y)، تقسيم المستخدمين، حجم DB عبر pg_database_size().
وصول كامل للمستخدمين
قائمة مُقسَّمة (25/صفحة)، 5 تبويبات تصفية، بحث عبر البريد الإلكتروني والاسم، PATCH لجميع الحقول، إعادة تعيين كلمة المرور، حذف دائم مع إلزامية الإفادة بالسبب.
الجامعة → الوحدة → الشرط
6 ملفات موجِّه، ~30 نقطة وصول. حذف ناعم للوائح/الوحدات (حماية البيانات الموجودة)، حذف دائم للجامعات/الكليات.
شامل منذ المرحلة 2
كل تعديل للمشرف مُسجَّل منذ اليوم الأول. تصميم timeline، ActionBadge بـ 8 ألوان، DiffBlock (مقارنة القديم بالجديد، خط شطب للقيم المحذوفة).
استيراد JSON جماعي حتى 500 وحدة
تحقق → معاينة (أول 10) → POST → النتيجة. إجراء idempotent عبر البحث بالاختصار ضمن اللائحة. PDF placeholder للـ Sprint 7 (ML/NLP).
حالة النظام في الوقت الفعلي
شارة إجمالية (ok/degraded/down)، ServiceBadge لكل خدمة (DB ping + Redis.ping)، نسخة DB + الحجم، تحديث تلقائي كل 60 ثانية.
AdminDataTable — مكون واحد لجميع القوائم
بدلاً من 6 تطبيقات جداول منفصلة: مكون TypeScript عام واحد. فرز الأعمدة، بحث مؤجَّل (350ms)، ترقيم من الخادم، إخفاء على الجوال للعمود — كل شيء قابل للتهيئة عبر Props.
22 واجهة TypeScript جديدة، 11 ربط TanStack Query جديد، adminFetch.ts كـ wrapper رفيع: بدون fetch() مباشر، منطق headers مركزي، معالجة 204.
Chapter VIII: Database Architecture
12+ جدول. 17 Alembic migration. هيكل جامعي كامل.
من الجامعة إلى المادة الواحدة
نموذج البيانات يُجسِّد الهيكل الحقيقي للجامعة. الطالب يختار لائحة امتحانات — النظام يحمّل تلقائياً جميع المواد الإلزامية في خطته الدراسية الشخصية.
9 نماذج SQLAlchemy مع foreign key constraints كاملة ومفاتيح UUID أساسية. ENUMs أصيلة في PostgreSQL للحالة والأولوية ونوع الحدث.
درجة مُرجَّحة — كما في الجامعات الحقيقية
لا يُحسَب GPA بالمتوسط البسيط. كل مادة لها وزن قائم على ECTS. فقط المواد الناجحة المُقيَّمة تدخل في الحساب. النتيجة: GPA يعكس اللوائح الأكاديمية فعلاً.
17 Alembic Migration — كل خطوة مُصنَّفة
لا تعديلات SQL يدوية — كل تغيير في الـ schema مُصنَّف وقابل للعكس ومُنتَج على أي بيئة. Sprint 4 (0012–0014) أضاف بيانات BIN-PO. Sprint 5 (0015–0017) سلّم البنية التحتية للإدارة.
الـ Sprints 1-3 وضعت الأساس (0001-0011). الـ Sprint 4 أضاف بيانات لوائح BIN (0012-0014). الـ Sprint 5 قدَّم البنية التحتية للمشرف (0015-0017).
Chapter IX: Sprint-Roadmap
أين يقف المشروع. إلى أين يتجه.
Foundation: Auth, DB & Docker
JWT Authentication, PostgreSQL-Schema mit Alembic, Docker Compose Stack mit 5 Services, Email-Verifikation via Resend API, vollständige Studienplan-CRUD mit GPA-Berechnung.
Mission Control & Mobile
Kanban Board (@dnd-kit), Schedule Board (15-Min CSS Grid), Dashboard Widgets, Mobile FAB, Agenda View für kleine Screens, TanStack Query Migration, vollständige i18n (DE/EN).
BIN Prüfungsordnung Integration
37 BIN-Module aus 3 PDFs, Prüfungsart-System (PX/EA/R/BAA+Ko), §6-Voraussetzungen als DB-Constraints, MilestoneWidget, PO-Übersicht-Seite, GPA-Fix BIN-209.
Admin Panel — Enterprise Control Center
14 Admin-Seiten, 35+ Endpunkte, Two-Layer Auth (JWT + Redis Sudo), Audit-Log, Analytics (Recharts), JSON-Bulk-Import, 122/122 Tests grün.
Security Audit & Email-Templates
Admin-API-Rate-Limiting, Toast-Notifications bei API-Errors, E-Mail-Templates für Passwort-Reset, UI-Polishing und Dropdown-Auswahl für UUID-Felder.
Production Launch für die HsH
Öffentlicher Launch für alle HS Hannover Studierenden. Onboarding-Flow mit vorausgefüllten Prüfungsordnungen. Gamification: XP, Badges, Streaks.
مشروع
في حركة دائمة.
StudyNexus لم يكتمل — وهذا بالضبط المقصود. البرمجيات الحقيقية تعيش. تنمو مع المتطلبات. كل أسبوع sprint. كل sprint ميزة جديدة.