Recentemente, abbiamo riscontrato un problema con il plugin delle valutazioni in cui dati obsoleti o vuoti venivano inviati ai webhook. Si è scoperto che la causa è l’utilizzo di DiscourseEvent per l’inserimento delle code dei hook.
Ciò fa sì che il webhook venga accodato prima che alcuni o tutti i plugin eseguano le loro modifiche, poiché non disponiamo di alcun meccanismo per garantire l’ordine di esecuzione. In particolare, il codice core ha priorità più elevata.
Propongo che questi webhook vengano accodati dopo la chiamata a DiscourseEvent.trigger, in modo che, a quel punto, tutti i plugin abbiano completato le loro modifiche al modello.
Io e @angus ne abbiamo discusso e abbiamo trovato una soluzione molto semplice a questo problema. Sembra funzionare bene.
Spostare il codice di on() fuori da after_initialize risolve il problema. Credo che tutti i plugin dovrebbero farlo così. Penso che il problema fosse dalla nostra parte.
Il motivo per cui questo funziona è che il controllo entra in plugin.rb prima che vengano eseguiti gli initializers di Rails e, di conseguenza, i callback on() vengono registrati prima che i webhook vengano accodati.