Merge branch 'account-subscriptions' into 'develop'

MastoAPI: accept notify param in follow request

See merge request pleroma/pleroma!3555
This commit is contained in:
Alex Gleason 2021-12-25 01:34:27 +00:00 committed by Haelwenn (lanodan) Monnier
parent 042c37bcee
commit 6d35b57802
9 changed files with 66 additions and 13 deletions

View file

@ -159,6 +159,7 @@ See [Admin-API](admin_api.md)
"muting": false, "muting": false,
"muting_notifications": false, "muting_notifications": false,
"subscribing": true, "subscribing": true,
"notifying": true,
"requested": false, "requested": false,
"domain_blocking": false, "domain_blocking": false,
"showing_reblogs": true, "showing_reblogs": true,
@ -183,6 +184,7 @@ See [Admin-API](admin_api.md)
"muting": false, "muting": false,
"muting_notifications": false, "muting_notifications": false,
"subscribing": false, "subscribing": false,
"notifying": false,
"requested": false, "requested": false,
"domain_blocking": false, "domain_blocking": false,
"showing_reblogs": true, "showing_reblogs": true,

View file

@ -226,6 +226,12 @@ def follow_operation do
type: :boolean, type: :boolean,
description: "Receive this account's reblogs in home timeline? Defaults to true.", description: "Receive this account's reblogs in home timeline? Defaults to true.",
default: true default: true
},
notify: %Schema{
type: :boolean,
description:
"Receive notifications for all statuses posted by the account? Defaults to false.",
default: false
} }
} }
}, },
@ -688,6 +694,7 @@ defp array_of_relationships do
"requested" => false, "requested" => false,
"domain_blocking" => false, "domain_blocking" => false,
"subscribing" => false, "subscribing" => false,
"notifying" => false,
"endorsed" => true "endorsed" => true
}, },
%{ %{
@ -702,6 +709,7 @@ defp array_of_relationships do
"requested" => true, "requested" => true,
"domain_blocking" => false, "domain_blocking" => false,
"subscribing" => false, "subscribing" => false,
"notifying" => false,
"endorsed" => false "endorsed" => false
}, },
%{ %{
@ -716,6 +724,7 @@ defp array_of_relationships do
"requested" => false, "requested" => false,
"domain_blocking" => true, "domain_blocking" => true,
"subscribing" => true, "subscribing" => true,
"notifying" => true,
"endorsed" => false "endorsed" => false
} }
] ]

View file

@ -196,7 +196,8 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Account do
"muting_notifications" => false, "muting_notifications" => false,
"requested" => false, "requested" => false,
"showing_reblogs" => true, "showing_reblogs" => true,
"subscribing" => false "subscribing" => false,
"notifying" => false
}, },
"settings_store" => %{ "settings_store" => %{
"pleroma-fe" => %{} "pleroma-fe" => %{}

View file

@ -24,7 +24,8 @@ defmodule Pleroma.Web.ApiSpec.Schemas.AccountRelationship do
muting_notifications: %Schema{type: :boolean}, muting_notifications: %Schema{type: :boolean},
requested: %Schema{type: :boolean}, requested: %Schema{type: :boolean},
showing_reblogs: %Schema{type: :boolean}, showing_reblogs: %Schema{type: :boolean},
subscribing: %Schema{type: :boolean} subscribing: %Schema{type: :boolean},
notifying: %Schema{type: :boolean}
}, },
example: %{ example: %{
"blocked_by" => false, "blocked_by" => false,
@ -38,7 +39,8 @@ defmodule Pleroma.Web.ApiSpec.Schemas.AccountRelationship do
"muting_notifications" => false, "muting_notifications" => false,
"requested" => false, "requested" => false,
"showing_reblogs" => true, "showing_reblogs" => true,
"subscribing" => false "subscribing" => false,
"notifying" => false
} }
}) })
end end

View file

@ -284,7 +284,8 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
"muting_notifications" => false, "muting_notifications" => false,
"requested" => false, "requested" => false,
"showing_reblogs" => true, "showing_reblogs" => true,
"subscribing" => false "subscribing" => false,
"notifying" => false
}, },
"skip_thread_containment" => false, "skip_thread_containment" => false,
"tags" => [] "tags" => []

View file

@ -24,6 +24,7 @@ def follow(follower, followed, params \\ %{}) do
with {:ok, follower, _followed, _} <- result do with {:ok, follower, _followed, _} <- result do
options = cast_params(params) options = cast_params(params)
set_reblogs_visibility(options[:reblogs], result) set_reblogs_visibility(options[:reblogs], result)
set_subscription(options[:notify], result)
{:ok, follower} {:ok, follower}
end end
end end
@ -36,6 +37,16 @@ defp set_reblogs_visibility(_, {:ok, follower, followed, _}) do
CommonAPI.show_reblogs(follower, followed) CommonAPI.show_reblogs(follower, followed)
end end
defp set_subscription(true, {:ok, follower, followed, _}) do
User.subscribe(follower, followed)
end
defp set_subscription(false, {:ok, follower, followed, _}) do
User.unsubscribe(follower, followed)
end
defp set_subscription(_, _), do: {:ok, nil}
@spec get_followers(User.t(), map()) :: list(User.t()) @spec get_followers(User.t(), map()) :: list(User.t())
def get_followers(user, params \\ %{}) do def get_followers(user, params \\ %{}) do
user user
@ -73,7 +84,8 @@ defp cast_params(params) do
exclude_visibilities: {:array, :string}, exclude_visibilities: {:array, :string},
reblogs: :boolean, reblogs: :boolean,
with_muted: :boolean, with_muted: :boolean,
account_ap_id: :string account_ap_id: :string,
notify: :boolean
} }
changeset = cast({%{}, param_types}, params, Map.keys(param_types)) changeset = cast({%{}, param_types}, params, Map.keys(param_types))

View file

@ -101,6 +101,15 @@ def render(
User.following?(target, reading_user) User.following?(target, reading_user)
end end
subscribing =
UserRelationship.exists?(
user_relationships,
:inverse_subscription,
target,
reading_user,
&User.subscribed_to?(&2, &1)
)
# NOTE: adjust UserRelationship.view_relationships_option/2 on new relation-related flags # NOTE: adjust UserRelationship.view_relationships_option/2 on new relation-related flags
%{ %{
id: to_string(target.id), id: to_string(target.id),
@ -138,14 +147,8 @@ def render(
target, target,
&User.muted_notifications?(&1, &2) &User.muted_notifications?(&1, &2)
), ),
subscribing: subscribing: subscribing,
UserRelationship.exists?( notifying: subscribing,
user_relationships,
:inverse_subscription,
target,
reading_user,
&User.subscribed_to?(&2, &1)
),
requested: follow_state == :follow_pending, requested: follow_state == :follow_pending,
domain_blocking: User.blocks_domain?(reading_user, target), domain_blocking: User.blocks_domain?(reading_user, target),
showing_reblogs: showing_reblogs:

View file

@ -922,6 +922,27 @@ test "following with reblogs" do
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
end end
test "following with subscription and unsubscribing" do
%{conn: conn} = oauth_access(["follow"])
followed = insert(:user)
ret_conn =
conn
|> put_req_header("content-type", "application/json")
|> post("/api/v1/accounts/#{followed.id}/follow", %{notify: true})
assert %{"id" => _id, "subscribing" => true} =
json_response_and_validate_schema(ret_conn, 200)
ret_conn =
conn
|> put_req_header("content-type", "application/json")
|> post("/api/v1/accounts/#{followed.id}/follow", %{notify: false})
assert %{"id" => _id, "subscribing" => false} =
json_response_and_validate_schema(ret_conn, 200)
end
test "following / unfollowing errors", %{user: user, conn: conn} do test "following / unfollowing errors", %{user: user, conn: conn} do
# self follow # self follow
conn_res = post(conn, "/api/v1/accounts/#{user.id}/follow") conn_res = post(conn, "/api/v1/accounts/#{user.id}/follow")

View file

@ -268,6 +268,7 @@ defp test_relationship_rendering(user, other_user, expected_result) do
muting: false, muting: false,
muting_notifications: false, muting_notifications: false,
subscribing: false, subscribing: false,
notifying: false,
requested: false, requested: false,
domain_blocking: false, domain_blocking: false,
showing_reblogs: true, showing_reblogs: true,
@ -293,6 +294,7 @@ test "represent a relationship for the following and followed user" do
muting: true, muting: true,
muting_notifications: true, muting_notifications: true,
subscribing: true, subscribing: true,
notifying: true,
showing_reblogs: false, showing_reblogs: false,
id: to_string(other_user.id) id: to_string(other_user.id)
} }