fuzzy admin user search (#741)

Co-authored-by: Echo <github@3kh0.net>
This commit is contained in:
Fox Ellison-Taylor 2025-12-28 13:24:47 -06:00 committed by GitHub
parent 220b0afe7e
commit aee56d48ce
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 95 additions and 1 deletions

View file

@ -22,6 +22,99 @@ module Api
}
end
def get_user_by_email
email = params[:email]
if email.blank?
render json: { error: "bro dont have a email" }, status: :unprocessable_entity
return
end
email_record = EmailAddress.find_by email: email
if email_record.nil?
render json: { error: "email not found" }, status: :not_found
return
end
render json: {
user_id: email_record.user_id
}
end
def search_users_fuzzy
query = params[:query]
if query.blank?
render json: { error: "bro dont have a query" }, status: :unprocessable_entity
return
end
user_search_query = <<-SQL
SELECT
*
FROM (
SELECT
users.*,
(
CASE WHEN users.id::text = :query THEN 1000 ELSE 0 END +
CASE WHEN users.slack_uid = :query THEN 1000 ELSE 0 END +
CASE
WHEN users.username ILIKE :query THEN 100
WHEN users.username ILIKE :query || '%' THEN 50
WHEN users.username ILIKE '%' || :query || '%' THEN 10
ELSE 0
END +
CASE
WHEN users.github_username ILIKE :query THEN 100
WHEN users.github_username ILIKE :query || '%' THEN 50
WHEN users.github_username ILIKE '%' || :query || '%' THEN 10
ELSE 0
END +
CASE
WHEN users.slack_username ILIKE :query THEN 100
WHEN users.slack_username ILIKE :query || '%' THEN 50
WHEN users.slack_username ILIKE '%' || :query || '%' THEN 10
ELSE 0
END +
CASE
WHEN email_addresses.email ILIKE :query THEN 100
WHEN email_addresses.email ILIKE :query || '%' THEN 50
WHEN email_addresses.email ILIKE '%' || :query || '%' THEN 10
ELSE 0
END
) AS rank_score,
email_addresses.email
FROM
users
INNER JOIN email_addresses ON users.id=email_addresses.user_id
WHERE
users.id::text = :query
OR users.slack_uid = :query
OR users.username ILIKE '%' || :query || '%'
OR users.github_username ILIKE '%' || :query || '%'
OR users.slack_username ILIKE '%' || :query || '%'
OR email_addresses.email ILIKE '%' || :query || '%'
) AS ranked_users
WHERE
rank_score > 0
ORDER BY
rank_score DESC,
username ASC
LIMIT 10
SQL
sanitized_query = ActiveRecord::Base.sanitize_sql([ user_search_query, query: query ])
result = ActiveRecord::Base.connection.execute(sanitized_query)
columns = result.fields
rows = result.to_a.map { |row| columns.zip(row).to_h }
render json: {
columns: columns,
rows: rows
}
end
def get_users_by_ip
user_ip = params[:ip]

View file

@ -197,6 +197,8 @@ Rails.application.routes.draw do
get "user/stats", to: "admin#user_stats"
get "user/projects", to: "admin#user_projects"
get "user/trust_logs", to: "admin#trust_logs"
post "user/get_user_by_email", to: "admin#get_user_by_email"
post "user/search_fuzzy", to: "admin#search_users_fuzzy"
post "user/convict", to: "admin#user_convict"
end
end

1
db/schema.rb generated
View file

@ -11,7 +11,6 @@
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[8.1].define(version: 2025_12_08_020226) do
create_schema "pganalyze"
# These are extensions that must be enabled in order to support this database
enable_extension "pg_catalog.plpgsql"
enable_extension "pg_stat_statements"