Browse Source

Merge branch 'search-even-more' into 'develop'

More user search improvements

See merge request pleroma/pleroma!3032
maint/niou-curses
rinpatch 3 years ago
parent
commit
5cd71208d9
3 changed files with 63 additions and 7 deletions
  1. +29
    -7
      lib/pleroma/user/search.ex
  2. +19
    -0
      priv/repo/migrations/20200925065249_make_user_ids_ci.exs
  3. +15
    -0
      test/user_search_test.exs

+ 29
- 7
lib/pleroma/user/search.ex View File

@@ -3,8 +3,10 @@
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.User.Search do
alias Pleroma.EctoType.ActivityPub.ObjectValidators.Uri, as: UriType
alias Pleroma.Pagination
alias Pleroma.User

import Ecto.Query

@limit 20
@@ -21,15 +23,12 @@ defmodule Pleroma.User.Search do

# If this returns anything, it should bounce to the top
maybe_resolved = maybe_resolve(resolve, for_user, query_string)
maybe_ap_id_match = User.get_cached_by_ap_id(query_string)

top_user_ids =
case {maybe_resolved, maybe_ap_id_match} do
{{:ok, %User{} = user}, %User{} = other_user} -> [user.id, other_user.id]
{{:ok, %User{} = user}, _} -> [user.id]
{_, %User{} = user} -> [user.id]
_ -> []
end
[]
|> maybe_add_resolved(maybe_resolved)
|> maybe_add_ap_id_match(query_string)
|> maybe_add_uri_match(query_string)

results =
query_string
@@ -39,6 +38,29 @@ defmodule Pleroma.User.Search do
results
end

defp maybe_add_resolved(list, {:ok, %User{} = user}) do
[user.id | list]
end

defp maybe_add_resolved(list, _), do: list

defp maybe_add_ap_id_match(list, query) do
if user = User.get_cached_by_ap_id(query) do
[user.id | list]
else
list
end
end

defp maybe_add_uri_match(list, query) do
with {:ok, query} <- UriType.cast(query),
%User{} = user <- Pleroma.Repo.get_by(User, uri: query) do
[user.id | list]
else
_ -> list
end
end

defp format_query(query_string) do
# Strip the beginning @ off if there is a query
query_string = String.trim_leading(query_string, "@")


+ 19
- 0
priv/repo/migrations/20200925065249_make_user_ids_ci.exs View File

@@ -0,0 +1,19 @@
defmodule Pleroma.Repo.Migrations.MakeUserIdsCI do
use Ecto.Migration

def up do
alter table(:users) do
modify(:uri, :citext)
end

create(unique_index(:users, :uri))
end

def don do
drop(unique_index(:users, :uri))

alter table(:users) do
modify(:uri, :text)
end
end
end

+ 15
- 0
test/user_search_test.exs View File

@@ -36,6 +36,21 @@ defmodule Pleroma.UserSearchTest do
assert first_user.id == user.id
end

test "returns a user with matching uri as the first result" do
user =
insert(:user, %{
nickname: "no_relation",
ap_id: "https://lain.com/users/lain",
uri: "https://lain.com/@Lain"
})

_user = insert(:user, %{nickname: "com_user"})

[first_user, _second_user] = User.search("https://lain.com/@lain")

assert first_user.id == user.id
end

test "excludes invisible users from results" do
user = insert(:user, %{nickname: "john t1000"})
insert(:user, %{invisible: true, nickname: "john t800"})


Loading…
Cancel
Save