Handle `reblogs` on the first follow request in MastoAPI
This commit is contained in:
parent
9da8b287f8
commit
fa48532387
|
@ -71,6 +71,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
- Mastodon API: Reblogs having `in_reply_to_id` - `null` even when they are replies
|
- Mastodon API: Reblogs having `in_reply_to_id` - `null` even when they are replies
|
||||||
- Mastodon API: Streaming API broadcasting wrong activity id
|
- Mastodon API: Streaming API broadcasting wrong activity id
|
||||||
- Mastodon API: 500 errors when requesting a card for a private conversation
|
- Mastodon API: 500 errors when requesting a card for a private conversation
|
||||||
|
- Mastodon API: Handling of `reblogs` in `/api/v1/accounts/:id/follow`
|
||||||
|
|
||||||
## [0.9.9999] - 2019-04-05
|
## [0.9.9999] - 2019-04-05
|
||||||
### Security
|
### Security
|
||||||
|
|
|
@ -7,6 +7,31 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPI do
|
||||||
alias Pleroma.Pagination
|
alias Pleroma.Pagination
|
||||||
alias Pleroma.ScheduledActivity
|
alias Pleroma.ScheduledActivity
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
|
alias Pleroma.Web.CommonAPI
|
||||||
|
|
||||||
|
def follow(follower, followed, params \\ %{}) do
|
||||||
|
options = cast_params(params)
|
||||||
|
reblogs = options[:reblogs]
|
||||||
|
|
||||||
|
result =
|
||||||
|
if not User.following?(follower, followed) do
|
||||||
|
CommonAPI.follow(follower, followed)
|
||||||
|
else
|
||||||
|
{:ok, follower, followed, nil}
|
||||||
|
end
|
||||||
|
|
||||||
|
with {:ok, follower, followed, _} <- result do
|
||||||
|
reblogs
|
||||||
|
|> case do
|
||||||
|
false -> CommonAPI.hide_reblogs(follower, followed)
|
||||||
|
_ -> CommonAPI.show_reblogs(follower, followed)
|
||||||
|
end
|
||||||
|
|> case do
|
||||||
|
{:ok, follower} -> {:ok, follower}
|
||||||
|
_ -> {:ok, follower}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def get_followers(user, params \\ %{}) do
|
def get_followers(user, params \\ %{}) do
|
||||||
user
|
user
|
||||||
|
@ -37,7 +62,8 @@ def get_scheduled_activities(user, params \\ %{}) do
|
||||||
|
|
||||||
defp cast_params(params) do
|
defp cast_params(params) do
|
||||||
param_types = %{
|
param_types = %{
|
||||||
exclude_types: {:array, :string}
|
exclude_types: {:array, :string},
|
||||||
|
reblogs: :boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
changeset = cast({%{}, param_types}, params, Map.keys(param_types))
|
changeset = cast({%{}, param_types}, params, Map.keys(param_types))
|
||||||
|
|
|
@ -821,8 +821,7 @@ def reject_follow_request(%{assigns: %{user: followed}} = conn, %{"id" => id}) d
|
||||||
def follow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do
|
def follow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do
|
||||||
with {_, %User{} = followed} <- {:followed, User.get_cached_by_id(id)},
|
with {_, %User{} = followed} <- {:followed, User.get_cached_by_id(id)},
|
||||||
{_, true} <- {:followed, follower.id != followed.id},
|
{_, true} <- {:followed, follower.id != followed.id},
|
||||||
false <- User.following?(follower, followed),
|
{:ok, follower} <- MastodonAPI.follow(follower, followed, conn.params) do
|
||||||
{:ok, follower, followed, _} <- CommonAPI.follow(follower, followed) do
|
|
||||||
conn
|
conn
|
||||||
|> put_view(AccountView)
|
|> put_view(AccountView)
|
||||||
|> render("relationship.json", %{user: follower, target: followed})
|
|> render("relationship.json", %{user: follower, target: followed})
|
||||||
|
@ -830,19 +829,6 @@ def follow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do
|
||||||
{:followed, _} ->
|
{:followed, _} ->
|
||||||
{:error, :not_found}
|
{:error, :not_found}
|
||||||
|
|
||||||
true ->
|
|
||||||
followed = User.get_cached_by_id(id)
|
|
||||||
|
|
||||||
{:ok, follower} =
|
|
||||||
case conn.params["reblogs"] do
|
|
||||||
true -> CommonAPI.show_reblogs(follower, followed)
|
|
||||||
false -> CommonAPI.hide_reblogs(follower, followed)
|
|
||||||
end
|
|
||||||
|
|
||||||
conn
|
|
||||||
|> put_view(AccountView)
|
|
||||||
|> render("relationship.json", %{user: follower, target: followed})
|
|
||||||
|
|
||||||
{:error, message} ->
|
{:error, message} ->
|
||||||
conn
|
conn
|
||||||
|> put_resp_content_type("application/json")
|
|> put_resp_content_type("application/json")
|
||||||
|
|
|
@ -1620,6 +1620,44 @@ test "following / unfollowing a user", %{conn: conn} do
|
||||||
assert id == to_string(other_user.id)
|
assert id == to_string(other_user.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "following without reblogs" do
|
||||||
|
follower = insert(:user)
|
||||||
|
followed = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
build_conn()
|
||||||
|
|> assign(:user, follower)
|
||||||
|
|> post("/api/v1/accounts/#{followed.id}/follow?reblogs=false")
|
||||||
|
|
||||||
|
assert %{"showing_reblogs" => false} = json_response(conn, 200)
|
||||||
|
|
||||||
|
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "hey"})
|
||||||
|
{:ok, reblog, _} = CommonAPI.repeat(activity.id, followed)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
build_conn()
|
||||||
|
|> assign(:user, User.get_cached_by_id(follower.id))
|
||||||
|
|> get("/api/v1/timelines/home")
|
||||||
|
|
||||||
|
assert [] == json_response(conn, 200)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
build_conn()
|
||||||
|
|> assign(:user, follower)
|
||||||
|
|> post("/api/v1/accounts/#{followed.id}/follow?reblogs=true")
|
||||||
|
|
||||||
|
assert %{"showing_reblogs" => true} = json_response(conn, 200)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
build_conn()
|
||||||
|
|> assign(:user, User.get_cached_by_id(follower.id))
|
||||||
|
|> get("/api/v1/timelines/home")
|
||||||
|
|
||||||
|
expected_activity_id = reblog.id
|
||||||
|
assert [%{"id" => ^expected_activity_id}] = json_response(conn, 200)
|
||||||
|
end
|
||||||
|
|
||||||
test "following / unfollowing errors" do
|
test "following / unfollowing errors" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue