مشاكل في إنشاء منشور وقفل الموضوع عبر الـ API

أقوم بقفل موضوع عبر واجهة برمجة التطبيقات (gem) وأستطيع قفله وفتحه إذا كان هذا هو الأمر الوحيد في السلسلة، ولكن عندما أنشئ مشاركة في الموضوع مسبقًا، وكان الأمر التالي هو قفله - فإنه ينشئ المشاركة، ثم يقفل الموضوع، لكنه يفتحه فورًا بعد ذلك!

هذا أمر غريب جدًا. إذا قمت فقط بإنشاء المشاركة، أو فقط بقفل الموضوع، فإن الأمر يعمل بشكل صحيح. لكن إذا حاولت القيام بكليهما، ينتهي الأمر بفتح الموضوع تلقائيًا في النهاية!

لقد قررت مؤقتًا عدم قفل الموضوع، لكنني فكرت في النشر هنا في حال كان الأمر يستحق التحقيق.

هل تقفل الموضوع فورًا بعد إنشاء منشور فيه؟ إذا كان الأمر كذلك، جرب الانتظار دقيقة ثم حاول قفله مرة أخرى لترَ ما إذا كان سيبقى مقفلًا. مجرد فكرة.

اكتشاف ممتاز، سأقوم بالتحقيق في هذا عندما تتاح لي الفرصة. دمج هذين استدعاءي الـ API في طلب واحد لا يتبع بدقة الطريقة المتبعة في واجهة المستخدم (لا يمكنك إنشاء موضوع جديد مقفل)، لذا من المرجح أن نقطة نهاية الـ API هذه لا تبحث عن علامة القفل، أو أنها تقوم افتراضيًا بإلغاء قفل الموضوع عند إنشائه.

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

لذا، ستحتاج مؤقتًا إلى إرسال طلبين منفصلين عبر واجهة برمجة التطبيقات (API): طلب POST إلى /posts.json، ثم إذا نجح ذلك، طلب PUT إلى /t/{id}/status.json.

مرحبًا بليك، الموضوع الذي كنت أحاول تجربته موجود بالفعل :slight_smile:

كانت هذه هي خطواتي:

  bot.create_post(topic_id, post_content)
  bot.switch_to_master_bot!("system")
  bot.lock_topic("", topic_id)

  def create_post(topic_id, post_content)
    @client.create_post(
      topic_id: "#{topic_id}",
      raw: "#{post_content}",
    )
  end

  def lock_topic(slug, topic_id)
    params = { status: 'closed', enabled: true }
    @client.change_topic_status(slug, topic_id, params)
  end

أنا أستخدم مكتبة Discourse API Gem.

هل تقصد أن الكود أعلاه يجب أن يعمل (أو أنه يعمل لديك)؟

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

هل تستخدم جيم (Gem) واجهة برمجة التطبيقات نقاط النهاية الصحيحة/المنفصلة، بليك؟ (كنت أظن أنها تفعل ذلك؟)

تُعد طريقتا client.create_post و client.change_topic_status جزءًا من جيم واجهة برمجة التطبيقات :slight_smile:

نعم، تستخدم هذه الطرق نقاط النهاية الصحيحة :slightly_smiling_face:

إذن يجب أن يعمل؟ (لكنه لا يعمل :sob:)

لقد اختبرت الكود الخاص بك محليًا وهو يعمل بشكل جيد من جانبي. ما الذي لا يعمل؟ أفترض أن المنشور يتم إنشاؤه، لكن الموضوع لا يُغلق فحسب؟ إذا كان الأمر كذلك، يرجى استخدام puts وطباعة نتيجة @client.change_topic_status(slug, topic_id, params)؟

كملاحظة جانبية، عند النظر إلى الكود في مكتبة API (gem)، نلاحظ أننا لا نستخدم المتغير slug على الإطلاق، لذا سأقوم بإجراء تحديث لإزالته.