EN
غلاف مشروع IMMAR

IMMAR

IMMAR (إيمار) منصة تعليم إلكتروني متعددة المعلّمين بُنيت لشركة تعليمية في العراق: ينشر المعلّمون دوراتهم داخل مساحات عمل معزولة، ويفتح الطلاب الدورة بكود اشتراك يُستخدم مرة واحدة من تطبيق Flutter ويشاهدون فيديو بعلامة مائية على عدد محدود من الأجهزة المسجّلة، ويدير موظفو المنصة الانضمام والإشراف وتسويات المعلّمين من لوحة ويب واحدة، بالعربية أولًا وبتخطيط من اليمين إلى اليسار. Backend واحد بـ ASP.NET Core (.NET 8) فوق PostgreSQL يخدم التطبيقين. في فريق من مهندسَين، يقود أحمد ذلك الـ Backend، وكتب حزمة التصميم الهندسي التأسيسية، وبنى طبقة API لوحة تحكم React وتوجيهها ولوحة إدارة المنصة فيها؛ بينما يقود زميله تطبيق Flutter وصفحة الهبوط. مشروع عميل مستمر، قيد التطوير منذ يوليو 2026.

المخرجات

واجهة API بـ ASP.NET Core (.NET 8) على نمط Modular Monolith

PostgreSQL / EF Core، 74 جدولًا

منصة مهام Hangfire (17 مهمة)

محوّلات Cloudflare Stream وS3 وFCM والرسائل النصية

طبقة API لوحة التحكم ولوحة إدارة المنصة (React 19)

السنة

2026

الدور في المشروع

قائد الـ Backend

الموقع المباشر

معمارية النظام

كيف بُني

تطبيقات العملاء

تطبيق الطلاب

الطلاب — Android وiOS

Flutter · Dart

مساحة عمل المعلّم

المعلّمون وفرقهم

React 19 · Vite 8 · TypeScript

لوحة إدارة المنصة

المالك والمشرفون والمحاسب والدعم

الـ SPA نفسه، توجيه حسب الدور

صفحة الهبوط

الموقع التسويقي العام

React 19 · Vite · ثابت

مهام خلفية

  • 17 مهمة Hangfire مفهرسة (12 على مستوى المنصة، 5 موزّعة لكل مستأجر)
  • تفريغ صندوق الإشعارات · إعلانات مجدولة
  • مزامنة حالة التحويل · كنس المحاولات المهجورة
  • تجميعات تحليلية ليلية لكل مساحة عمل وللمنصة

IMMAR API — نظام أحادي معياري

ASP.NET Core 8 · C# · EF Core 8 · FluentValidation · JWT

أسطح المسارات

/auth/app/teacher/admin/public/webhooks

الطبقات

  1. 01Api — متحكّمات لكل سطح، بوابات صلاحيات، حدود معدل، غلاف موحّد { data, meta }
  2. 02Application — 88 خدمة، مدقّقات، 86 رمز خطأ ثابتًا (عربي/إنجليزي)، فهرس مهام
  3. 03Domain — 74 كيانًا، عقود مقيّدة بمساحة العمل، مفردات ثابتة
  4. 04Infrastructure — EF Core + Npgsql، مرشّح عزل عام، محوّلات المزوّدين، Hangfire

محوّلات المزوّدين

  • Cloudflare Stream — رفع، webhook للتحويل، تشغيل HLS موقّع
  • تخزين كائنات متوافق مع S3 — رفع وقراءة بروابط موقّعة مسبقًا
  • Firebase Cloud Messaging (HTTP v1) — إشعارات الدفع
  • بوابة رسائل نصية عراقية — إرسال OTP
  • PDFsharp — علامة مائية لكل طالب على ملفات PDF

البيانات

PostgreSQL 15

74 جدولًا، 24 ترحيل EF Core، مرشّح واحد مركّب للعزل والحذف الناعم

تخزين الكائنات

مكتبة الدورة، المرفقات، التسليمات، الصور الشخصية

مخزن Hangfire

سجل تشغيلات المهام ومعالجة dead-letter على PostgreSQL

