Relatório de Progresso até agora:
-
Confirmado que métodos estáticos de whitelisting de
TopicQuery, comoadd_custom_param_handlerouextra_options_whitelist, não estão disponíveis como métodos de classe na minha versão do Discourse, então essas abordagens foram abandonadas. -
Implementado um patch para
ListController#build_topic_list_optionspara injetar meus parâmetros de URL personalizados (por exemplo,market_item_statuses,market_price_min) no hashoptsantes queTopicQuery.newseja chamado. -
Essa parte agora está funcionando! Quando faço uma solicitação como
/c/market/5/l/latest.json?filter=defaultmarket_item_statuses=Available, meus logs do servidor confirmam a injeção:[TecencMarket_ListControllerExt_BuildOptsV3] Injetado em opts: market_item_statuses = AvailablePortanto,
TopicQuery.new(user, opts)agora está recebendooptscontendo meus parâmetros personalizados.
Ponto de bloqueio atual: Erro 500 & Filtro não alcançado
Apesar dos parâmetros agora estarem sendo passados corretamente para o inicializador de TopicQuery, ainda recebo um Erro Interno do Servidor 500 quando a requisição inclui esses parâmetros de mercado personalizados.
Para isolar isso, simplifiquei meu bloco de TopicQuery.add_custom_filter(:"tecenc_market_filters") ao máximo.
# plugin.rb - Bloco de filtro personalizado simplificado atual
if ::TopicQuery.respond_to?(:add_custom_filter)
::TopicQuery.add_custom_filter(:"tecenc_market_filters") do |topics, topic_query|
relation_original = topics
opts = topic_query.options
prefixo_log = "[TecencMarket_SimplifiedFilter_V1.1_Test]" # Meu prefixo de debug
Rails.logger.info "#{prefixo_log} Opts recebidos pelo TopicQuery: #{opts.inspect}"
if opts[:market_item_statuses].present?
Rails.logger.info "#{prefixo_log} 'market_item_statuses' ESTÁ PRESENTE em opts: #{opts[:market_item_statuses]}"
else
Rails.logger.info "#{prefixo_log} 'market_item_statuses' NÃO ESTÁ PRESENTE em opts."
end
Rails.logger.info "#{prefixo_log} Retornando relação original de tópicos."
relation_original # retorno implícito
end
Rails.logger.info "[TecencMarket] Aplicado filtro personalizado SIMPLIFICADO (V1.1_Test)."
end
Observações com esse filtro simplificado:
-
Requisições sem meu parâmetro de filtro personalizado (por exemplo,
/c/market/5/l/latest.json?filter=default):-
O log do filtro simplificado é exibido corretamente:
[TecencMarket_SimplifiedFilter_V1.1_Test] Opts recebidos pelo TopicQuery: {:category=>5, :filter=>"default", ...} [TecencMarket_SimplifiedFilter_V1.1_Test] 'market_item_statuses' NÃO ESTÁ em opts. [TecencMarket_SimplifiedFilter_V1.1_Test] Retornando relação original de tópicos. -
A página carrega com um
200 OK.
-
-
Requisições com meu parâmetro de filtro personalizado (por exemplo,
/c/market/5/l/latest.json?filter=defaultmarket_item_statuses=Available):-
O log do patch do
ListControlleraparece:[TecencMarket_ListControllerExt_BuildOptsV3] Injected into opts: market_item_statuses = Available -
Um
Completed 500 Internal Server Error in ...msocorre imediatamente após. -
Crucialmente, NENHUM log do interior do bloco de filtro simplificado (sem as linhas
[TecencMarket_SimplifiedFilter_V1.1_Test]...) aparece para essa requisição que falha.
-
Isso indica que o erro 500 acontece após o TopicQuery ser inicializado com o hash opts (que agora contém meus parâmetros personalizados), mas antes ou exatamente no momento em que o mecanismo central do Discourse TopicQuery#apply_custom_filters tenta executar meu bloco de filtro registrado (e agora extremamente simples).
Estou tendo dificuldade em isolar a exceção Ruby específica e o backtrace completo do development.log que precede imediatamente a linha “Completed 500…” para as requisições que falham (os trechos de log que reuni mostram apenas a linha 500, mas não a mensagem de erro detalhada anterior a ela).
Pergunta de acompanhamento:
Dado que:
-
Parâmetros personalizados agora estão sendo injetados com sucesso em
TopicQuery.optionspelo patch doListController. -
Um erro 500 ocorre quando esses parâmetros personalizados estão presentes em
opts. -
Esse erro 500 acontece antes mesmo de o bloco de filtro personalizado extremamente simplificado (que apenas registra e retorna a relação original) executar sua primeira linha de código na requisição com parâmetros personalizados.
-
Isso está na versão
3.5.0.beta3-devdo Discourse.
O que poderia estar causando o TopicQuery ou o método apply_custom_filters a apresentarem erro antes de invocar um filtro personalizado registrado, especificamente quando o hash options contém essas chaves específicas do plugin? A erro LocalJumpError que suspeitávamos ainda pode ser relevante em um nível inferior na forma como o apply_custom_filters lida com a iteração ou chamada dos blocos de filtro, mesmo que meu bloco simplificado seja apenas um retorno implícito?
Qualquer orientação sobre o que verificar a seguir no comportamento do TopicQuery com esses tipos de opções personalizadas, ou conselhos sobre como obter de forma robusta o backtrace completo para o erro 500 nesse cenário, seria imensamente útil.