forked from AkkomaGang/akkoma
mastodon_api: Add /api/v1/preferences endpoint
Implements the preferences endpoint in the Mastodon API, but returns default values for most of the preferences right now. The only supported preference we can access is default post visibility, and a relevant test is added as well.
This commit is contained in:
parent
7bd4ae5412
commit
c22ecac567
5 changed files with 61 additions and 1 deletions
|
@ -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"],
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue