diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 433ef60d890..b87c4f6964f 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -288,43 +288,12 @@ class UsersController < ApplicationController end def search_users - term = (params[:term] || "").strip.downcase topic_id = params[:topic_id] topic_id = topic_id.to_i if topic_id - sql = "select username, name, email from users u " - if topic_id - sql << "left join (select distinct p.user_id from posts p where topic_id = :topic_id) s on - s.user_id = u.id " - end + results = UserSearch.search term, topic_id - if term.length > 0 - sql << "where username_lower like :term_like or - to_tsvector('simple', name) @@ - to_tsquery('simple', - regexp_replace( - regexp_replace( - cast(plainto_tsquery(:term) as text) - ,'\''(?: |$)', ':*''', 'g'), - '''', '', 'g') - ) " - - end - - sql << "order by case when username_lower = :term then 0 else 1 end asc, " - if topic_id - sql << " case when s.user_id is null then 0 else 1 end desc, " - end - - sql << " case when last_seen_at is null then 0 else 1 end desc, last_seen_at desc, username asc limit(20)" - - results = User.exec_sql(sql, topic_id: topic_id, term_like: "#{term}%", term: term) - results = results.map do |r| - r["avatar_template"] = User.avatar_template(r["email"]) - r.delete("email") - r - end render :json => results end diff --git a/app/models/user_search.rb b/app/models/user_search.rb new file mode 100644 index 00000000000..c746d8763a2 --- /dev/null +++ b/app/models/user_search.rb @@ -0,0 +1,38 @@ +class UserSearch + + def self.search term, topic_id + sql = "select username, name, email from users u " + if topic_id + sql << "left join (select distinct p.user_id from posts p where topic_id = :topic_id) s on + s.user_id = u.id " + end + + if term.length > 0 + sql << "where username_lower like :term_like or + to_tsvector('simple', name) @@ + to_tsquery('simple', + regexp_replace( + regexp_replace( + cast(plainto_tsquery(:term) as text) + ,'\''(?: |$)', ':*''', 'g'), + '''', '', 'g') + ) " + + end + + sql << "order by case when username_lower = :term then 0 else 1 end asc, " + if topic_id + sql << " case when s.user_id is null then 0 else 1 end desc, " + end + + sql << " case when last_seen_at is null then 0 else 1 end desc, last_seen_at desc, username asc limit(20)" + + results = User.exec_sql(sql, topic_id: topic_id, term_like: "#{term}%", term: term) + results = results.map do |r| + r["avatar_template"] = User.avatar_template(r["email"]) + r.delete("email") + r + end + end + +end \ No newline at end of file