summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrinpatch <rinpatch@sdf.org>2020-09-25 12:56:21 +0000
committerrinpatch <rinpatch@sdf.org>2020-09-25 12:56:21 +0000
commit5cd71208d9b273535f978559011377e703e82dcb (patch)
tree65b7b6fd2619ced4ac1a4231166e77e19b6dec2f
parentf67c967c4a614262a6409f94ad74754b09dc0e64 (diff)
parent05b5241314182c5aab2907e27d4c5f46d7617f56 (diff)
Merge branch 'search-even-more' into 'develop'
More user search improvements See merge request pleroma/pleroma!3032
-rw-r--r--lib/pleroma/user/search.ex36
-rw-r--r--priv/repo/migrations/20200925065249_make_user_ids_ci.exs19
-rw-r--r--test/user_search_test.exs15
3 files changed, 63 insertions, 7 deletions
diff --git a/lib/pleroma/user/search.ex b/lib/pleroma/user/search.ex
index 408295e0c..03f2c552f 100644
--- a/lib/pleroma/user/search.ex
+++ b/lib/pleroma/user/search.ex
@@ -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, "@")
diff --git a/priv/repo/migrations/20200925065249_make_user_ids_ci.exs b/priv/repo/migrations/20200925065249_make_user_ids_ci.exs
new file mode 100644
index 000000000..b7305f137
--- /dev/null
+++ b/priv/repo/migrations/20200925065249_make_user_ids_ci.exs
@@ -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
diff --git a/test/user_search_test.exs b/test/user_search_test.exs
index 68fda1c53..b99a77b57 100644
--- a/test/user_search_test.exs
+++ b/test/user_search_test.exs
@@ -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"})