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 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation 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 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do
|
||||||
|
|
||||||
@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 @@ defmodule Pleroma.Web.MastodonAPI.AccountView 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 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest 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