post_created、post_edited Webhookのエンキュー問題

最近、評価プラグインで、古くなったデータや空のデータがウェブフックに渡される問題が発生しました。その原因は、フックのキューイングに DiscourseEvent に依存している点にあります。

これにより、どのプラグインがいつ実行されるかを保証する仕組みがないため、一部の、あるいはすべてのプラグインがモデルに対する変更を実行する前にウェブフックがキューイングされてしまいます。特に、コアコードの方が優先度が高くなります。

そこで提案したいのは、これらのウェブフックを DiscourseEvent.trigger の呼び出し後にキューイングすることです。そうすれば、その時点で全プラグインがモデルへの変更を完了していることになります。

ご意見をお聞かせください。

変更については PR を作成してみてください。原則としては問題なさそうです。

@angus と議論した結果、この問題に対する非常にシンプルな解決策を見つけました。現在、問題なく動作しているようです。

on() のコードを after_initialize の外に記述することで、この問題が解決します。すべてのプラグインはこのように実装すべきだと考えます。問題は当側にあったようです。

これが機能する理由は、Rails のイニシャライザが実行される前に plugin.rb の制御が入るため、on() コールバックが Webhook がキューイングされる前に登録されるからです。