Browse Source

ability to set and reset avatar, profile banner and backgroud in Mastodon API

tags/v1.1.4
Sachin Joshi 5 years ago
parent
commit
1452a96ad6
3 changed files with 164 additions and 0 deletions
  1. +63
    -0
      lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
  2. +4
    -0
      lib/pleroma/web/router.ex
  3. +97
    -0
      test/web/mastodon_api/mastodon_api_controller_test.exs

+ 63
- 0
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex View File

@@ -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)


+ 4
- 0
lib/pleroma/web/router.ex View File

@@ -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)



+ 97
- 0
test/web/mastodon_api/mastodon_api_controller_test.exs View File

@@ -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)


Loading…
Cancel
Save