forked from AkkomaGang/akkoma
Move update_credentials to MastodonAPI.AccountController
This commit is contained in:
parent
c0ce2d5faf
commit
987e0b8be8
4 changed files with 89 additions and 107 deletions
|
@ -8,6 +8,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do
|
||||||
import Pleroma.Web.ControllerHelper,
|
import Pleroma.Web.ControllerHelper,
|
||||||
only: [add_link_headers: 2, truthy_param?: 1, assign_account_by_id: 2, json_response: 3]
|
only: [add_link_headers: 2, truthy_param?: 1, assign_account_by_id: 2, json_response: 3]
|
||||||
|
|
||||||
|
alias Pleroma.Emoji
|
||||||
alias Pleroma.Plugs.RateLimiter
|
alias Pleroma.Plugs.RateLimiter
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.ActivityPub.ActivityPub
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
|
@ -81,6 +82,92 @@ def verify_credentials(%{assigns: %{user: user}} = conn, _) do
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc "PATCH /api/v1/accounts/update_credentials"
|
||||||
|
def update_credentials(%{assigns: %{user: original_user}} = conn, params) do
|
||||||
|
user = original_user
|
||||||
|
|
||||||
|
user_params =
|
||||||
|
%{}
|
||||||
|
|> add_if_present(params, "display_name", :name)
|
||||||
|
|> add_if_present(params, "note", :bio, fn value -> {:ok, User.parse_bio(value, user)} end)
|
||||||
|
|> add_if_present(params, "avatar", :avatar, fn value ->
|
||||||
|
with %Plug.Upload{} <- value,
|
||||||
|
{:ok, object} <- ActivityPub.upload(value, type: :avatar) do
|
||||||
|
{:ok, object.data}
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
emojis_text = (user_params["display_name"] || "") <> (user_params["note"] || "")
|
||||||
|
|
||||||
|
user_info_emojis =
|
||||||
|
user.info
|
||||||
|
|> Map.get(:emoji, [])
|
||||||
|
|> Enum.concat(Emoji.Formatter.get_emoji_map(emojis_text))
|
||||||
|
|> Enum.dedup()
|
||||||
|
|
||||||
|
info_params =
|
||||||
|
[
|
||||||
|
:no_rich_text,
|
||||||
|
:locked,
|
||||||
|
:hide_followers_count,
|
||||||
|
:hide_follows_count,
|
||||||
|
:hide_followers,
|
||||||
|
:hide_follows,
|
||||||
|
:hide_favorites,
|
||||||
|
:show_role,
|
||||||
|
:skip_thread_containment,
|
||||||
|
:discoverable
|
||||||
|
]
|
||||||
|
|> Enum.reduce(%{}, fn key, acc ->
|
||||||
|
add_if_present(acc, params, to_string(key), key, &{:ok, truthy_param?(&1)})
|
||||||
|
end)
|
||||||
|
|> add_if_present(params, "default_scope", :default_scope)
|
||||||
|
|> add_if_present(params, "fields", :fields, fn fields ->
|
||||||
|
fields = Enum.map(fields, fn f -> Map.update!(f, "value", &AutoLinker.link(&1)) end)
|
||||||
|
|
||||||
|
{:ok, fields}
|
||||||
|
end)
|
||||||
|
|> add_if_present(params, "fields", :raw_fields)
|
||||||
|
|> add_if_present(params, "pleroma_settings_store", :pleroma_settings_store, fn value ->
|
||||||
|
{:ok, Map.merge(user.info.pleroma_settings_store, value)}
|
||||||
|
end)
|
||||||
|
|> add_if_present(params, "header", :banner, fn value ->
|
||||||
|
with %Plug.Upload{} <- value,
|
||||||
|
{:ok, object} <- ActivityPub.upload(value, type: :banner) do
|
||||||
|
{:ok, object.data}
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|> add_if_present(params, "pleroma_background_image", :background, fn value ->
|
||||||
|
with %Plug.Upload{} <- value,
|
||||||
|
{:ok, object} <- ActivityPub.upload(value, type: :background) do
|
||||||
|
{:ok, object.data}
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|> Map.put(:emoji, user_info_emojis)
|
||||||
|
|
||||||
|
changeset =
|
||||||
|
user
|
||||||
|
|> User.update_changeset(user_params)
|
||||||
|
|> User.change_info(&User.Info.profile_update(&1, info_params))
|
||||||
|
|
||||||
|
with {:ok, user} <- User.update_and_set_cache(changeset) do
|
||||||
|
if original_user != user, do: CommonAPI.update(user)
|
||||||
|
|
||||||
|
render(conn, "show.json", user: user, for: user, with_pleroma_settings: true)
|
||||||
|
else
|
||||||
|
_e -> render_error(conn, :forbidden, "Invalid request")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp add_if_present(map, params, params_field, map_field, value_function \\ &{:ok, &1}) do
|
||||||
|
with true <- Map.has_key?(params, params_field),
|
||||||
|
{:ok, new_value} <- value_function.(params[params_field]) do
|
||||||
|
Map.put(map, map_field, new_value)
|
||||||
|
else
|
||||||
|
_ -> map
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
@doc "GET /api/v1/accounts/relationships"
|
@doc "GET /api/v1/accounts/relationships"
|
||||||
def relationships(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
def relationships(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
targets = User.get_all_by_ids(List.wrap(id))
|
targets = User.get_all_by_ids(List.wrap(id))
|
||||||
|
|
|
@ -5,12 +5,11 @@
|
||||||
defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
use Pleroma.Web, :controller
|
use Pleroma.Web, :controller
|
||||||
|
|
||||||
import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2, truthy_param?: 1]
|
import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2]
|
||||||
|
|
||||||
alias Pleroma.Activity
|
alias Pleroma.Activity
|
||||||
alias Pleroma.Bookmark
|
alias Pleroma.Bookmark
|
||||||
alias Pleroma.Config
|
alias Pleroma.Config
|
||||||
alias Pleroma.Emoji
|
|
||||||
alias Pleroma.HTTP
|
alias Pleroma.HTTP
|
||||||
alias Pleroma.Object
|
alias Pleroma.Object
|
||||||
alias Pleroma.Pagination
|
alias Pleroma.Pagination
|
||||||
|
@ -58,110 +57,6 @@ def create_app(conn, params) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp add_if_present(
|
|
||||||
map,
|
|
||||||
params,
|
|
||||||
params_field,
|
|
||||||
map_field,
|
|
||||||
value_function \\ fn x -> {:ok, x} end
|
|
||||||
) do
|
|
||||||
if Map.has_key?(params, params_field) do
|
|
||||||
case value_function.(params[params_field]) do
|
|
||||||
{:ok, new_value} -> Map.put(map, map_field, new_value)
|
|
||||||
:error -> map
|
|
||||||
end
|
|
||||||
else
|
|
||||||
map
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def update_credentials(%{assigns: %{user: user}} = conn, params) do
|
|
||||||
original_user = user
|
|
||||||
|
|
||||||
user_params =
|
|
||||||
%{}
|
|
||||||
|> add_if_present(params, "display_name", :name)
|
|
||||||
|> add_if_present(params, "note", :bio, fn value -> {:ok, User.parse_bio(value, user)} end)
|
|
||||||
|> add_if_present(params, "avatar", :avatar, fn value ->
|
|
||||||
with %Plug.Upload{} <- value,
|
|
||||||
{:ok, object} <- ActivityPub.upload(value, type: :avatar) do
|
|
||||||
{:ok, object.data}
|
|
||||||
else
|
|
||||||
_ -> :error
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
emojis_text = (user_params["display_name"] || "") <> (user_params["note"] || "")
|
|
||||||
|
|
||||||
user_info_emojis =
|
|
||||||
user.info
|
|
||||||
|> Map.get(:emoji, [])
|
|
||||||
|> Enum.concat(Emoji.Formatter.get_emoji_map(emojis_text))
|
|
||||||
|> Enum.dedup()
|
|
||||||
|
|
||||||
info_params =
|
|
||||||
[
|
|
||||||
:no_rich_text,
|
|
||||||
:locked,
|
|
||||||
:hide_followers_count,
|
|
||||||
:hide_follows_count,
|
|
||||||
:hide_followers,
|
|
||||||
:hide_follows,
|
|
||||||
:hide_favorites,
|
|
||||||
:show_role,
|
|
||||||
:skip_thread_containment,
|
|
||||||
:discoverable
|
|
||||||
]
|
|
||||||
|> Enum.reduce(%{}, fn key, acc ->
|
|
||||||
add_if_present(acc, params, to_string(key), key, fn value ->
|
|
||||||
{:ok, truthy_param?(value)}
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
|> add_if_present(params, "default_scope", :default_scope)
|
|
||||||
|> add_if_present(params, "fields", :fields, fn fields ->
|
|
||||||
fields = Enum.map(fields, fn f -> Map.update!(f, "value", &AutoLinker.link(&1)) end)
|
|
||||||
|
|
||||||
{:ok, fields}
|
|
||||||
end)
|
|
||||||
|> add_if_present(params, "fields", :raw_fields)
|
|
||||||
|> add_if_present(params, "pleroma_settings_store", :pleroma_settings_store, fn value ->
|
|
||||||
{:ok, Map.merge(user.info.pleroma_settings_store, value)}
|
|
||||||
end)
|
|
||||||
|> add_if_present(params, "header", :banner, fn value ->
|
|
||||||
with %Plug.Upload{} <- value,
|
|
||||||
{:ok, object} <- ActivityPub.upload(value, type: :banner) do
|
|
||||||
{:ok, object.data}
|
|
||||||
else
|
|
||||||
_ -> :error
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|> add_if_present(params, "pleroma_background_image", :background, fn value ->
|
|
||||||
with %Plug.Upload{} <- value,
|
|
||||||
{:ok, object} <- ActivityPub.upload(value, type: :background) do
|
|
||||||
{:ok, object.data}
|
|
||||||
else
|
|
||||||
_ -> :error
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|> Map.put(:emoji, user_info_emojis)
|
|
||||||
|
|
||||||
changeset =
|
|
||||||
user
|
|
||||||
|> User.update_changeset(user_params)
|
|
||||||
|> User.change_info(&User.Info.profile_update(&1, info_params))
|
|
||||||
|
|
||||||
with {:ok, user} <- User.update_and_set_cache(changeset) do
|
|
||||||
if original_user != user, do: CommonAPI.update(user)
|
|
||||||
|
|
||||||
json(
|
|
||||||
conn,
|
|
||||||
AccountView.render("show.json", %{user: user, for: user, with_pleroma_settings: true})
|
|
||||||
)
|
|
||||||
else
|
|
||||||
_e -> render_error(conn, :forbidden, "Invalid request")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def verify_app_credentials(%{assigns: %{user: _user, token: token}} = conn, _) do
|
def verify_app_credentials(%{assigns: %{user: _user, token: token}} = conn, _) do
|
||||||
with %Token{app: %App{} = app} <- Repo.preload(token, :app) do
|
with %Token{app: %App{} = app} <- Repo.preload(token, :app) do
|
||||||
conn
|
conn
|
||||||
|
|
|
@ -380,7 +380,7 @@ defmodule Pleroma.Web.Router do
|
||||||
scope [] do
|
scope [] do
|
||||||
pipe_through(:oauth_write)
|
pipe_through(:oauth_write)
|
||||||
|
|
||||||
patch("/accounts/update_credentials", MastodonAPIController, :update_credentials)
|
patch("/accounts/update_credentials", AccountController, :update_credentials)
|
||||||
|
|
||||||
post("/statuses", StatusController, :create)
|
post("/statuses", StatusController, :create)
|
||||||
delete("/statuses/:id", StatusController, :delete)
|
delete("/statuses/:id", StatusController, :delete)
|
||||||
|
|
Loading…
Reference in a new issue