هل فكر أحد في ربط Hasura بقاعدة بيانات Postgres الخاصة بـ Discourse للحصول على واجهة أمامية أكثر تخصيصًا (أو محدودة)؟

  • جربتها، فكرة جيدة
  • جربتها، فكرة سيئة
  • لم أجربها، لكنها تبدو مثيرة للاهتمام
  • لماذا تضيع وقتك في هذا؟
  • لا أعرف…
  • آخر
0 voters

ممتع جداً، هذا بالضبط ما فعلته قبل بضعة أيام!
أعمل مع Hasura/nuxt.js منذ عام على مشاريع مختلفة.
Hasura قوي جداً، والميزات القادمة واعدة للغاية!

أعجبني منتدى Discourse كثيراً (لكنني لا أعرف Ruby و Ember)، لذا حاولت ربط Hasura به.

بما أنني لست مطور Ruby، احتجت إلى تثبيته، لكن واجهت بعض المشاكل في تثبيت بيئة التطوير على جهاز Mac. أعاني مع gem cppjieba_rb

لذلك قمت فقط بأخذ هذا التصدير وأعدته في PostgreSQL و Hasura.

يبدو أن جميع الجداول تم استيرادها. هل هناك عرض واحد فقط؟ (badge_posts)
كما قمت بتتبع جميع علاقات المفاتيح الخارجية، لذا يمكنني إجراء نوع الاستعلام هذا:

{
  posts {
    id
    user_id
    bookmarks {
      id
      name
    }
    uploads {
      id
      url
    }
  }
}

هذا هو المكان الذي وصلت إليه الآن…

واو، واعد. سأحاول بدء حاوية Hasura في بيئة حية وأبلغ عما أحصل عليه. يمكننا مقارنة ملاحظاتنا.

للعلم، للحصول على واجهة psql قيد التشغيل لخادم قاعدة بيانات Postgres الخاص بـ Discourse قيد التشغيل، يمكنك تنفيذ الأمر docker exec --user postgres -it app psql -d discourse. ولإجراء نسخة احتياطية كاملة، يمكنك تنفيذ الأمر التالي (لاحظ أنني قمت بإزالة خيار -t هنا لأنه غير مطلوب في هذه الحالة):

docker exec --user postgres -i app pg_dump -Fc -d discourse > discourse.sql.pgcustom

يجب أن تتمكن الآن من استعادة هذه النسخة إلى خادم Postgres معتمد على Docker (docker pull postgres:10.12) وربطه بـ Hasura لأغراض التطوير (وهو مفيد حقًا فقط على مستوى القراءة فقط لأنه أصبح قاعدة بيانات منفصلة الآن).

لتنفيذ ذلك على مستوى الإنتاج، سأقوم بضبط البيئة التي يوفرها Discourse واستضافة قاعدة بياناتك في خدمة مثل Amazon RDS. ستتمكن حينها من الوصول بسهولة لقراءة وكتابة البيانات في تلك القاعدة.

لإعادة استعادة النسخة المذكورة أعلاه محليًا:

  1. قم بإنشاء شبكة Docker:
docker network create discourse-dev-net
  1. في نافذة طرفية أولى:
docker run --rm -it -p 2345:5432 -e POSTGRES_DB=discourse -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres --name=discourse-dev-pg --network=discourse-dev-net postgres:10.12

(إذا كنت تريد تشغيله في الخلفية، أعتقد أنه يمكنك ببساطة استبدال -it بـ -d؛ الخيار -p 2345:5432 اختياري ولكنه مريح إذا كنت تريد الاتصال بـ Postgres من جهازك المضيف)

  1. في نافذة طرفية أخرى، قم بإنشاء مستخدم discourse في Postgres (مطلوب للنسخة الاحتياطية):
docker run --rm -it -v /path/to/discourse.sql.pgcustom:/discourse.sql.pgcustom:ro -e PGPASSWORD=postgres --network=discourse-dev-net postgres:10.12 createuser -h discourse-dev-pg -U postgres -P discourse

(ثم اكتب كلمة المرور مرتين عند المطالبة، لقد استخدمت كلمة المرور discourse)

  1. قم بتنفيذ عملية الاستعادة:
docker run --rm -i -v /home/dean/Downloads/discourse.sql.pgcustom:/discourse.sql.pgcustom:ro -e PGPASSWORD=postgres --network=discourse-dev-net postgres:10.12 pg_restore -h discourse-dev-pg -U postgres -d discourse /discourse.sql.pgcustom
  1. للاتصال بـ Hasura بالأعلى:
