Como pesquisar usuário por nome com paginação

Temos uma aplicação frontend que usa o Discourse como núcleo e queremos implementar a busca de usuários com paginação.

Atualmente, não vejo que esta API (/search?q=name) suporte type_filter: user. Alguma ideia de como implementar isso?

Esta é uma solução alternativa que implementamos.

  1. Abra search_controller.rb e adicione esta linha.
def show
    @search_term = params.permit(:q)[:q]

    // permite o type_filter a partir dos parâmetros da query
    @type_filter = params.permit(:type_filter)[:type_filter] || 'topic'

   ...
  1. Adicione offset ao search.rb
  // está por volta da linha 780
  def user_search
    return if SiteSetting.hide_user_profiles_from_public && !@guardian.user

    users = User.includes(:user_search_data)
      .references(:user_search_data)
      .where(active: true)
      .where(staged: false)
      .where("user_search_data.search_data @@ #{ts_query("simple")}")
      .order("CASE WHEN username_lower = '#{@original_term.downcase}' THEN 0 ELSE 1 END")
      .order("last_posted_at DESC")
      .offset(offset) // esta linha
      .limit(limit)

    users.each do |user|
      @results.add(user)
    end
  end

Assim, você poderá pesquisar usuários usando /search?q=name&type_filter=user&page=1. Por padrão, serão retornados 50 usuários, e use page para obter mais.

Esperamos que isso ajude! :grin:

3 curtidas

Ótima ideia! Nós também trabalhamos com a API do Discourse e, ao tentar usar a API de busca, encontramos esse problema também. Posso ajudar a resolver isso.

3 curtidas