Récemment, nous avons rencontré un problème avec le plugin de notation où des données obsolètes ou vides étaient transmises aux webhooks. Il s’avère que la raison en est que les DiscourseEvent sont utilisés pour mettre en file d’attente les hooks.
Cela provoque la mise en file d’attente du webhook avant que certains ou tous les plugins n’exécutent leurs modifications, car nous n’avons aucun mécanisme pour garantir l’ordre d’exécution. En particulier, le code principal a la priorité.
Je propose que ces webhooks soient mis en file d’attente après l’appel à DiscourseEvent.trigger, de sorte qu’à ce stade, tous les plugins aient exécuté leurs modifications sur le modèle.
Moi et @angus avons discuté de cela et trouvé une solution très simple à ce problème. Elle semble fonctionner correctement.
Déplacer le code on() en dehors de after_initialize résout le problème. Je pense que c’est ainsi que tous les plugins devraient procéder. Je crois que le problème venait de notre côté.
La raison pour laquelle cela fonctionne est que le contrôle entre dans plugin.rb avant que les initialisateurs Rails ne soient exécutés, et donc les callbacks on() sont enregistrés avant que les webhooks ne soient mis en file d’attente.