Ao construir um plugin com filtros personalizados na lista de tópicos (por exemplo, por preço, localização) usando parâmetros de consulta na URL. A URL atualiza corretamente (por exemplo, ...?market_item_statuses=Available), mas os parâmetros não aparecem em topic_query.options no servidor.
Configuração:
-
Registro de parâmetros no lado do cliente (
tecenc-discovery-params.js):// tecenc-discovery-params.js import { apiInitializer } from "discourse/lib/api"; export default apiInitializer("1.37.3", (api) => { const MARKET_PARAMS_KEYS = [ "market_price_min", "market_price_max", "market_location", "market_conditions", "market_warranty", "market_item_statuses" ]; MARKET_PARAMS_KEYS.forEach(paramKey => { api.addDiscoveryQueryParam(paramKey, { replace: true, refreshModel: true }); }); }); -
Tentativa de whitelist do lado do servidor (
plugin.rb):# plugin.rb module ::Tecenc MARKET_PARAMS_KEYS = [ :market_price_min, :market_price_max, :market_location, :market_conditions, :market_warranty, :market_item_statuses ].freeze end # after_initialize do if SiteSetting.tecenc_enabled? if defined?(::TopicQuery.add_custom_param_handler) ::Tecenc::MARKET_PARAMS_KEYS.each do |param_key| ::TopicQuery.add_custom_param_handler(param_key) { |value| value } # Simplificado para brevidade end Rails.logger.info "[Tecenc] Registrado com add_custom_param_handler." elsif defined?(::TopicQuery) && ::TopicQuery.methods.include?(:extra_options_whitelist) current_whitelist = ::TopicQuery.extra_options_whitelist || [] new_whitelist = (current_whitelist + ::Tecenc::MARKET_PARAMS_KEYS).uniq ::TopicQuery.extra_options_whitelist(*new_whitelist) Rails.logger.info "[Tecenc] expandida a whitelist de opções extras." else Rails.logger.warn "[Tecenc] AVISO_DO_PLUGIN: Não foi possível encontrar método para whitelist de parâmetros em TopicQuery." end -
Lógica de filtragem no servidor (
plugin.rb):# plugin.rb (dentro de after_initialize / se habilitado) ::TopicQuery.add_custom_filter(:"tecenc_filters") do |topics, topic_query| opts = topic_query.options Rails.logger.info "[Tecenc_TopicQuery] Opts: #{opts.inspect}" # LOG CRÍTICO # market_params_present = ::Tecenc::MARKET_PARAMS_KEYS.any? { |p| opts[p].present? } # if market_params_present # # ... lógica de filtragem usando opts[chave] ... # end topics # ou tópicos filtrados end
O Problema (Logs):
-
Falha na whitelist de parâmetros:
[Tecenc] AVISO_DO_PLUG: Não foi possível encontrar um método adequado (add_custom_param_handler ou extra_options_whitelist) para whitelist de parâmetros personalizados para TopicQuery. -
optsnoTopicQuery.add_custom_filterestá ausente dos nossos parâmetros personalizados:
Quando a URL é...?market_item_statuses=Available, o log mostra:[Tecenc_TopicQuery] Opts: {:category=>5, :filter=>"default", :topic_ids=>nil, :category_id=>5} ```Nossos `market_item_statuses` (e outros parâmetros personalizados) não estão presentes.
Nosso Ambiente:
Perguntas:
- Qual é a melhor prática atual para garantir que os parâmetros de consulta URL personalizados cheguem ao
topic_query.optionsem versões recentes do Discourse? - Por que nossas tentativas de usar
add_custom_param_handlerouextra_options_whitelistpodem estar falhando com o aviso “Could not find a suitable method”? - Existe uma abordagem alternativa para o registro de parâmetros com
TopicQueryque devemos usar?
Qualquer ajuda seria muito apreciada!