docker run --rm -it --network=discourse-dev-net -p 1234:1234 -e HASURA_GRAPHQL_ENABLE_CONSOLE=true -e HASURA_GRAPHQL_DATABASE_URL=postgres://postgres:postgres@discourse-dev-pg:5432/discourse hasura/graphql-engine:v1.2.1 graphql-engine serve --server-port=1234

(يمكنك الآن زيارة http://localhost:1234)

بعد تجربة قاعدة البيانات الموروثة، فإن ما يقوله @Falco في هذا المنشور واضح جدًا.

لا يتم استخدام سوى قدر ضئيل من قوة PostgreSQL. فمعظم المنطق يُنفَّذ في بيئة Ruby.

لذا فإن استنتاجي هو أن هذا لا يفيد بحد ذاته بشكل كبير.

من النهج الأخرى استخدام وظيفة المخطط البعيد في Hasura، ولكن لتحقيق ذلك، يحتاج Discourse إلى واجهة برمجة تطبيقات GraphQL وليس REST… لذا فهو أيضًا لا يفيد بحد ذاته بشكل كبير.

لكن هناك إمكانية لتغليف واجهات برمجة تطبيقات REST الموجودة مسبقًا ضمن طبقة GraphQL. وهذا يبدو أكثر واعدة من السابقتين (أو بالأحرى، عند دمجهما معًا). في هذه المقالة، يشيرون إلى مستودع يحتوي على كود أساسي للبدء.

شكرًا على ردودكم.

لا أتقن Docker جيدًا، لكن مشكلتي ليست هناك. بما أنني لا أستطيع إعداد بيئة تطوير لـ Discourse، فليس لدي قاعدة بيانات… فقط هذا الملف الفارغ.

على أي حال، قمت للتو برفع هذا الملف إلى مثيل على Heroku! لذا يمكنكم تجربته مباشرة :slight_smile:
انتقل إلى هذا GraphiQL عبر الإنترنت، واضبط نقطة النهاية هذه:
https://discourse-hasura.herokuapp.com/v1/graphql
يمكنكم اللعب به! لا توجد كلمة مرور للمسؤول، لذا يمكنكم أيضًا إجراء عمليات التعديل والاشتراكات…

هذا ما اكتشفته عند اختبار Discourse على Hasura! جميع الدوال المخصصة، والمحفزات، والحقول المحسوبة… مُعرَّفة في Ruby. وهذا سيئ من حيث قابلية النقل :confused:

غير مفيد، ينقص واجهة برمجة تطبيقات GraphQL الخاصة بـ Discourse. لكن هذه ميزة قوية في Hasura. أستخدمها كثيرًا مع واجهة برمجة تطبيقات GraphQL مخصصة لـ Stripe. إذا حصلنا على واجهة برمجة تطبيقات GraphQL لـ Discourse، يمكننا ربطها بـ GraphQL الخاص بنا باستخدام المخطط البعيد!

نعم، لكننا يجب أن نبني كل المخطط والمحللات. الكثير من العمل!
أعتقد أنه من الأفضل استخدام واجهة برمجة التطبيقات المفتوحة لـ Discourse هنا: https://docs.discourse.org/ (في زر التنزيل)، واستخدامها مع مولد GraphQL مثل https://graphql-mesh.com/docs/handlers/openapi
سأحاول في أقرب وقت ممكن…

حسناً، لا يمكنني الانتظار! جربت استخدام graphql-mesh.
إذن، يبدو أن ملف openapi الموجود تحت زر التحميل في https://docs.discourse.org/ تالف :confused:
لقد اختبرت صحة الملف هنا مع هذا المخرجات:

فشل التحقق من مخطط Swagger. 
  البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/3
    البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/3
      خاصية مطلوبة مفقودة: schema في #/
      خاصية مطلوبة مفقودة: content في #/
    خاصية مطلوبة مفقودة: $ref في #/paths//page_view_total_reqs/get/parameters/3
  البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/2
    البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/2
      خاصية مطلوبة مفقودة: schema في #/
      خاصية مطلوبة مفقودة: content في #/
    خاصية مطلوبة مفقودة: $ref في #/paths//page_view_total_reqs/get/parameters/2
  البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/1
    البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/1
      خاصية مطلوبة مفقودة: schema في #/
      خاصية مطلوبة مفقودة: content في #/
    خاصية مطلوبة مفقودة: $ref في #/paths//page_view_total_reqs/get/parameters/1
  البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/0
    البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/0
      خاصية مطلوبة مفقودة: schema في #/
      خاصية مطلوبة مفقودة: content في #/
    خاصية مطلوبة مفقودة: $ref في #/paths//page_view_total_reqs/get/parameters/0
 
فشل التحقق من كائن JSON

خطأ: فشل التحقق من مخطط Swagger. 
  البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/3
    البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/3
      خاصية مطلوبة مفقودة: schema في #/
      خاصية مطلوبة مفقودة: content في #/
    خاصية مطلوبة مفقودة: $ref في #/paths//page_view_total_reqs/get/parameters/3
  البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/2
    البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/2
      خاصية مطلوبة مفقودة: schema في #/
      خاصية مطلوبة مفقودة: content في #/
    خاصية مطلوبة مفقودة: $ref في #/paths//page_view_total_reqs/get/parameters/2
  البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/1
    البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/1
      خاصية مطلوبة مفقودة: schema في #/
      خاصية مطلوبة مفقودة: content في #/
    خاصية مطلوبة مفقودة: $ref في #/paths//page_view_total_reqs/get/parameters/1
  البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/0
    البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/0
      خاصية مطلوبة مفقودة: schema في #/
      خاصية مطلوبة مفقودة: content في #/
    خاصية مطلوبة مفقودة: $ref في #/paths//page_view_total_reqs/get/parameters/0
 
فشل التحقق من كائن JSON
    at o (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:73766)
    at https://apitools.dev/swagger-parser/online/js/bundle.min.js:17:227596

خطأ في الصيغة: فشل التحقق من مخطط Swagger. 
  البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/3
    البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/3
      خاصية مطلوبة مفقودة: schema في #/
      خاصية مطلوبة مفقودة: content في #/
    خاصية مطلوبة مفقودة: $ref في #/paths//page_view_total_reqs/get/parameters/3
  البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/2
    البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/2
      خاصية مطلوبة مفقودة: schema في #/
      خاصية مطلوبة مفقودة: content في #/
    خاصية مطلوبة مفقودة: $ref في #/paths//page_view_total_reqs/get/parameters/2
  البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/1
    البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/1
      خاصية مطلوبة مفقودة: schema في #/
      خاصية مطلوبة مفقودة: content في #/
    خاصية مطلوبة مفقودة: $ref في #/paths//page_view_total_reqs/get/parameters/1
  البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/0
    البيانات لا تتطابق مع أي مخطط من 'oneOf' في #/paths//page_view_total_reqs/get/parameters/0
      خاصية مطلوبة مفقودة: schema في #/
      خاصية مطلوبة مفقودة: content في #/
    خاصية مطلوبة مفقودة: $ref في #/paths//page_view_total_reqs/get/parameters/0
 
فشل التحقق من كائن JSON
    at Function.o [as syntax] (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:73766)
    at validateSchema (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:5021)
    at SwaggerParser.validate (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:3171)

خطأ التحقق من z-schema: فشل التحقق من كائن JSON
    at ZSchema.getLastError (https://apitools.dev/swagger-parser/online/js/bundle.min.js:17:211187)
    at validateSchema (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:4925)
    at SwaggerParser.validate (https://apitools.dev/swagger-parser/online/js/bundle.min.js:1:3171)

لذلك بحثت عن ملف openapi أو swagger آخر لـ discourse api. لقد وجدت هذا الملف فقط.
هو تالف قليلاً في السطر 426، لكنني أصلحته.

بعد إعداد graphql-mesh، حصلت على واجهة برمجة تطبيقات graphql تعمل! لكن…
هذا الملف swagger غير مكتمل أو قديم جداً. هناك فقط 4 استعلامات، لا توجد عمليات تعديل، ونوع المستخدم يحتوي على عدد قليل من الخصائص… :confused:

هل يوجد في مكان ما ملف swagger أو openapi لـ discourse؟

عمل يبدو واعدًا. أحسنت! سيكون من الجيد لو التزم Discourse ببعض المواصفات المفتوحة مثل Swagger/OpenAPI. أتمنى أن تجد المعلومات التي تبحث عنها.

لا أملك وقتًا كافيًا لهذا الآن، لكن سأعود للتحقق في وقت لاحق.

عمل مثير للاهتمام. هل لديك هذا الكود منشورًا في أي مكان لمعرفة الاستعلامات الممكنة في GraphQL في الحالة الحالية؟

لقد حاولت التصويت على “آخر” لكن لم ينجح الأمر.

نعتذر عن التأخر في الرد. لقد فوّت سؤالك.
نعم، يمكنك التفاعل مع نقطة نهاية GraphQL الخاصة بـ Discourse Hasura: