forked from AkkomaGang/akkoma
Merge branch 'features/mastoapi-multi-hashtag' into 'develop'
MastodonAPI multi-hashtag See merge request pleroma/pleroma!652
This commit is contained in:
commit
5eb81d2c72
4 changed files with 108 additions and 4 deletions
|
@ -426,7 +426,34 @@ defp restrict_since(query, %{"since_id" => since_id}) do
|
||||||
|
|
||||||
defp restrict_since(query, _), do: query
|
defp restrict_since(query, _), do: query
|
||||||
|
|
||||||
defp restrict_tag(query, %{"tag" => tag}) do
|
defp restrict_tag_reject(query, %{"tag_reject" => tag_reject})
|
||||||
|
when is_list(tag_reject) and tag_reject != [] do
|
||||||
|
from(
|
||||||
|
activity in query,
|
||||||
|
where: fragment("(not (? #> '{\"object\",\"tag\"}') \\?| ?)", activity.data, ^tag_reject)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp restrict_tag_reject(query, _), do: query
|
||||||
|
|
||||||
|
defp restrict_tag_all(query, %{"tag_all" => tag_all})
|
||||||
|
when is_list(tag_all) and tag_all != [] do
|
||||||
|
from(
|
||||||
|
activity in query,
|
||||||
|
where: fragment("(? #> '{\"object\",\"tag\"}') \\?& ?", activity.data, ^tag_all)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp restrict_tag_all(query, _), do: query
|
||||||
|
|
||||||
|
defp restrict_tag(query, %{"tag" => tag}) when is_list(tag) do
|
||||||
|
from(
|
||||||
|
activity in query,
|
||||||
|
where: fragment("(? #> '{\"object\",\"tag\"}') \\?| ?", activity.data, ^tag)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp restrict_tag(query, %{"tag" => tag}) when is_binary(tag) do
|
||||||
from(
|
from(
|
||||||
activity in query,
|
activity in query,
|
||||||
where: fragment("? <@ (? #> '{\"object\",\"tag\"}')", ^tag, activity.data)
|
where: fragment("? <@ (? #> '{\"object\",\"tag\"}')", ^tag, activity.data)
|
||||||
|
@ -575,6 +602,8 @@ def fetch_activities_query(recipients, opts \\ %{}) do
|
||||||
base_query
|
base_query
|
||||||
|> restrict_recipients(recipients, opts["user"])
|
|> restrict_recipients(recipients, opts["user"])
|
||||||
|> restrict_tag(opts)
|
|> restrict_tag(opts)
|
||||||
|
|> restrict_tag_reject(opts)
|
||||||
|
|> restrict_tag_all(opts)
|
||||||
|> restrict_since(opts)
|
|> restrict_since(opts)
|
||||||
|> restrict_local(opts)
|
|> restrict_local(opts)
|
||||||
|> restrict_limit(opts)
|
|> restrict_limit(opts)
|
||||||
|
|
|
@ -541,15 +541,34 @@ def reblogged_by(conn, %{"id" => id}) do
|
||||||
def hashtag_timeline(%{assigns: %{user: user}} = conn, params) do
|
def hashtag_timeline(%{assigns: %{user: user}} = conn, params) do
|
||||||
local_only = params["local"] in [true, "True", "true", "1"]
|
local_only = params["local"] in [true, "True", "true", "1"]
|
||||||
|
|
||||||
params =
|
tags =
|
||||||
|
[params["tag"], params["any"]]
|
||||||
|
|> List.flatten()
|
||||||
|
|> Enum.uniq()
|
||||||
|
|> Enum.filter(& &1)
|
||||||
|
|> Enum.map(&String.downcase(&1))
|
||||||
|
|
||||||
|
tag_all =
|
||||||
|
params["all"] ||
|
||||||
|
[]
|
||||||
|
|> Enum.map(&String.downcase(&1))
|
||||||
|
|
||||||
|
tag_reject =
|
||||||
|
params["none"] ||
|
||||||
|
[]
|
||||||
|
|> Enum.map(&String.downcase(&1))
|
||||||
|
|
||||||
|
query_params =
|
||||||
params
|
params
|
||||||
|> Map.put("type", "Create")
|
|> Map.put("type", "Create")
|
||||||
|> Map.put("local_only", local_only)
|
|> Map.put("local_only", local_only)
|
||||||
|> Map.put("blocking_user", user)
|
|> Map.put("blocking_user", user)
|
||||||
|> Map.put("tag", String.downcase(params["tag"]))
|
|> Map.put("tag", tags)
|
||||||
|
|> Map.put("tag_all", tag_all)
|
||||||
|
|> Map.put("tag_reject", tag_reject)
|
||||||
|
|
||||||
activities =
|
activities =
|
||||||
ActivityPub.fetch_public_activities(params)
|
ActivityPub.fetch_public_activities(query_params)
|
||||||
|> Enum.reverse()
|
|> Enum.reverse()
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|
|
|
@ -64,6 +64,34 @@ test "it returns a user" do
|
||||||
assert user.info.ap_enabled
|
assert user.info.ap_enabled
|
||||||
assert user.follower_address == "http://mastodon.example.org/users/admin/followers"
|
assert user.follower_address == "http://mastodon.example.org/users/admin/followers"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "it fetches the appropriate tag-restricted posts" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, status_one} = CommonAPI.post(user, %{"status" => ". #test"})
|
||||||
|
{:ok, status_two} = CommonAPI.post(user, %{"status" => ". #essais"})
|
||||||
|
{:ok, status_three} = CommonAPI.post(user, %{"status" => ". #test #reject"})
|
||||||
|
|
||||||
|
fetch_one = ActivityPub.fetch_activities([], %{"tag" => "test"})
|
||||||
|
fetch_two = ActivityPub.fetch_activities([], %{"tag" => ["test", "essais"]})
|
||||||
|
|
||||||
|
fetch_three =
|
||||||
|
ActivityPub.fetch_activities([], %{
|
||||||
|
"tag" => ["test", "essais"],
|
||||||
|
"tag_reject" => ["reject"]
|
||||||
|
})
|
||||||
|
|
||||||
|
fetch_four =
|
||||||
|
ActivityPub.fetch_activities([], %{
|
||||||
|
"tag" => ["test"],
|
||||||
|
"tag_all" => ["test", "reject"]
|
||||||
|
})
|
||||||
|
|
||||||
|
assert fetch_one == [status_one, status_three]
|
||||||
|
assert fetch_two == [status_one, status_two, status_three]
|
||||||
|
assert fetch_three == [status_one, status_two]
|
||||||
|
assert fetch_four == [status_three]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "insertion" do
|
describe "insertion" do
|
||||||
|
|
|
@ -1044,6 +1044,34 @@ test "hashtag timeline", %{conn: conn} do
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "multi-hashtag timeline", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, activity_test} = CommonAPI.post(user, %{"status" => "#test"})
|
||||||
|
{:ok, activity_test1} = CommonAPI.post(user, %{"status" => "#test #test1"})
|
||||||
|
{:ok, activity_none} = CommonAPI.post(user, %{"status" => "#test #none"})
|
||||||
|
|
||||||
|
any_test =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/timelines/tag/test", %{"any" => ["test1"]})
|
||||||
|
|
||||||
|
[status_none, status_test1, status_test] = json_response(any_test, 200)
|
||||||
|
|
||||||
|
assert to_string(activity_test.id) == status_test["id"]
|
||||||
|
assert to_string(activity_test1.id) == status_test1["id"]
|
||||||
|
assert to_string(activity_none.id) == status_none["id"]
|
||||||
|
|
||||||
|
restricted_test =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/timelines/tag/test", %{"all" => ["test1"], "none" => ["none"]})
|
||||||
|
|
||||||
|
assert [status_test1] == json_response(restricted_test, 200)
|
||||||
|
|
||||||
|
all_test = conn |> get("/api/v1/timelines/tag/test", %{"all" => ["none"]})
|
||||||
|
|
||||||
|
assert [status_none] == json_response(all_test, 200)
|
||||||
|
end
|
||||||
|
|
||||||
test "getting followers", %{conn: conn} do
|
test "getting followers", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
|
|
Loading…
Reference in a new issue