00:00:00حسناً، كم مرة قمت بإعادة بناء نفس الخلفية البرمجية بالضبط؟
00:00:04عمليات الـ CRUD، والمصادقة، ولوحة التحكم، ورفع الملفات.
00:00:07في كثير من الأحيان، ما يبدو كأنه بناء هو في الواقع مجرد إعادة بناء.
00:00:10ماذا لو كان بإمكانك توجيه أداة واحدة إلى قاعدة بيانات SQL الحالية والحصول على خلفية كاملة؟
00:00:15هذا هو Directus، واجهة برمجة تطبيقات فورية ولوحة تحكم لإدارة محتوى قاعدة بيانات SQL.
00:00:21بدأ الكثير من المطورين يدركون أنهم كانوا يقومون بذلك بالطريقة الصعبة طوال الوقت.
00:00:25دعني أريك كيف يعمل كل هذا في بضع دقائق فقط.
00:00:30[موسيقى]
00:00:33أكبر مشكلة في الخلفية البرمجية لمعظمنا ليست التعقيد، بل التكرار.
00:00:38نحن لا نحل مشاكل جديدة، بل نقوم بكتابة نفس الكود مراراً وتكراراً،
00:00:42وهذا يستهلك وقتنا حقاً.
00:00:44Directus يختصر كل ذلك.
00:00:46فهو يتصل مباشرة بقواعد بيانات Postgres أو MySQL أو Oracle.
00:00:50لا حاجة لعمليات ترحيل البيانات، ولا لإعادة بناء المخطط في مكان آخر.
00:00:53نحصل فوراً على واجهات برمجة تطبيقات REST و GraphQL،
00:00:57وصلاحيات على مستوى الحقول، واشتراكات فورية،
00:01:01وتدفقات عمل وأتمتة، ومعالجة ملفات، وواجهة إدارة نظيفة.
00:01:05الآن، الجزء الممتع هنا هو أن قاعدة بياناتك تبقى كما هي.
00:01:08إنها ليست مجرد طبقة مكررة.
00:01:10وهذا الأمر أهم بكثير مما يبدو عليه.
00:01:12الآن دعني أريك.
00:01:13إذا كنت تستمتع بالأدوات مفتوحة المصدر ونصائح البرمجة لتسريع سير عملك،
00:01:17تأكد من الاشتراك.
00:01:18لدينا فيديوهات تصدر طوال الوقت.
00:01:20حسناً، لنبدأ الآن من الصفر تماماً مع تثبيت نظيف لـ Directus،
00:01:24بدون جداول قاعدة بيانات، ولا أي شيء محمل مسبقاً.
00:01:27مجرد صفحة بيضاء تماماً بعد أن أنشأت حساباً هنا بالفعل.
00:01:32وبدلاً من الاتصال بشيء موجود مسبقاً،
00:01:34سأقوم ببناء تطبيق كامل لإدارة الطلبات في حوالي دقيقة واحدة فقط.
00:01:39أولاً، أقوم بإنشاء مجموعة (Collection) وسأسميها "الطلبات" (Orders)، هكذا تماماً.
00:01:45هذا كل شيء.
00:01:45الآن أصبح لدى التطبيق مكان لتخزين البيانات، ويمكننا إضافة المزيد من التفاصيل فيه الآن.
00:01:51سأقوم بتحديد وتجاوز الحقول التي نحتاجها هنا،
00:01:54أشياء مثل العميل، والتاريخ، وكل تلك التفاصيل الممتعة.
00:01:58ثم يمكنني إضافة أي حقول أخرى يدوياً
00:02:00نعتقد أننا قد نحتاجها لشيء من هذا القبيل.
00:02:03فيمكنني مثلاً وضع اسم العميل، والبريد الإلكتروني، والمنتج كقائمة منسدلة،
00:02:08حيث يمكنني إضافة مفتاح وقيمة.
00:02:10يمكنني فعل ذلك للمبلغ والحالة.
00:02:13كل حقل يضيف المزيد من التفاصيل حول البيانات التي سنقوم بتخزينها.
00:02:16ولاحظوا ما هو مفقود هنا.
00:02:18حسناً، إنه الـ SQL.
00:02:19لا يوجد SQL.
00:02:20لا توجد عمليات ترحيل (Migrations).
00:02:22لا يوجد تنقل بين التبويبات لكتابة ملف مخطط (Schema).
00:02:25يتم الحفظ هنا في Directus مباشرة وفوراً.
00:02:28الآن يمكنني الانتقال إلى عرض المحتوى والبدء في إضافة الطلبات.
00:02:32يمكنني إضافة الطلب الأول هنا، مجرد حساب وهمي.
00:02:35سأضيف طلباً آخر.
00:02:36ثم يمكننا إضافة طلب ثالث، أليس كذلك؟
00:02:39لدينا ثلاثة طلبات مختلفة هنا في النظام.
00:02:42الآن لدي بعض البيانات الحقيقية هنا التي يمكننا البدء في التعامل معها.
00:02:45لكنها حالياً مفتوحة للجميع، مما يعني أن أي شخص يمكنه فعل أي شيء.
00:02:49لذا لنقم بإصلاح ذلك.
00:02:50كيف نصلح ذلك؟
00:02:51حسناً، من خلال الصلاحيات.
00:02:53لذا سأذهب إلى دور "العام" (Public Role).
00:02:55سأبحث عن تلك المجموعة التي أنشأناها، "الطلبات".
00:02:58يمكننا تفعيل القراءة فقط.
00:03:00وسأقوم بالتأكد من إيقاف كل شيء آخر هنا.
00:03:03أي الإنشاء، والتحديث، والحذف.
00:03:05كلها تم إلغاؤها.
00:03:06الآن أصبح الأمر أكثر انضباطاً وأماناً لما نريده.
00:03:10حسناً، هنا يبدأ الأمر يصبح رائعاً حقاً
00:03:12لأننا نستطيع القيام ببعض الأتمتة وبناء تدفقات عمل حول هذا الموضوع.
00:03:16سأذهب إلى هنا وسأقوم بإنشاء تدفق (Flow) جديد.
00:03:19سأعطيه اسماً بسيطاً جداً، ما هو هذا؟
00:03:22سأسميه "إشعار عند طلب جديد".
00:03:24اسم بسيط يوضح الغرض منه.
00:03:26وسأختار كل العناصر من المجموعة التي أنشأناها والتي تسمى "الطلبات".
00:03:31الآن يمكنني بناء مشغل (Trigger).
00:03:33وبالنسبة للمشغل، سأربطه بلحظة إنشاء عنصر جديد،
00:03:37تحديداً في مجموعة الطلبات تلك.
00:03:39لذا الآن في كل مرة يأتي فيها طلب جديد، سيحدث شيء ما.
00:03:43سأقوم بإضافة عملية (Operation).
00:03:44سنقوم بإرسال بريد إلكتروني.
00:03:46سأكتب موضوعاً للرسالة.
00:03:47سأضيف بريدي الإلكتروني إلى هذا.
00:03:49ثم في محتوى الرسالة، سأقوم بسحب بيانات الطلب.
00:03:52لذا في أي وقت يدخل فيه طلب جديد، سيتم دفع تلك البيانات إلى بريد إلكتروني.
00:03:56الآن يمكنني حفظ هذه العملية وسنحفظ التدفق وبذلك نكون قد انتهينا.
00:04:00حسناً، الآن شاهدوا هذا.
00:04:02سأعود للخلف.
00:04:03وفي ملف Docker compose الذي بدأت به، أضفت Mailpit لاختبار هذا.
00:04:07هذه مجرد طريقة بسيطة جداً لاختبار وظيفة إرسال البريد الإلكتروني.
00:04:11عندما أقوم بإنشاء طلب واحد آخر، تماماً كما فعلنا سابقاً، لا شيء معقد،
00:04:14لكن هذه المرة هناك شيء مختلف.
00:04:16هذا سيقوم الآن بتشغيل التدفق تلقائياً ويخرج بريد إلكتروني بالتفاصيل.
00:04:20لا يوجد منطق خلفي (Backend logic) هنا.
00:04:22لا يوجد ربط للأكواد ببعضها.
00:04:25لقد بدأ هذا من لا شيء، لا جداول، لا خلفية برمجية، لا هيكل حقيقي.
00:04:30وفي غضون دقائق قليلة، أصبح تطبيقاً عاملاً مع صلاحيات للبيانات ونعم،
00:04:33الأتمتة، والتي كانت الجزء الأروع.
00:04:35وهذا ما يجعل Directus يبدو رائعاً حقاً.
00:04:38إنه يشبه مزيجاً من منطق قواعد البيانات المرئي مع شيء مثل N8N أو Zapier مدمج بداخله،
00:04:43لكن هؤلاء ليسوا من ينافسهم في الحقيقة.
00:04:45إذن ما هو Directus بالضبط؟
00:04:47إنه منصة بيانات مفتوحة المصدر تعمل فوق قاعدة بيانات SQL الخاصة بك.
00:04:52إنه لا يجلس بجانبها.
00:04:53بل يجلس فوقها مباشرة.
00:04:55نموذج "قاعدة البيانات أولاً" هذا هو الجوهر، أليس كذلك؟
00:04:58إذن ماذا يعني هذا بالنسبة لنا حقاً؟
00:04:59حسناً، هذا يعني بضعة أشياء.
00:05:01يعني أنه لا يوجد انغلاق على مورد معين (No lock-in).
00:05:03قاعدة بيانات SQL الكاملة لا تزال موجودة وتعمل مع الأنظمة القديمة.
00:05:07لهذا السبب يستخدمه الناس لأشياء مثل خلفيات الـ SaaS، والأدوات الداخلية، وأنظمة إدارة المحتوى (Headless CMS)،
00:05:13ووكلاء الذكاء الاصطناعي مع بيانات محكومة.
00:05:15أنت تحاول تحديث نظام قديم دون إعادة كتابة كل شيء.
00:05:19قاعدة بياناتك هي المحرك الفعلي هنا.
00:05:21Directus يمنحها فقط لوحة تحكم وأدوات تحكم.
00:05:24الآن، للوهلة الأولى، إذا كنت قد جربت أدوات أخرى مثل Strapi أو Payload أو Hasura،
00:05:28سيبدو Directus مشابهاً لها، لكنها في الواقع تحل مشاكل مختلفة.
00:05:33Strapi و Payload يعتمدان على "الكود أولاً".
00:05:36تقوم بتعريف المخططات في الكود، ثم تعيد بناء هيكلك هناك.
00:05:40نعم، هذا يعمل، ولكنه عمل إضافي.
00:05:42Directus يغير بضعة أشياء ببعض التعديلات.
00:05:45مخططك موجود بالفعل، لذا بدلاً من إعادة إنشائه، تقوم فقط بتوصيله.
00:05:50سير عمل مختلف تماماً هنا.
00:05:52Hasura رائع لخدمات GraphQL السريعة، لكن Directus يذهب إلى أبعد من ذلك بكثير.
00:05:58أنت تحصل على واجهات برمجة تطبيقات (APIs).
00:05:59نعم، نحن نحصل على ذلك، لكننا نحصل أيضاً على مساحة عمل للإدارة، وصلاحيات، وملفات، وأتمتة.
00:06:05وهنا الجزء الذي يهتم به معظم المطورين بعد تجربته، الصلاحيات.
00:06:10أنا لا أتحدث فقط عن مجرد قواعد هنا.
00:06:12نحن نتحدث عن تحكم حقيقي بدون إضافات خارجية.
00:06:15لذا إذا كانت مشكلتك هي "أحتاج إلى خلفية برمجية"، فلديك خيارات.
00:06:18أما إذا كانت مشكلتك هي "لا أريد إعادة بناء خلفيتي البرمجية مرة أخرى"، فهذا شيء مختلف.
00:06:23الآن، من الواضح أنه لا توجد أداة مثالية، ولكن هذه الأداة رائعة جداً.
00:06:26ما الذي وجدته رائعاً حقاً؟
00:06:28حسناً، الصلاحيات تعمل ببساطة.
00:06:29هذا مذهل.
00:06:30التدفقات (Flows) تزيل الكثير من العمل الروتيني الذي نقوم به.
00:06:32واجهة المستخدم كانت نظيفة وسريعة جداً، ومن السهل نشرها باستخدام Docker.
00:06:37علاوة على كل ذلك، فإنه يتوسع بشكل جيد للغاية.
00:06:39ولكن مع كل هذه الأشياء الجيدة، بالطبع، هناك دائماً هذه العيوب.
00:06:43لذا ستكون المقايضات في أشياء مثل التدفقات المتقدمة التي قد تستغرق وقتاً، أليس كذلك؟
00:06:46إذا كنت قد جربت N8N أو أي شيء آخر، فستفهم ذلك.
00:06:49الوثائق ليست متوفرة دائماً.
00:06:51وإذا قمت بالاستضافة الذاتية، فستحتاج إلى إدارة البنية التحتية بنفسك.
00:06:54بالإضافة إلى أن الإعدادات المعقدة يمكن أن تصبح فوضوية محلياً.
00:06:57Directus يزيل فقط نوعاً معيناً جداً من العمل المتكرر في الخلفية البرمجية.
00:07:00إذن هل يستحق Directus التجربة؟
00:07:02بالنسبة للكثيرين منا، على الأرجح نعم.
00:07:03يعتمد ذلك على ما نقوم به، خاصة إذا كان لديك بالفعل بيانات SQL، أو إذا كنت
00:07:07متعباً من إعادة بناء هذه الخلفيات الأساسية التي نقوم بها طوال الوقت مراراً وتكراراً، إذن نعم،
00:07:11هذا يمثل قيمة حقيقية.
00:07:13إنه يوفر الوقت، ويقلل من الصيانة، وتحتفظ بالتحكم في البيانات.
00:07:17مرة أخرى، إنه مفتوح المصدر.
00:07:19ونحن نتحكم في ذلك.
00:07:20متى لا تستخدم هذا؟
00:07:22حسناً، إذا كنت تعمل في مشروع TypeScript صارم، مثل Monorepo ضخم، فربما لا، أليس كذلك؟
00:07:26إذا لم يكن لديك قاعدة بيانات موجودة، فربما لا.
00:07:29وإذا كنت تريد تعريف كل شيء في الكود منذ البداية، فإن شيئاً مثل Payload
00:07:33سيكون منطقياً أكثر هنا.
00:07:34لكن إذا كنت تفكر الآن، "لحظة، هل يمكن لهذا أن يجلس فوق قاعدة بياناتي فقط؟"
00:07:38نعم، يمكنه ذلك.
00:07:39لذا قد يكون جديراً بالتجربة.
00:07:41إذا كنت تستمتع بالأدوات مفتوحة المصدر ونصائح البرمجة كهذه، تأكد من الاشتراك في
00:07:45قناة Better Stack.
00:07:46سنراكم في فيديو آخر.