العزل
مساحة عمل لكل معلّم؛ مرشّح EF عام يُغلق عند الفشل؛ القراءة عبر مساحات العمل تُجاب بـ 404
الهوية
تسجيل برقم الهاتف فقط مع OTP؛ JWT للوصول ورموز تحديث دوّارة مع كشف إعادة الاستخدام
الصلاحيات
60 مفتاح صلاحية، 8 أدوار نظام، أدوار مخصصة لمساحة العمل؛ 286 إجراء محكومًا بالصلاحية
الـ API
63 متحكّمًا · 364 نقطة نهاية HTTP · 6 أسطح مسارات
نموذج البيانات
74 كيان نطاق مربوطة 1:1 بـ 74 جدول PostgreSQL
الوسائط المحمية
HLS مشفّر عبر رموز قصيرة العمر موقّعة محليًا ومربوطة بالمستخدم والجهاز والدرس وعنوان IP؛ ملفات PDF موسومة
المال
أكواد تُستخدم مرة واحدة وتُفعَّل في معاملة واحدة؛ العمولة مجمّدة على كل عملية بيع؛ التسويات مسودة → معتمدة → مدفوعة
الجودة
1,951 حالة اختبار وحدة ناجحة (1,520 دالة) + 91 اختبار تكامل على PostgreSQL
التسليم
GitHub Actions CI، صورة Docker متعددة المراحل، بيئة staging على PaaS؛ فريق من مهندسَين منذ يوليو 2026

طلب واحد من البداية إلى النهاية: طالب يفعّل كود اشتراك

  1. 01يرسل تطبيق Flutter الكود مع ترويسة Idempotency-Key عبر شبكة جوال قد تعيد المحاولة.
  2. 02تعمل سياسة حدّ المعدل الخاصة بالتفعيل وفحص الـ bearer والجهاز قبل أي كود في المتحكّم.
  3. 03تفتح خدمة التطبيق معاملة صريحة واحدة وتقفل صف الكود.
  4. 04يتحوّل الكود إلى مُستخدم، ويُنشأ التسجيل، ويرفض فهرس فريد جزئي أي تكرار متزامن.
  5. 05تُكتب عملية البيع مع نسبة العمولة المحسوبة الآن والمجمّدة عليها — تغييرات النسبة اللاحقة لا تعيد كتابة التاريخ أبدًا.
  6. 06يُزاد عدّاد الدورة وتُلتزم المعاملة؛ الطلب المُعاد يسترجع الاستجابة المخزّنة بدل أن يفشل.
  7. 07بعد الالتزام، تُجدوَل إسناد تحويل العميل المحتمل وصندوق الإشعارات إلى المهام الخلفية.
  8. 08يستلم التطبيق التسجيل ويمكنه فتح الدرس الأول برمز تشغيل جديد.

نظرة على التطبيقات

التطبيقات

مساحة عمل المعلّم

المعلّمون ومساعدوهم: يبنون الدورات، يبيعون الوصول، يديرون الامتحانات، يتابعون الطلاب ويحصلون على تسوياتهم.

React 19 · Vite 8 · TypeScript · TanStack Query · React Hook Form + Zod · i18next (عربي/إنجليزي، RTL أولًا) · Vitest

  • الرئيسية بما يحتاج انتباهك، ثم مساحة الدورة بمسار لكل تبويب
  • منشئ المنهج بسحب وإفلات للفصول والدروس، ومكتبة وسائط برفع مباشر إلى التخزين
  • منشئ التقييمات (أقسام، بنك أسئلة، عشوائية)، وطابور التصحيح وسجل الدرجات
  • الطلاب، العملاء المحتملون، دفعات أكواد الاشتراك ببطاقات قابلة للطباعة، أدوار الفريق وسجل النشاط

لوحة إدارة المنصة

مالك المنصة والمشرفون والمحاسب وفريق الدعم، في الـ SPA نفسه خلف صلاحيات على مستوى المنصة.

الـ React 19 SPA نفسه، تنقّل موجَّه حسب الدور، 3,343 مفتاح ترجمة بتطابق تام عربي/إنجليزي، 57 شاشة موجَّهة

  • مركز القيادة بالمؤشرات وطوابير انضمام المعلّمين ومراجعة الدورات
  • المستخدمون والمعلّمون وأدوار المنصة مع مصفوفة صلاحيات
  • معاملات البيع وتسويات المعلّمين والإيصالات
  • البيانات المرجعية، الإعلانات، الأسئلة الشائعة، الصفحات القانونية، الإعدادات، سجل التدقيق

