Merge branch 'search-even-more' into 'develop'
authorrinpatch <rinpatch@sdf.org>
Fri, 25 Sep 2020 12:56:21 +0000 (12:56 +0000)
committerrinpatch <rinpatch@sdf.org>
Fri, 25 Sep 2020 12:56:21 +0000 (12:56 +0000)
More user search improvements

See merge request pleroma/pleroma!3032

lib/pleroma/user/search.ex
priv/repo/migrations/20200925065249_make_user_ids_ci.exs [new file with mode: 0644]
test/user_search_test.exs

index 408295e0ca75a49617903650a4d4e8f6975cb13e..03f2c552f2f29b82cf20909d2d830ea284f1dc85 100644 (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, "@")
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 (file)
index 0000000..b7305f1
--- /dev/null
@@ -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
index 68fda1c53b377626e57444a7b9ca2a76d08fe859..b99a77b579842019e1e6e297559586800e4fa288 100644 (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"})