# Workflow فحص حالة المواقع في n8n

أتمتة جاهزة للاستيراد في n8n تستقبل طلب التشغيل، تُنفّذ طلبات HTTP حقيقية للمواقع الثلاثة، ثم تُعيد النتائج إلى Project OS عبر Callback.

## الاستيراد

1. افتح n8n ثم اختر **Workflows ← Import from File**.
2. حدّد الملف `n8n/site-check-workflow.json`.
3. فعّل الـ Workflow (زر **Active**) ليعمل الـ Webhook على المسار:

```
POST /webhook/site-check
```

> في وضع الاختبار يكون المسار `/webhook-test/site-check` ويحتاج ضغطة **Execute workflow** مرة واحدة.

## شكل الطلب

```json
{
  "runId": "معرّف التشغيل من Project OS",
  "callbackUrl": "رابط استقبال النتائج في Project OS",
  "sites": [
    { "label": "Project OS", "url": "https://projectos.smvapp.cloud" },
    { "label": "n8n", "url": "https://n8n.smvapp.cloud" },
    { "label": "Student Tutor", "url": "https://student.smvapp.cloud" }
  ]
}
```

- `callbackUrl` اختياري: عند إرساله تُرسَل النتائج إليه بطلب POST، وبدونه تُعاد النتائج في استجابة الـ Webhook مباشرة.
- `sites` اختياري: عند إهماله تُفحص المواقع الثلاثة نفسها المحدّدة في متطلبات المشروع، وبحد أقصى 20 موقعًا (استضافة HTTPS عامة فقط).
- لا توجد أي بيانات اعتماد أو أسرار داخل الـ Workflow؛ رابط الـ Callback يأتي مع كل طلب.

## شكل الاستجابة (عقد `site.check`)

```json
{
  "runId": "…",
  "kind": "site.check",
  "completedAt": "2026-09-12T13:30:00.000Z",
  "summary": { "total": 3, "ok": 2, "down": 1 },
  "results": [
    {
      "url": "https://projectos.smvapp.cloud",
      "label": "Project OS",
      "ok": true,
      "statusCode": 200,
      "latencyMs": 145,
      "error": null
    }
  ]
}
```

تصنيف كل موقع في عقدة **تجهيز نتيجة الفحص**:

| الحقل | المعنى |
| --- | --- |
| `ok: true`  | وصلت استجابة HTTP فعلية ورمزها أقل من 400 |
| `ok: false` | خطأ شبكة (لم تصل استجابة، ويُوضع نص الخطأ في `error`) أو رمز 400 وأعلى |
| `statusCode` | رمز HTTP عند توفره، وإلا `null` |
| `latencyMs` | زمن الاستجابة بالملي ثانية، مقاس من لحظة بدء طلب ذلك الموقع مباشرة |

## مسار العقد

```
طلب التشغيل (Webhook)
  → تجهيز طلب الفحص
  → توزيع المواقع
  → فحص موقعًا بموقع (Split In Batches، موقع واحد في كل دورة)
        ├ المخرج «loop»: توقيت بداية الفحص → طلب HTTP حقيقي (مهلة 10 ثوانٍ، لا يُوقف عند الخطأ)
        │                 → تجهيز نتيجة الفحص → يعود إلى الحلقة
        └ المخرج «done»: تجميع النتائج
             → هل يوجد رابط Callback؟
                  ├ نعم → إرسال النتائج إلى Project OS (POST إلى callbackUrl)
                  └ لا  → إرجاع النتائج للمُشغِّل (Respond to Webhook)
```

الفحص يمرّ على المواقع موقعًا بموقع حتى يُقاس زمن استجابة كل موقع بدقة (لحظة بدء الفحص تُسجَّل قبل طلب ذلك الموقع مباشرة)، وطلب HTTP لكل موقع لا يُوقف الـ Workflow عند الفشل بل يتحول إلى نتيجة `ok: false`.

## ربط واجهة التطبيق

لا تستدعي الواجهة الـ Webhook مباشرة ولا تعرض أي مفاهيم n8n للمستخدم. زر «فحص المواقع الآن» في `index.html` يستدعي نقطة الأتمتة المُدارة في Project OS:

```
POST /api/app/automations/<automationId>/run
GET  /api/app/automations/runs/<runId>
```

يقوم Project OS بتشغيل الـ Workflow في n8n (HTTP Request حقيقي للمواقع الثلاثة)، ثم تستقبل الواجهة النتائج عبر الاستعلام الدوري عن حالة التشغيل وتطابقها مع البطاقات عبر حقل `url` وتعرضها. عند فشل التشغيل تُعرض رسالة الخطأ كما وردت، ولا تعرض الواجهة نتائج وهمية إطلاقًا.