تطبيق الطلاب

الطلاب على Android وiOS: يفعّلون كودًا، يشاهدون دروسًا محمية، يؤدّون الامتحانات، ويسلّمون الواجبات.

Flutter · Dart · GoRouter · مشغّل HLS · إشعارات FCM · 711 مفتاح ترجمة لكل لغة · 475 اختبارًا

  • تسجيل بالهاتف وOTP، اختيار الجهاز، صفحة رئيسية مرتّبة حسب المستحق
  • تفعيل الكود مع حالة صريحة «نتيجة غير معروفة» للشبكات السيئة
  • دروس فيديو خلف رموز قصيرة العمر مع علامة مائية متحركة لكل طالب
  • امتحانات موقوتة بحفظ تلقائي لكل إجابة، ستة أنواع أسئلة، ومراجعة قبل التسليم

ماذا يفعل

الوحدات

01

الهوية والأجهزة

  • حسابات برقم الهاتف فقط مع تسجيل بـ OTP وتسجيل دخول وإعادة تعيين كلمة المرور
  • تدوير رموز التحديث مع كشف إعادة الاستخدام؛ الإعادة تُلغي العائلة كاملة
  • أجهزة مسجّلة لكل طالب مع تحرير ذاتي للمقاعد
  • ست سياسات مسمّاة لحدّ المعدل مع تقييد OTP لكل وجهة
02

مساحات العمل والأدوار والفريق

  • مساحة عمل معزولة لكل معلّم على قاعدة بيانات واحدة
  • 60 مفتاح صلاحية في نطاقي المعلّم والمنصة، و8 أدوار نظام
  • أدوار مخصصة لمساحة العمل، أعضاء فريق وسجل نشاط
  • مطالبات صلاحيات مؤهَّلة بمساحة العمل داخل الرمز
03

التعلّم

  • مادة ← دورة ← فصل ← درس بتسعة أنواع دروس
  • مكتبة الدورة، مرفقات بإقرار استلام، معاينات مجانية
  • تضمين محاكاة خلف قائمة مضيفين مسموحة
  • دورة حياة النشر والسحب والمراجعة
04

الوسائط المحمية

  • تذاكر رفع Cloudflare Stream ومزامنة التحويل
  • رموز تشغيل HLS موقّعة محليًا ومربوطة بالمستخدم والجهاز والدرس وعنوان IP
  • سلّم الجودة مستخرج من قائمة تشغيل HLS الرئيسية
  • علامة مائية لكل طالب على الفيديو وعلى كل صفحة PDF
05

الأكواد والمبيعات

  • أكواد عشوائية تشفيريًا تُستخدم مرة واحدة بأبجدية بلا التباس، ودفعات ببطاقات QR قابلة للطباعة
  • تفعيل محصّن من التسابق في معاملة واحدة، idempotent تحت إعادة المحاولة
  • أكواد تجديد تمدّد تسجيلًا قائمًا
  • العمولة تُحسب وتُجمّد على كل عملية بيع
06

الامتحانات والواجبات

  • بنك أسئلة، أقسام، قواعد اختيار وعشوائية
  • محاولات على ساعة الخادم فوق ورقة مجمّدة، حفظ تلقائي لكل إجابة
  • تصحيح آلي للأسئلة الموضوعية، طابور تصحيح، معالجة، أوزان سجل الدرجات
  • واجبات بتسليم ملفات وملاحظات المصحّح
07

المالية

  • سجل مبيعات بالإلحاق فقط مع إيصالات وإلغاءات
  • تسويات المعلّمين: مسودة → معتمدة → مدفوعة مع تعديلات موقّعة
  • أرقام إيصالات متسلسلة من قاعدة البيانات
  • عرض إيرادات المعلّم وتقارير معاملات المنصة
08

التواصل

  • 23 نوعًا من أحداث الإشعارات مع تفضيلات وساعات هدوء
  • صندوق إشعارات دفع يُفرَّغ إلى FCM عبر مهمة خلفية
  • إعلانات باستهداف الجمهور وبثّ مجدول
  • خيوط أسئلة على الدروس وطابور عملاء محتملين من الموقع العام
