Filtros de Tópicos Personalizados: Parâmetros de URL Não Chegam ao `TopicQuery.options`

Relatório de Progresso até agora:

  1. Confirmado que métodos estáticos de whitelisting de TopicQuery, como add_custom_param_handler ou extra_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.

  2. Implementado um patch para ListController#build_topic_list_options para injetar meus parâmetros de URL personalizados (por exemplo, market_item_statuses, market_price_min) no hash opts antes que TopicQuery.new seja chamado.

  3. 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 = Available
    
    

    Portanto, TopicQuery.new(user, opts) agora está recebendo opts contendo 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 ListController aparece: [TecencMarket_ListControllerExt_BuildOptsV3] Injected into opts: market_item_statuses = Available

    • Um Completed 500 Internal Server Error in ...ms ocorre 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:

  1. Parâmetros personalizados agora estão sendo injetados com sucesso em TopicQuery.options pelo patch do ListController.

  2. Um erro 500 ocorre quando esses parâmetros personalizados estão presentes em opts.

  3. 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.

  4. Isso está na versão 3.5.0.beta3-dev do 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.