Make local-only statuses searchable
Ref: fix-local-public
This commit is contained in:
parent
38af42968d
commit
826deb7375
3 changed files with 70 additions and 2 deletions
|
@ -30,7 +30,7 @@ defmodule Pleroma.Activity.Search do
|
||||||
Activity
|
Activity
|
||||||
|> Activity.with_preloaded_object()
|
|> Activity.with_preloaded_object()
|
||||||
|> Activity.restrict_deactivated_users()
|
|> Activity.restrict_deactivated_users()
|
||||||
|> restrict_public()
|
|> restrict_public(user)
|
||||||
|> query_with(index_type, search_query, search_function)
|
|> query_with(index_type, search_query, search_function)
|
||||||
|> maybe_restrict_local(user)
|
|> maybe_restrict_local(user)
|
||||||
|> maybe_restrict_author(author)
|
|> maybe_restrict_author(author)
|
||||||
|
@ -57,7 +57,16 @@ defmodule Pleroma.Activity.Search do
|
||||||
|
|
||||||
def maybe_restrict_blocked(query, _), do: query
|
def maybe_restrict_blocked(query, _), do: query
|
||||||
|
|
||||||
defp restrict_public(q) do
|
defp restrict_public(q, user) when not is_nil(user) do
|
||||||
|
intended_recipients = [Pleroma.Constants.as_public(), Pleroma.Web.ActivityPub.Utils.as_local_public()]
|
||||||
|
|
||||||
|
from([a, o] in q,
|
||||||
|
where: fragment("?->>'type' = 'Create'", a.data),
|
||||||
|
where: fragment("? && ?", ^intended_recipients, a.recipients)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp restrict_public(q, _user) do
|
||||||
from([a, o] in q,
|
from([a, o] in q,
|
||||||
where: fragment("?->>'type' = 'Create'", a.data),
|
where: fragment("?->>'type' = 'Create'", a.data),
|
||||||
where: ^Pleroma.Constants.as_public() in a.recipients
|
where: ^Pleroma.Constants.as_public() in a.recipients
|
||||||
|
|
|
@ -18,6 +18,23 @@ defmodule Pleroma.Activity.SearchTest do
|
||||||
assert result.id == post.id
|
assert result.id == post.id
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "it finds local-only posts for authenticated users" do
|
||||||
|
user = insert(:user)
|
||||||
|
reader = insert(:user)
|
||||||
|
{:ok, post} = CommonAPI.post(user, %{status: "it's wednesday my dudes", visibility: "local"})
|
||||||
|
|
||||||
|
[result] = Search.search(reader, "wednesday")
|
||||||
|
|
||||||
|
assert result.id == post.id
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it does not find local-only posts for anonymous users" do
|
||||||
|
user = insert(:user)
|
||||||
|
{:ok, _post} = CommonAPI.post(user, %{status: "it's wednesday my dudes", visibility: "local"})
|
||||||
|
|
||||||
|
assert [] = Search.search(nil, "wednesday")
|
||||||
|
end
|
||||||
|
|
||||||
test "using plainto_tsquery on postgres < 11" do
|
test "using plainto_tsquery on postgres < 11" do
|
||||||
old_version = :persistent_term.get({Pleroma.Repo, :postgres_version})
|
old_version = :persistent_term.get({Pleroma.Repo, :postgres_version})
|
||||||
:persistent_term.put({Pleroma.Repo, :postgres_version}, 10.0)
|
:persistent_term.put({Pleroma.Repo, :postgres_version}, 10.0)
|
||||||
|
|
|
@ -79,6 +79,48 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do
|
||||||
assert status["id"] == to_string(activity.id)
|
assert status["id"] == to_string(activity.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "search local-only status as an authenticated user" do
|
||||||
|
user = insert(:user)
|
||||||
|
%{conn: conn} = oauth_access(["read:search"])
|
||||||
|
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{status: "This is about 2hu private 天子", visibility: "local"})
|
||||||
|
|
||||||
|
results =
|
||||||
|
conn
|
||||||
|
|> get("/api/v2/search?#{URI.encode_query(%{q: "2hu"})}")
|
||||||
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
|
[status] = results["statuses"]
|
||||||
|
assert status["id"] == to_string(activity.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "search local-only status as an unauthenticated user" do
|
||||||
|
user = insert(:user)
|
||||||
|
%{conn: conn} = oauth_access([])
|
||||||
|
|
||||||
|
{:ok, _activity} = CommonAPI.post(user, %{status: "This is about 2hu private 天子", visibility: "local"})
|
||||||
|
|
||||||
|
results =
|
||||||
|
conn
|
||||||
|
|> get("/api/v2/search?#{URI.encode_query(%{q: "2hu"})}")
|
||||||
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
|
assert [] = results["statuses"]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "search local-only status as an anonymous user" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, _activity} = CommonAPI.post(user, %{status: "This is about 2hu private 天子", visibility: "local"})
|
||||||
|
|
||||||
|
results =
|
||||||
|
build_conn()
|
||||||
|
|> get("/api/v2/search?#{URI.encode_query(%{q: "2hu"})}")
|
||||||
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
|
assert [] = results["statuses"]
|
||||||
|
end
|
||||||
|
|
||||||
@tag capture_log: true
|
@tag capture_log: true
|
||||||
test "constructs hashtags from search query", %{conn: conn} do
|
test "constructs hashtags from search query", %{conn: conn} do
|
||||||
results =
|
results =
|
||||||
|
|
Loading…
Reference in a new issue