09

إدارة المنصة

  • انضمام المعلّمين والعمولة، طابور مراجعة الدورات
  • بيانات مرجعية: المواد، المراحل، الفروع، و18 محافظة
  • الإعدادات، أعلام الميزات، سجل التدقيق، الأسئلة الشائعة والصفحات القانونية
  • تجميعات تحليلية ليلية ولوحات مؤشرات

قصص هندسية

المشكلات التي تستحق الحكاية

المشكلة

كل معلّم يدير مساحة عمل معزولة لها دوراتها وفريقها وأكواد اشتراكها وإيراداتها، على قاعدة كود واحدة مشتركة وقاعدة بيانات واحدة، فلا بدّ أن يُغلق المرشّح المنسي الوصول بدل أن يكشف بيانات معلّم آخر.

يجب أن يتوقف تسرّب المحتوى: فيديو يُقدَّم بصيغة HLS مشفّرة خلف رموز تشغيل قصيرة العمر لكل مشاهد مع علامة مائية على الشاشة، وملفات PDF موسومة ببيانات الطالب، وكل حساب محدود بعدد قليل من الأجهزة المسجّلة.

يُباع الوصول على شكل أكواد مطبوعة تُستخدم مرة واحدة وتُفعَّل من الهاتف عبر شبكات جوال غير مستقرة، فلا يجوز أن يفتح الكود دورة مرتين ولا أن يضيع بسبب طلب مُعاد، وكل تفعيل مدفوع يجب أن يسجّل عملية بيع مع تجميد العمولة في تلك اللحظة.

الهوية برقم الهاتف فقط مع OTP، والمنتج بالعربية أولًا وبتخطيط من اليمين إلى اليسار والإنجليزية ثانيًا، والقواعد نفسها للامتحانات والأكواد والصلاحيات يجب أن تصمد عبر تطبيق Flutter ولوحة تحكم ويب يتحدثان إلى API واحدة.

الدور والمسؤوليات

قيادة الـ Backend في فريق من مهندسَين: المعمارية الأولية ومعظم الكود، 60 من 63 متحكّم API، و364 نقطة نهاية HTTP عبر 6 أسطح جمهور، و74 كيان نطاق مربوطة 1:1 بـ 74 جدول PostgreSQL، و20 من 24 ترحيل EF Core، ومراجعة 57 من 61 طلب دمج.

الهوية والوصول والعزل: تسجيل برقم الهاتف فقط مع OTP، وJWT بمطالبات صلاحيات مقيّدة بمساحة العمل وتدوير رموز التحديث مع كشف إعادة الاستخدام، وحدّ الأجهزة لكل طالب، و6 سياسات مسمّاة لحدّ المعدل، ونموذج RBAC يبدأ من الصلاحية بـ 60 مفتاحًا و8 أدوار نظام على 286 إجراء في المتحكّمات، ومرشّح EF Core عام يُغلق عند الفشل على كل كيان مقيّد بمساحة عمل.

تدفّقات المال والامتحانات: دفعات أكواد الاشتراك وتفعيل محصّن من حالات التسابق في معاملة واحدة مع تجميد العمولة على كل عملية بيع، ودورة حياة التسويات (مسودة، معتمدة، مدفوعة) مع تعديلات بالإلحاق فقط وإيصالات، ومحاولات امتحان على ساعة الخادم مع الحفظ التلقائي والتصحيح الآلي ومهمة كنس للمحاولات منتهية الصلاحية (أقسام الامتحان وتزامن التصحيح بُنيا بالاشتراك مع زميله)، و23 نوعًا من أحداث الإشعارات تُفرَّغ إلى FCM عبر مهام خلفية.

محوّلات المزوّدين والمهام والاختبارات: محوّلات Cloudflare Stream وS3 وFCM HTTP v1 والرسائل النصية مع بديل تطويري خلف كل منفذ (وسم PDF بالعلامة المائية من زميله)، ومنصة Hangfire بـ 17 مهمة مع سجل لتشغيلات المهام ومعالجة dead-letter، وحِزمة اختبارات التكامل على PostgreSQL، ومعظم دوال اختبار xUnit البالغ عددها 1,520، وCI وملف Dockerfile.

