@@ -152,6 +152,69 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do | |||
end | |||
end | |||
def update_avatar(%{assigns: %{user: user}} = conn, %{"img" => ""}) do | |||
change = Changeset.change(user, %{avatar: nil}) | |||
{:ok, user} = User.update_and_set_cache(change) | |||
CommonAPI.update(user) | |||
json(conn, %{url: nil}) | |||
end | |||
def update_avatar(%{assigns: %{user: user}} = conn, params) do | |||
{:ok, object} = ActivityPub.upload(params, type: :avatar) | |||
change = Changeset.change(user, %{avatar: object.data}) | |||
{:ok, user} = User.update_and_set_cache(change) | |||
CommonAPI.update(user) | |||
%{"url" => [%{"href" => href} | _]} = object.data | |||
json(conn, %{url: href}) | |||
end | |||
def update_banner(%{assigns: %{user: user}} = conn, %{"banner" => ""}) do | |||
with new_info <- %{"banner" => %{}}, | |||
info_cng <- User.Info.profile_update(user.info, new_info), | |||
changeset <- Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_cng), | |||
{:ok, user} <- User.update_and_set_cache(changeset) do | |||
CommonAPI.update(user) | |||
json(conn, %{url: nil}) | |||
end | |||
end | |||
def update_banner(%{assigns: %{user: user}} = conn, params) do | |||
with {:ok, object} <- ActivityPub.upload(%{"img" => params["banner"]}, type: :banner), | |||
new_info <- %{"banner" => object.data}, | |||
info_cng <- User.Info.profile_update(user.info, new_info), | |||
changeset <- Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_cng), | |||
{:ok, user} <- User.update_and_set_cache(changeset) do | |||
CommonAPI.update(user) | |||
%{"url" => [%{"href" => href} | _]} = object.data | |||
json(conn, %{url: href}) | |||
end | |||
end | |||
def update_background(%{assigns: %{user: user}} = conn, %{"img" => ""}) do | |||
with new_info <- %{"background" => %{}}, | |||
info_cng <- User.Info.profile_update(user.info, new_info), | |||
changeset <- Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_cng), | |||
{:ok, _user} <- User.update_and_set_cache(changeset) do | |||
json(conn, %{url: nil}) | |||
end | |||
end | |||
def update_background(%{assigns: %{user: user}} = conn, params) do | |||
with {:ok, object} <- ActivityPub.upload(params, type: :background), | |||
new_info <- %{"background" => object.data}, | |||
info_cng <- User.Info.profile_update(user.info, new_info), | |||
changeset <- Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_cng), | |||
{:ok, _user} <- User.update_and_set_cache(changeset) do | |||
%{"url" => [%{"href" => href} | _]} = object.data | |||
json(conn, %{url: href}) | |||
end | |||
end | |||
def verify_credentials(%{assigns: %{user: user}} = conn, _) do | |||
account = AccountView.render("account.json", %{user: user, for: user}) | |||
json(conn, account) | |||
@@ -318,6 +318,10 @@ defmodule Pleroma.Web.Router do | |||
patch("/accounts/update_credentials", MastodonAPIController, :update_credentials) | |||
patch("/accounts/update_avatar", MastodonAPIController, :update_avatar) | |||
patch("/accounts/update_banner", MastodonAPIController, :update_banner) | |||
patch("/accounts/update_background", MastodonAPIController, :update_background) | |||
post("/statuses", MastodonAPIController, :post_status) | |||
delete("/statuses/:id", MastodonAPIController, :delete_status) | |||
@@ -24,6 +24,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do | |||
import ExUnit.CaptureLog | |||
import Tesla.Mock | |||
@image "data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7" | |||
setup do | |||
mock(fn env -> apply(HttpRequestMock, :request, [env]) end) | |||
:ok | |||
@@ -477,6 +479,101 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do | |||
assert expected == json_response(conn, 200) | |||
end | |||
test "user avatar can be set", %{conn: conn} do | |||
user = insert(:user) | |||
avatar_image = File.read!("test/fixtures/avatar_data_uri") | |||
conn = | |||
conn | |||
|> assign(:user, user) | |||
|> patch("/api/v1/accounts/update_avatar", %{img: avatar_image}) | |||
user = refresh_record(user) | |||
assert %{ | |||
"name" => _, | |||
"type" => _, | |||
"url" => [ | |||
%{ | |||
"href" => _, | |||
"mediaType" => _, | |||
"type" => _ | |||
} | |||
] | |||
} = user.avatar | |||
assert %{"url" => _} = json_response(conn, 200) | |||
end | |||
test "user avatar can be reset", %{conn: conn} do | |||
user = insert(:user) | |||
conn = | |||
conn | |||
|> assign(:user, user) | |||
|> patch("/api/v1/accounts/update_avatar", %{img: ""}) | |||
user = User.get_cached_by_id(user.id) | |||
assert user.avatar == nil | |||
assert %{"url" => nil} = json_response(conn, 200) | |||
end | |||
test "can set profile banner", %{conn: conn} do | |||
user = insert(:user) | |||
conn = | |||
conn | |||
|> assign(:user, user) | |||
|> patch("/api/v1/accounts/update_banner", %{"banner" => @image}) | |||
user = refresh_record(user) | |||
assert user.info.banner["type"] == "Image" | |||
assert %{"url" => _} = json_response(conn, 200) | |||
end | |||
test "can reset profile banner", %{conn: conn} do | |||
user = insert(:user) | |||
conn = | |||
conn | |||
|> assign(:user, user) | |||
|> patch("/api/v1/accounts/update_banner", %{"banner" => ""}) | |||
user = refresh_record(user) | |||
assert user.info.banner == %{} | |||
assert %{"url" => nil} = json_response(conn, 200) | |||
end | |||
test "background image can be set", %{conn: conn} do | |||
user = insert(:user) | |||
conn = | |||
conn | |||
|> assign(:user, user) | |||
|> patch("/api/v1/accounts/update_background", %{"img" => @image}) | |||
user = refresh_record(user) | |||
assert user.info.background["type"] == "Image" | |||
assert %{"url" => _} = json_response(conn, 200) | |||
end | |||
test "background image can be reset", %{conn: conn} do | |||
user = insert(:user) | |||
conn = | |||
conn | |||
|> assign(:user, user) | |||
|> patch("/api/v1/accounts/update_background", %{"img" => ""}) | |||
user = refresh_record(user) | |||
assert user.info.background == %{} | |||
assert %{"url" => nil} = json_response(conn, 200) | |||
end | |||
test "creates an oauth app", %{conn: conn} do | |||
user = insert(:user) | |||
app_attrs = build(:oauth_app) | |||