Merge pull request 'mastodon_api: Add /api/v1/preferences endpoint' (#625) from redstrate/akkoma:work/redstrate/preferences into develop

Reviewed-on: AkkomaGang/akkoma#625
This commit is contained in:
floatingghost 2023-08-12 13:59:03 +00:00
commit 2df7707060
5 changed files with 61 additions and 1 deletions

View file

@ -451,6 +451,20 @@ def endorsements_operation do
} }
end end
def preferences_operation do
%Operation{
tags: ["Account Preferences"],
description: "Preferences defined by the user in their account settings.",
summary: "Preferred common behaviors to be shared across clients.",
operationId: "AccountController.preferences",
security: [%{"oAuth" => ["read:accounts"]}],
responses: %{
200 => Operation.response("Preferences", "application/json", Account),
401 => Operation.response("Error", "application/json", ApiError)
}
}
end
def identity_proofs_operation do def identity_proofs_operation do
%Operation{ %Operation{
tags: ["Retrieve account information"], tags: ["Retrieve account information"],

View file

@ -51,7 +51,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do
plug( plug(
OAuthScopesPlug, OAuthScopesPlug,
%{scopes: ["read:accounts"]} %{scopes: ["read:accounts"]}
when action in [:verify_credentials, :endorsements, :identity_proofs] when action in [:verify_credentials, :endorsements, :identity_proofs, :preferences]
) )
plug( plug(
@ -544,4 +544,9 @@ def endorsements(conn, params), do: MastodonAPIController.empty_array(conn, para
@doc "GET /api/v1/identity_proofs" @doc "GET /api/v1/identity_proofs"
def identity_proofs(conn, params), do: MastodonAPIController.empty_array(conn, params) def identity_proofs(conn, params), do: MastodonAPIController.empty_array(conn, params)
@doc "GET /api/v1/preferences"
def preferences(%{assigns: %{user: user}} = conn, params) do
render(conn, "preferences.json", user: user)
end
end end

View file

@ -315,6 +315,17 @@ defp do_render("show.json", %{user: user} = opts) do
|> maybe_put_email_address(user, opts[:for]) |> maybe_put_email_address(user, opts[:for])
end end
def render("preferences.json", %{user: user} = opts) do
# TODO: Do we expose more settings that make sense to plug in here?
%{
"posting:default:visibility": user.default_scope,
"posting:default:sensitive": false,
"posting:default:language": nil,
"reading:expand:media": "default",
"reading:expand:spoilers": false
}
end
defp username_from_nickname(string) when is_binary(string) do defp username_from_nickname(string) when is_binary(string) do
hd(String.split(string, "@")) hd(String.split(string, "@"))
end end

View file

@ -629,6 +629,8 @@ defmodule Pleroma.Web.Router do
post("/tags/:id/follow", TagController, :follow) post("/tags/:id/follow", TagController, :follow)
post("/tags/:id/unfollow", TagController, :unfollow) post("/tags/:id/unfollow", TagController, :unfollow)
get("/followed_tags", TagController, :show_followed) get("/followed_tags", TagController, :show_followed)
get("/preferences", AccountController, :preferences)
end end
scope "/api/web", Pleroma.Web do scope "/api/web", Pleroma.Web do

View file

@ -2060,4 +2060,32 @@ test "removing user from followers errors", %{user: user, conn: conn} do
assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn_res, 404) assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn_res, 404)
end end
end end
describe "preferences" do
test "get account preferences" do
user = insert(:user, default_scope: "public")
%{conn: conn} = oauth_access(["read:accounts"], user: user)
conn = get(conn, "/api/v1/preferences")
response = json_response_and_validate_schema(conn, 200)
assert %{
"posting:default:language" => nil,
"posting:default:sensitive" => false,
"posting:default:visibility" => "public",
"reading:expand:media" => "default",
"reading:expand:spoilers" => false
} = response
end
test "test changing account preferences" do
user = insert(:user, default_scope: "unlisted")
%{conn: conn} = oauth_access(["read:accounts"], user: user)
conn = get(conn, "/api/v1/preferences")
response = json_response_and_validate_schema(conn, 200)
assert response["posting:default:visibility"] == "unlisted"
end
end
end end