خارج الـ Backend: حزمة التصميم التأسيسية التي بنى الفريق عليها (SRS والمعمارية والاتفاقيات ودليل التشغيل)؛ وهيكل لوحة تحكم React 19 وطبقة API مُنمَّطة (37 كائن خدمة و270 دالة) وتوجيه يبدأ من الصلاحية ولوحة إدارة المنصة، مع النظام البصري وجداول البيانات ومنشئ التقييمات من زميله؛ وإشعارات الدفع والإعلانات وإصلاحات مشغّل الفيديو في تطبيق Flutter الذي يقوده زميله.

عزل لا يمكن نسيانه

يحصل كل كيان مقيّد بمساحة عمل على مرشّح EF Core عام واحد مركّب (الحذف الناعم ومساحة العمل) يُبنى عند بناء النموذج، ونطاق لكل طلب يُغلق على مساحة عمل فارغة عندما لا يُحَلّ شيء، ووضع للمهام الخلفية يرمي استثناءً بدل أن يعيد صفر صفوف بصمت عندما لا تعلن المهمة نطاقها؛ ويختم معترض SaveChanges مساحة العمل ويتحقق منها في كل كتابة. تنتقل صلاحيات المعلّم داخل الرمز كمطالبات مؤهَّلة بمساحة العمل، فلا يُحَلّ حق مُنح في مساحة عمل داخل أخرى أبدًا، وقراءة عبر مساحات العمل تُجاب بـ 404 لا 403. وبذلك يظهر المرشّح المفقود كصفحة فارغة أو استثناء في اختبارات التكامل الـ 91 على PostgreSQL، لا كبيانات معلّم آخر أبدًا.

كود الاشتراك حدث مالي

تفعيل الكود يجب أن يقلب حالة الكود، وينشئ التسجيل، ويسجّل عملية البيع مع تجميد نسبة العمولة عليها، ويزيد عدّاد الدورة، كوحدة واحدة، من هاتف قد يعيد المحاولة. يعمل ذلك في معاملة صريحة واحدة مع قفل صف على مسار التجديد، وفهرس فريد جزئي على (الطالب، الدورة) النشطين يرفض التكرارات المتزامنة، وأضاف زميله سياسة مخصصة لحدّ المعدل على نقطة التفعيل ومخزن Idempotency-Key كي تحصل المحاولة المُعادة بعد انتهاء المهلة على الاستجابة الأصلية بدل خطأ ملتبس بأن الطالب مسجّل أصلًا. تغييرات النسبة اللاحقة لا تعيد كتابة التاريخ أبدًا، لأن النسبة تعيش على عملية البيع لا على المعلّم.

فيديو يكلّف توقيعًا واحدًا لكل تشغيل

تُبثّ الدروس المحمية من Cloudflare Stream بصيغة HLS مشفّرة، لكن طلب رابط موقّع من API المزوّد عند كل تشغيل سيكون بطيئًا ومقيّد المعدل. يسكّ الـ Backend رمز التشغيل قصير العمر محليًا بصيغة المزوّد نفسها، مربوطًا بالطالب والجهاز والدرس والأصل وعنوان IP ومدقَّقًا عند كل إصدار، ويعيد نص العلامة المائية الخاص بالطالب إلى جانب الـ manifest ليعرضه التطبيق. أما اختيار الجودة، الذي لا يتيحه المزوّد، فيأتي من تحليل قائمة تشغيل HLS الرئيسية مرة واحدة وقت التحويل وإعادة توقيع كل نسخة جودة وقت التشغيل، ويُقرأ webhook التحويل كبايتات خام ويُتحقق منه بـ HMAC قبل أي ربط للنموذج.

النتيجة

Backend واحد يخدم التطبيقين: 63 متحكّمًا و364 نقطة نهاية فوق 74 جدولًا، و60 مفتاح صلاحية و8 أدوار نظام على 286 إجراء محكوم، و17 مهمة Hangfire مفهرسة، و5 محوّلات مزوّدين إنتاجية، و86 رمز خطأ ثابتًا بمدخلات كتالوج عربية وإنجليزية، مدعومة بـ 1,951 حالة اختبار وحدة ناجحة و91 اختبار تكامل على PostgreSQL. وحوله لوحة تحكم React 19 بـ 57 شاشة موجَّهة و3,343 مفتاح ترجمة بتطابق تام بين العربية والإنجليزية و679 اختبار Vitest، وتطبيق Flutter للطلاب على Android وiOS بـ 43 شاشة و711 مفتاح ترجمة لكل لغة، وصفحة هبوط عامة. مشروع عميل مستمر بناه مهندسان، قيد التطوير منذ يوليو 2026.

