Discourse-events pode causar erro 500 ao excluir um tópico em desenvolvimento: Calendar::Extractor não inicializado

Enquanto testava algumas alterações não relacionadas à exclusão de tópicos em uma instância local de desenvolvimento, a exclusão de um tópico retornou um 500 Internal Server Error.

A instância de desenvolvimento que gerou o erro estava executando exatamente este commit do Discourse:

A requisição foi:

DELETE /t/35

e a exceção está vindo do callback :post_destroyed do discourse-events:

NameError (uninitialized constant DiscourseEvents::Calendar::Extractor)

plugins/discourse-events/plugin.rb:639:in 'block (2 levels) in Plugin::Instance#activate!'
lib/plugin/instance.rb:676:in 'block in Plugin::Instance#on'
lib/discourse_event.rb:13:in 'block in DiscourseEvent.trigger'
lib/discourse_event.rb:12:in 'DiscourseEvent.trigger'
lib/post_destroyer.rb:91:in 'PostDestroyer#destroy'
app/controllers/topics_controller.rb:818:in 'TopicsController#destroy'

O callback relevante parece estar tentando chamar:

DiscourseEvents::Calendar::Extractor.destroy(post)

A página completa de erro relata:

NameError (uninitialized constant DiscourseEvents::Calendar::Extractor)

Consequentemente, o navegador recebe um 500, mesmo que PostDestroyer#destroy já tenha alcançado o ponto em que dispara :post_destroyed, o que significa que a exclusão pode já ter sido aplicada antes que o callback lançasse a exceção.

Isso ocorreu em desenvolvimento. DiscourseEvents::Calendar::Extractor é normalmente fornecido por events, então estou me perguntando se isso poderia estar relacionado ao recarregamento em modo de desenvolvimento/estado do plugin, em vez de a implementação em si estar ausente.

Eu estava trabalhando em código de exclusão de tópicos não relacionado na época, mas a exceção em si está inteiramente dentro do manipulador :post_destroyed do discourse-events.

Alguém mais encontrou DiscourseEvents::Calendar::Extractor se tornando indefinido em uma instância de desenvolvimento? Isso poderia estar relacionado ao recarregamento em desenvolvimento/estado do plugin, ou o callback :post_destroyed deveria carregar o extrator de maneira diferente?

1 curtida

Obrigado por reportar este problema. Eu o reproduzi em minha máquina local, e a boa notícia é que ele deve ocorrer apenas durante o desenvolvimento, quando um recarregamento de código é acionado.

Tenho um PR para corrigir o carregamento em desenvolvimento:

https://github.com/discourse/discourse/pull/43359

2 curtidas