# تقرير شامل عن مشروع LMS

> تقرير تحليلي لمشروع نظام إدارة التعلم (Learning Management System) المبني على Laravel 9

---

## جدول المحتويات

1. [التقنيات المستخدمة (Technology Stack)](#1-التقنيات-المستخدمة-technology-stack)
2. [بنية المشروع (File System Structure)](#2-بنية-المشروع-file-system-structure)
3. [هل المشروع Modules ولا Flat؟](#3-هل-المشروع-modules-ولا-flat)
4. [الـ Models - عددها وتقسيمها](#4-الـ-models---عددها-وتقسيمها)
5. [الـ Core Module (المحور الأساسي)](#5-ما-هو-الـ-core-module-المحور-الأساسي)
6. [Authentication](#6-authentication)
7. [Authorization & Permissions](#7-authorization--permissions)
8. [الـ Design Patterns المستخدمة](#8-الـ-design-patterns-المستخدمة)
9. [ملاحظات مهمة إضافية](#9-ملاحظات-مهمة-إضافية)
10. [Frontend Clients (مين بيستهلك المشروع)](#10-frontend-clients-مين-بيستهلك-المشروع)
11. [خلاصة التقرير](#خلاصة-التقرير)

---

## 1. التقنيات المستخدمة (Technology Stack)

### Backend

- **Laravel 9.19** على **PHP 8.0.2+**
- **MySQL/MariaDB** (قاعدة بيانات)
- **Blade** للـ views الخاصة بلوحة التحكم

### Frontend (داخل المشروع)

- **Blade** - الواجهة الوحيدة المبنية فعلياً (لوحة تحكم الأدمن)
- **Vite** كـ build tool
- **Bootstrap 5.2** + **Sass** + **jQuery**
- **Livewire PowerGrid** - جداول الداشبورد
- **Video.js 8** لمشغل الفيديو
- **Vue 3** → **مجرد scaffolding افتراضي من Laravel، غير مستخدم فعلياً** (انظر قسم [Frontend Clients](#10-frontend-clients-مين-بيستهلك-المشروع))

### Authentication & Authorization

- **Laravel Passport 11** (OAuth2) - للـ API
- **Laravel Sanctum** (موجود كـ dependency لكن مش مفعَّل كـ guard)
- **spatie/laravel-permission 5.5** (Roles & Permissions)

### الباكدجات الرئيسية المهمة

- **spatie/laravel-medialibrary** - رفع وإدارة الملفات والميديا
- **spatie/laravel-translatable** - ترجمة الحقول (ar/en)
- **spatie/laravel-schemaless-attributes** - حقول JSON ديناميكية (مستخدمة لحقل `name` مثلاً)
- **spatie/laravel-activitylog** - تسجيل نشاط المستخدمين
- **spatie/laravel-view-models** - ViewModels للـ Dashboard
- **flugger/laravel-responder** - Transformers للـ API
- **lorisleiva/laravel-actions** - Action Pattern
- **tucker-eric/eloquentfilter** - فلترة Eloquent
- **power-components/livewire-powergrid** - جداول الداشبورد
- **mcamara/laravel-localization** - تعدد اللغات
- **barryvdh/laravel-translation-manager** - إدارة الترجمات
- **firebase/php-jwt + apility/laravel-fcm** - إشعارات الموبايل
- **maatwebsite/excel** - استيراد/تصدير Excel
- **overtrue/laravel-favorite** - المفضلة
- **niklasravnsborg/laravel-pdf + mpdf** - PDF (شهادات)
- **simplesoftwareio/simple-qrcode** - QR Code للشهادات
- **pion/laravel-chunk-upload** - رفع ملفات كبيرة على أجزاء
- **darkaonline/l5-swagger** - توثيق API
- **andreaselia/laravel-api-to-postman** - تصدير Postman collection

---

## 2. بنية المشروع (File System Structure)

### المجلدات الرئيسية تحت `app/`

```
app/
├── Actions/          (46 ملف) - Action Pattern
├── Console/
├── Exceptions/
├── Exports/          (4 ملفات Excel export)
├── Helpers/          (2 - Helpers.php, TranslationManager.php)
├── Http/
│   ├── Controllers/
│   │   ├── Dashboard/   (52 controller)
│   │   ├── API/         (48 controller بما فيهم API/Auth)
│   │   └── Auth/        (6 controllers - web auth)
│   ├── Middleware/   (23 ملف)
│   └── Requests/     (140+ FormRequest)
├── Imports/          (2 ملفات Excel import)
├── Jobs/             (1 - StudentCourseCertificateChecker)
├── Mail/
├── ModelFilters/     (12 - EloquentFilter)
├── Models/           (145 ملف في 72 domain folder)
├── Notifications/    (2 - ResetPassword, GeneralNotification)
├── Policies/         (3 - Course, Video, AnswerUser)
├── Providers/        (6)
├── Repository/       (27 - Repository Pattern)
├── Rules/            (3 custom validation rules)
├── Scopes/           (2 global scopes)
├── Services/         (1 - CertificatesService)
├── Traits/           (2 - ApiResponseTrait, ForgetPasswordTrait)
├── Transformers/     (28 ملف - V1 و V2)
└── ViewModels/       (37 ملف - Spatie ViewModels)
```

### ملفات الـ Routes

| الملف | Prefix | Middleware | الهدف |
|---|---|---|---|
| `routes/web.php` | - | `web` | `Auth::routes()` + certificate + payment callback |
| `routes/admin.php` | `/admin` | `web` + `auth` per controller | داشبورد الأدمن |
| `routes/api.php` | `/api` | `api` + `auth:api` | REST API للموبايل/الفرونت |
| `routes/ajax.php` | `/ajax` | `web` | مساعدات JSON للداشبورد |
| `routes/logger.php` | `/activity` | `web` | واجهة سجل النشاطات |
| `routes/channels.php` | - | - | Broadcasting channels |
| `routes/console.php` | - | - | Artisan closures |

---

## 3. هل المشروع Modules ولا Flat؟

**المشروع مش مقسم Modules حقيقية** (مفيش `nwidart/laravel-modules` أو مجلد `Modules/`). بس **منظَّم بشكل Domain-Oriented**:

- **كل نموذج (Model) له مجلد خاص به** تحت `app/Models/{Entity}/` فيه كل الترايتس الخاصة بيه.
- **Actions و Requests و ViewModels** متقسمين حسب الـ Domain برضو: مثلاً `app/Actions/Dashboard/Course/`, `app/Http/Requests/Dashboard/Course/`.

دا أقرب لـ **Modular Monolith** - Laravel عادي بس بتنظيم مرتب جداً حسب الـ Domain.

---

## 4. الـ Models - عددها وتقسيمها

### الأرقام

- **72 Domain Folder** تحت `app/Models/`
- **145 ملف PHP** إجمالاً
- **88 Eloquent Model** حقيقي (بدون الـ BaseModel)

### نمط التنظيم داخل كل Domain Folder

كل موديل مقسَّم الـ concerns بتاعته على **Traits منفصلة**:

```
app/Models/Course/
├── Course.php                  (الموديل الأساسي)
├── CourseRelationship.php      (trait فيه belongsTo/hasMany)
├── CourseAccessor.php          (trait فيه accessors & attribute methods)
└── CourseScope.php             (trait فيه query scopes)
```

وكل موديل `use` الترايتس دي. دا بيخلي الملف الأساسي نظيف وكل concern في مكانه.

### الكيانات الأساسية (Core LMS Entities)

| الفئة | الكيانات |
|---|---|
| **المحتوى التعليمي** | `Course`, `Section`, `Video`, `Module`, `Category`, `Level`, `ObjectivesCourse` |
| **الاختبارات** | `Exam`, `Question`, `Answer`, `AnswerUser`, `UserExam*`, `ExamBookmark`, `ExamRate`, `ExternalExam` |
| **المجموعات (Cohorts)** | `Group`, `GroupUser` |
| **التجارة** | `Order`, `OrderItem`, `CartItem`, `Coupon`, `Bundle`, `Plan`, `PaymentMethod`, `UserSubscription`, `ExamOrder`, `ExamPackageOrder` |
| **المستخدمون والصلاحيات** | `User`, `Role`, `Permission`, `UserAddress` |
| **الكتب** | `Book`, `StudentBook`, `PrintBook`, `OrderBook` |
| **المؤسسات** | `University`, `Faculty`, `Country`, `Branch`, `SchoolStage` |
| **الشهادات** | `Certificate`, `ProfessionalCertificate`, `AccreditingAuthority`, `ScientificDegree` |
| **CMS/محتوى تسويقي** | `Blog`, `Slider`, `Page`, `PageBanner`, `Faq`, `AboutUs`, `ClientTestimonial`, `ContactInfo`, `PlatformFeature`, `Term`, `SocialMedia` |
| **أخرى** | `Notification`, `Complaint`, `ContactMessage`, `Job`, `JobCategory`, `ApplyForJob`, `NewsletterSubscriber`, `Setting`, `Zoom`, `View`, `Assignment`, `AppVersion` |

### ملاحظات على الموديلات

- **مفيش موديل اسمه `Lesson`** - الدور دا بيلعبه `Section` + `Video`.
- **مفيش موديل `Enrollment`** - الوصول للكورسات بيتحدد عن طريق `Order` + `OrderItem` + `UserBundleCourse` + `GroupUser`.
- فيه typo في اسم مجلد `app/Models/UserAddres/` (ناقصه s).

---

## 5. ما هو الـ Core Module (المحور الأساسي)

المحور اللي قايم عليه النظام كله هو **دورة `Course` → Section → Video**، مع **`Exam` → Question → Answer** كمحور مساعد:

```mermaid
graph TD
    University[University] --> Faculty[Faculty]
    Faculty --> Module[Module]
    Module --> Course[Course]
    User[User/Instructor] --> Course
    Group[Group/Cohort] --> Course
    Category[Category] --> Course
    Level[Level] --> Course
    Course --> Section[Section]
    Section --> Video[Video]
    Section --> Exam[Exam]
    Exam --> Question[Question]
    Question --> Answer[Answer]
    Question --> AnswerUser[AnswerUser]
    Student[User/Student] --> Order[Order]
    Order --> OrderItem[OrderItem]
    OrderItem -.morphs to.-> Course
    OrderItem -.morphs to.-> Bundle[Bundle]
    OrderItem -.morphs to.-> Book[Book]
    Bundle --> Course
    Student --> View[View - polymorphic]
    View -.viewable.-> Video
    Student --> Certificate[Certificate]
    Course --> Certificate
```

**الـ Core العملي:** `Course` هو القلب، ويدور حوله:

- **الهيكل الأكاديمي:** University → Faculty → Module → Course
- **المحتوى:** Course → Section → Video
- **التقييم:** Section → Exam → Question → Answer → AnswerUser
- **الشراء/الوصول:** User → Order → OrderItem (morph إلى Course/Bundle/Book)
- **المجموعات:** Group → Users (Students) + Courses

---

## 6. Authentication

### الـ Guards (من `config/auth.php`)

| Guard | Driver | Provider | الاستخدام |
|---|---|---|---|
| `web` (افتراضي) | `session` | `users` | لوحة التحكم بالجلسات |
| `api` | `passport` | `users` | الـ API عن طريق OAuth2 |

**كلا الـ guards يستخدمان نفس موديل `App\Models\User\User`** - مفيش multi-guard model.

### الفصل بين الأدوار

**مش عن طريق Guards منفصلة**، لكن عن طريق:

1. حقل `type` في جدول `users`
2. **Spatie Roles** (`super-admin`, `instructor`, `student`)
3. **Middleware مخصص** للتفريق في الـ runtime

### Controllers الـ Auth

- **Web Auth** (`app/Http/Controllers/Auth/`): Login, Register, ForgotPassword, ResetPassword, ConfirmPassword, Verification (ستايل Laravel UI القديم)
- **API Auth** (`app/Http/Controllers/API/Auth/`): Login, Register, ForgetPassword, ResetPassword, ResendOtp, VerifyOtp, VerifyPasswordOTP - فيها **OTP flow كامل**

### طرق المصادقة المدعومة

- تسجيل دخول بـ email أو phone (username `findOrFailForEmailAndPassword` logic)
- OTP عن طريق الموبايل (`VerifyOtpController`)
- Password reset عن طريق OTP (`VerifyPasswordOTPController`)
- **مفيش Social Login** (مش مستخدم `laravel/socialite`)
- Tokens عن طريق Passport (`HasApiTokens` trait على الـ User)

---

## 7. Authorization & Permissions

### الأدوار (Roles) - من `RoleSeeder`

| الدور | الثابت |
|---|---|
| `super-admin` | `Role::SUPER_ADMIN_ROLE` |
| `instructor` | `Role::INSTRUCTOR_ROLE` |
| `student` | `Role::STUDENT_ROLE` |

- **`super-admin` فقط** بيستلم كل الصلاحيات في الـ seeder الأساسي.
- `instructor` و `student` بيتعملوا بدون تعيين Permissions في `RoleSeeder` (محتمل بتتعيَّن في سياقات تانية).

### Permissions

- **نمط التسمية:** `{resource}.{action}` زي `courses.read`, `courses.create`, `courses.edit`, `courses.delete`
- **المصدر:** كل feature له `*PermissionSeeder.php` تحت `database/seeders/` + migration بتعمله `Artisan::call('db:seed --class=...PermissionSeeder')`
- الفئات تشمل: AboutUs, Blog, Bundle, Certificate, Coupon, ExamPackage, Faq, GeneralSetting, Job, Location, Notification, PaymentMethod, Translation, وغيرهم كتير.

### Middleware Aliases (من `app/Http/Kernel.php`)

**Spatie:**

- `role` → `RoleMiddleware`
- `permission` → `PermissionMiddleware`
- `role_or_permission` → `RoleOrPermissionMiddleware`

**مخصصة للمشروع:**

| Alias | الوظيفة |
|---|---|
| `instructors` | يسمح فقط لمن له دور instructor |
| `students` | يسمح فقط لمن له دور student |
| `login.student` / `login.instructor` | فحص قبل API login |
| `approved.instructor` | يمنع الـ instructor غير المعتمَد |
| `auth.optional` | Auth اختياري (بتكمل حتى لو مش مسجل) |
| `check.course.purchase` | يفحص شراء الكورس |
| `courses.all` | يطبق scope على كل الكورسات |
| `video.limit.check` | يطبق حد مشاهدات الفيديو |
| `CheckTranslationPermission` | يتأكد من `translation.read` ability |
| `check.session` | (passthrough - مش مستخدم فعلياً) |

### Policies

**3 فقط** تحت `app/Policies/`:

- `CoursePolicy.php` - مُسجَّلة في `AuthServiceProvider`
- `VideoPolicy.php` - مُسجَّلة
- `AnswerUserPolicy.php` - **مش مُسجَّلة** (orphan)

### أنماط الاستخدام (Usage Patterns)

| النمط | المكان |
|---|---|
| **Spatie permission middleware في Constructor** | `Dashboard/*Controller` → `$this->middleware('permission:courses.read')` |
| **`@can` في Blade** | `resources/views/backend/layouts/partials/*.blade.php` |
| **Gate/`can()` في middleware** | `CheckTranslationPermission` |
| **`hasRole()` فحص** | `StudentMiddleware`, `InstructorMiddleware` |
| **`$this->authorize()` في controllers** | **غير مستخدم** - كل الفحص middleware + Blade |

### ملاحظة مهمة على الـ Authorization

الـ Policies الموجودة (Course, Video) **غير مستخدمة فعلياً في Controllers** - كل الفحص بيحصل عن طريق الـ permission middleware و `@can` في Blade. دا يخلي صيانة صلاحيات الكورسات والفيديوهات محورها الـ middleware.

---

## 8. الـ Design Patterns المستخدمة

### النمط السائد: **Action-Oriented + Repository + Transformer/ViewModel**

| Pattern | الحجم | المكان | الوصف |
|---|---|---|---|
| **Action Pattern** | كبير (46 ملف) | `app/Actions/` | كل use case عبارة عن class مستقل بـ `handle()` (باستخدام `AsAction` trait) |
| **Repository Pattern** | كبير (27 ملف) | `app/Repository/` | `BaseRepository` + `EloquentRepositoryInterface` + 25 repository concrete |
| **Transformer Pattern** | كبير (28 ملف) | `app/Transformers/V1/` و `V2/` | Flugg Responder لتشكيل استجابات API |
| **ViewModel Pattern** | كبير (37 ملف) | `app/ViewModels/` | Spatie ViewModels لصفحات الداشبورد |
| **Trait-based Model Split** | كبير | `app/Models/*/` | كل موديل مقسّم إلى Relationship/Accessor/Scope traits |
| **Service Layer** | ضعيف (1 ملف) | `app/Services/` | فقط `CertificatesService` |
| **Global Scopes** | صغير (2) | `app/Scopes/` | `ActiveCourseScope`, `ActiveVideoScope` |
| **Filter Pattern** | متوسط (12) | `app/ModelFilters/` | EloquentFilter للفلترة حسب query params |
| **Observer Pattern** | **غير مستخدم** | - | مفيش Observers |
| **Event/Listener** | **غير مستخدم تقريباً** | - | `EventServiceProvider` فاضي عدا Laravel default |

### ملاحظة على `RepositoryServiceProvider`

فيه **namespace mismatch** في `app/Providers/RepositoryServiceProvider.php`:

```php
use App\Repository\Eloquent\BaseRepository;
use App\Repository\EloquentRepositoryInterface;
```

لكن الـ `BaseRepository` الحقيقي موجود في `App\Repository\BaseRepository` (مفيش مجلد `Eloquent`). يعني الـ Service Provider فيه bug والـ binding محتمل يفشل - ممكن يكون بيستخدم ال static methods بدل الـ DI.

### مثال عملي للتدفق (Flow Example)

**تدفق إنشاء Course من الداشبورد:**

1. **Route:** `POST /admin/courses` (في `routes/admin.php`)
2. **Controller:** `Dashboard\CourseController@store` (مع `permission:courses.create` middleware)
3. **Request:** `app/Http/Requests/Dashboard/Course/StoreCourseRequest.php` للتحقق
4. **Action:** `StoreCourseAction::run($data)` ينشئ الـ Course
5. **View (لـ create/edit):** `CourseViewModel` بيحمل dropdowns من الـ Repositories

**تدفق عرض Course في الـ API:**

1. **Route:** `GET /api/courses` في `routes/api.php`
2. **Middleware:** `QueryFilterMiddleware`, `AcceptLanguageMiddleware`, `BlockUserMiddleware`
3. **Controller:** `API\CourseController`
4. **Repository:** `CourseRepository::paginate(...)` + `filter()` (EloquentFilter)
5. **Transformer:** `V1\CourseTransformer` بيشكّل JSON

---

## 9. ملاحظات مهمة إضافية

### نقاط القوة

- **تنظيم Domain-Oriented نظيف** جداً على مستوى الموديلات.
- فصل Traits داخل كل موديل يخلي الكود نظيف.
- **API محترف** بـ Passport + Transformers + OTP flow.
- نظام Permissions مفصَّل جداً (لكل feature).
- دعم لغات (ar/en) عن طريق Translatable + Schemaless attributes.

### نقاط تستحق الانتباه

1. **`HomeController` بيعمل redirect إلى `/admin`** - مفيش واجهة طلاب Blade فعلية؛ تجربة الطالب الأساسية عبر الـ API.
2. **`RepositoryServiceProvider` فيه namespace mismatch** - ممكن مش شغال.
3. **`AnswerUserPolicy` مش مُسجَّلة** في `AuthServiceProvider`.
4. **`AllCoursesMiddleware`** فيه احتمال bug (`return` قبل `$next($request)`).
5. **`AjaxController` مفيهاش `auth` middleware** في الـ constructor ولا في routes → ممكن يكون security gap.
6. **Sanctum موجود كـ dependency** لكن غير مستخدم فعلياً - الـ API على Passport فقط.
7. **مفيش Observers ولا Events/Listeners فعلية** - كل ال side effects بتحصل في Actions أو Controllers.
8. **مفيش `Enrollment` model** - الـ access مبني على Orders و OrderItems بشكل morph (فيه حقول `model` و `course_id` و `book_id` + العلاقات polymorphic).
9. **Typo:** مجلد `app/Models/UserAddres/` بدل `UserAddress`.

---

## 10. Frontend Clients (مين بيستهلك المشروع)

المشروع عبارة عن **Backend + Admin UI** في repository واحد. الـ clients اللي بتستهلكه بيتقسموا لجزأين:

### أ. Admin Dashboard - Blade داخل المشروع ✅

- **المكان:** `resources/views/backend/`
- **Route:** `/admin` (من `routes/admin.php`)
- **Auth:** Session (guard `web`)
- **التقنيات:** Blade + Bootstrap 5 + jQuery + Livewire PowerGrid
- **المستخدمون:** `super-admin`, `instructor` (بعد الاعتماد)

### ب. Student/Public Client - REST API ✅

- **Route:** `/api` (من `routes/api.php`)
- **Auth:** Laravel Passport (OAuth2) عبر `auth:api`
- **Response Shape:** Flugg Responder Transformers (`V1`/`V2`)
- **Localization:** header `Accept-Language: en|ar` إجباري عبر `AcceptLanguageMiddleware`

### مهم: Vue مش مستخدم فعلياً في المشروع ❌

رغم إن `package.json` و `vite.config.js` فيهم Vue 3، فإن **مفيش Vue app حقيقية** في المشروع. اللي موجود فقط:

```
resources/js/
├── app.js              (الـ scaffold الافتراضي لـ Laravel)
├── bootstrap.js
├── ziggy.js
└── components/
    └── ExampleComponent.vue   (مثال افتراضي فاضي: "I'm an example component")
```

الـ `ExampleComponent.vue` هو الـ component الافتراضي اللي بيتولد تلقائياً عند تنصيب Laravel + Vue starter - **مش component حقيقي من المشروع**. يعني Vue موجود بس **مش مستهلَك**.

### مين بيستهلك الـ API إذن؟

الأدلة بتشير بقوة إلى **تطبيق موبايل** موجود في repository منفصل (مش موجود هنا):

| الدليل | ليه يدل على موبايل |
|---|---|
| `apility/laravel-fcm` (Firebase Cloud Messaging) | إشعارات push للموبايل |
| موديل `AppVersion` | تتبع إصدارات تطبيق الموبايل |
| `firebase/php-jwt` | JWT للتطبيقات |
| **OTP flow كامل** (ResendOtp, VerifyOtp, VerifyPasswordOTP) | نمط موبايل بامتياز |
| حقول `device_id`, `device_type`, `fcm_token` في `User` | معلومات جهاز الموبايل |
| `AcceptLanguageMiddleware` يفرض header | سلوك API للتطبيقات |
| `middleware.login.student` / `login.instructor` | فحوصات خاصة بتسجيل الدخول في الموبايل |

### مخطط استهلاك المشروع

```mermaid
graph LR
    Admin[Admin / Instructor<br/>Browser] -->|Session + CSRF| AdminUI[/admin<br/>Blade + Bootstrap]
    AdminUI --> Backend[Laravel LMS Backend]
    Student[Student<br/>Mobile App] -->|OAuth2 Bearer Token<br/>+ Accept-Language| API[/api<br/>Passport]
    API --> Backend
    Backend --> DB[(MySQL Database)]
    Backend --> FCM[Firebase FCM]
    Backend --> S3[AWS S3 / Local Storage]
    FCM -.push notifications.-> Student
```

### خلاصة الاستهلاك

| الجزء | التقنية | موقعها |
|---|---|---|
| Admin Dashboard | Blade + Bootstrap + Livewire PowerGrid | داخل هذا المشروع |
| Student Client | REST API (Passport) → تطبيق موبايل | **خارج هذا المشروع** (repo منفصل) |
| Vue | غير مستخدم (scaffolding فقط) | - |

لو قررت لاحقاً تبني واجهة Web للطلاب، إما:

1. **SPA منفصلة** (Vue/React/Next.js) تستهلك نفس الـ `/api`
2. **Blade صفحات جديدة** داخل `routes/web.php` تشغّل Vue components فعلية (وقتها تستفيد من الـ Vue scaffolding الموجود)

---

## خلاصة التقرير

دا **Laravel 9 Modular Monolith LMS** مبني بـ:

- **Architecture:** Domain-oriented folders + Actions + Repository + Transformer/ViewModel
- **Auth:** Session (web) + Passport OAuth2 (api) - guard واحد لكل نوع، وأدوار Spatie تفصل بين Admin/Instructor/Student
- **Permissions:** Spatie granular بالـ pattern `resource.action`، مطبَّقة أساساً عبر middleware و Blade `@can`
- **Core Domain:** Course هو القلب، تحته Section → Video، وتحت Section → Exam → Question → Answer. الوصول عبر Order → OrderItem (morph)
- **Content Model:** يدعم Translatable (ar/en) + Schemaless attributes + Media Library
- **Clients:**
  - **Admin:** لوحة تحكم Blade داخل المشروع على `/admin`
  - **Student:** REST API على `/api` تستهلكها **تطبيق موبايل خارجي** (repo منفصل) - **مش Vue**
  - **Vue:** مجرد scaffolding افتراضي، غير مستخدم فعلياً في المشروع
