From 90fee49c52799a7d6ad890ecc49d146ab6ad8455 Mon Sep 17 00:00:00 2001
From: lain <lain@soykaf.club>
Date: Wed, 30 Sep 2020 14:14:41 +0200
Subject: [PATCH] User search: Once again, change uri handling.

They can indeed be non-unique.
---
 lib/pleroma/user/search.ex                                | 5 +++--
 .../20200930082320_user_ur_is_index_part_three.exs        | 8 ++++++++
 test/user_search_test.exs                                 | 6 ++++++
 3 files changed, 17 insertions(+), 2 deletions(-)
 create mode 100644 priv/repo/migrations/20200930082320_user_ur_is_index_part_three.exs

diff --git a/lib/pleroma/user/search.ex b/lib/pleroma/user/search.ex
index 03f2c552f..35a828008 100644
--- a/lib/pleroma/user/search.ex
+++ b/lib/pleroma/user/search.ex
@@ -54,8 +54,9 @@ defmodule Pleroma.User.Search do
 
   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]
+         q = from(u in User, where: u.uri == ^query, select: u.id),
+         users = Pleroma.Repo.all(q) do
+      users ++ list
     else
       _ -> list
     end
diff --git a/priv/repo/migrations/20200930082320_user_ur_is_index_part_three.exs b/priv/repo/migrations/20200930082320_user_ur_is_index_part_three.exs
new file mode 100644
index 000000000..816c6526e
--- /dev/null
+++ b/priv/repo/migrations/20200930082320_user_ur_is_index_part_three.exs
@@ -0,0 +1,8 @@
+defmodule Pleroma.Repo.Migrations.UserURIsIndexPartThree do
+  use Ecto.Migration
+
+  def change do
+    drop_if_exists(unique_index(:users, :uri))
+    create_if_not_exists(index(:users, :uri))
+  end
+end
diff --git a/test/user_search_test.exs b/test/user_search_test.exs
index cc14e9741..c4b805005 100644
--- a/test/user_search_test.exs
+++ b/test/user_search_test.exs
@@ -36,6 +36,12 @@ defmodule Pleroma.UserSearchTest do
       assert first_user.id == user.id
     end
 
+    test "doesn't die if two users have the same uri" do
+      insert(:user, %{uri: "https://gensokyo.2hu/@raymoo"})
+      insert(:user, %{uri: "https://gensokyo.2hu/@raymoo"})
+      assert [_first_user, _second_user] = User.search("https://gensokyo.2hu/@raymoo")
+    end
+
     test "returns a user with matching uri as the first result" do
       user =
         insert(:user, %{