ماذا تعلّمت

عزل المستأجرين يجب أن يكون خاصية في طبقة البيانات لا عادة عند المطوّر: المرشّح الذي يمكن نسيانه سيُنسى، فاجعل غيابه يُغلق الوصول ودع اختبارات التكامل تثبت ذلك.

في منتج يُباع بالأكواد، حدود المعاملة هي المنتج: التفعيل والتسجيل وعملية البيع وعمولتها المجمّدة يجب أن تُلتزم معًا، والمحاولة المُعادة من شبكة سيئة تحتاج إلى إجابة idempotent لا إلى خطأ.

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

أعمال مختارة

أعمال

وصلت

إلى الإنتاج فعلًا.

الصفحة الرئيسية لمنصة Sendy — أدر كل طلب من أول نقرة حتى التسليم النهائي

Sendy

منصة متعددة المستأجرين لعمليات التوصيل والتجارة الإلكترونية: واجهة API واحدة بـ ASP.NET Core، خمس واجهات React، تتبّع لحظي، وأدوات متاجر مدعومة بالذكاء الاصطناعي.

منصة ويب • لوجستيات وتجارة إلكترونية • 2026

بطاقة مشروع IMMAR

IMMAR

منصة تعليم إلكتروني متعددة المعلّمين للعراق: API واحدة بـ ASP.NET Core، ولوحة تحكم React، وتطبيق طلاب Flutter، مع فيديو محمي وامتحانات وتسويات.

منصة تعليم إلكتروني • التعليم • 2026

بطاقة مشروع Nawa

Nawa

منصة متعددة المستأجرين لمراكز اتصال بالذكاء الاصطناعي وعمليات الخدمة: صوت ودردشة لحظيان عبر WebRTC وTwilio، وتنسيق أدوات محكوم بالسياسات، واستهلاك قابل للفوترة.

منصة عمليات بالذكاء الاصطناعي • صوت ودردشة • 2025

بطاقة مشروع Madhmoon

Madhmoon

مشروع ابتكار في التقنية المالية للشمول الرقمي في العراق، صمّمه فريق متعدد التخصصات وتحقق منه وقدّمه. المركز الأول في هاكاثون التقنية المالية.

مفهوم تقنية مالية • هاكاثون التقنية المالية • المركز الأول

بطاقة مشروع NANO

NANO

تطبيق ويب للتعرّف الضوئي على الحروف بالذكاء الاصطناعي يستخرج النص من الصور ويرقمنه لحظيًا. المركز الأول في هاكاثون ITS الأول.

تطبيق ويب OCR بالذكاء الاصطناعي • هاكاثون ITS الأول • المركز الأول

بطاقة مشروع Core Banking

Core Banking

مفهوم لنظام مصرفي أساسي يغطي التدفّقات المعاملاتية ومتطلبات الاتساق. المركز الثاني في هاكاثون ITS الثاني.

مفهوم تقنية مالية • هاكاثون ITS الثاني • المركز الثاني

بطاقة مشروع Form Builder

Form Builder

منشئ نماذج بُني من أجل سهولة الاستخدام والتسليم السريع والتعاوني تحت ضغط وقت الهاكاثون. المركز الثاني في أسبوع ريادة الأعمال.

تطبيق ويب • أسبوع ريادة الأعمال • المركز الثاني

الخبرات

أين تعلّمت ذلك.

أحمد عماد طارق في الحفل الختامي لهاكاثون التقنية المالية

تريد القصة كاملة؟

السيرة الذاتية فيها التفاصيل: الأدوار، والأدوات، والهاكاثونات، والتعليم.

حمّل سيرتي الذاتيةPDF، صفحة واحدة

أو راسلني بالبريد، بلا أي ضغط

ahmed.emadtarq@gmail.com