Merge branch 'split-masto-api/media' into 'develop'
Extract media actions from `MastodonAPIController` to `MediaController` See merge request pleroma/pleroma!1756
This commit is contained in:
commit
b4369e7e68
@ -10,7 +10,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
|||||||
alias Pleroma.Bookmark
|
alias Pleroma.Bookmark
|
||||||
alias Pleroma.Config
|
alias Pleroma.Config
|
||||||
alias Pleroma.HTTP
|
alias Pleroma.HTTP
|
||||||
alias Pleroma.Object
|
|
||||||
alias Pleroma.Pagination
|
alias Pleroma.Pagination
|
||||||
alias Pleroma.Plugs.RateLimiter
|
alias Pleroma.Plugs.RateLimiter
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
@ -115,39 +114,6 @@ def custom_emojis(conn, _params) do
|
|||||||
json(conn, mastodon_emoji)
|
json(conn, mastodon_emoji)
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_media(
|
|
||||||
%{assigns: %{user: user}} = conn,
|
|
||||||
%{"id" => id, "description" => description} = _
|
|
||||||
)
|
|
||||||
when is_binary(description) do
|
|
||||||
with %Object{} = object <- Repo.get(Object, id),
|
|
||||||
true <- Object.authorize_mutation(object, user),
|
|
||||||
{:ok, %Object{data: data}} <- Object.update_data(object, %{"name" => description}) do
|
|
||||||
attachment_data = Map.put(data, "id", object.id)
|
|
||||||
|
|
||||||
conn
|
|
||||||
|> put_view(StatusView)
|
|
||||||
|> render("attachment.json", %{attachment: attachment_data})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def update_media(_conn, _data), do: {:error, :bad_request}
|
|
||||||
|
|
||||||
def upload(%{assigns: %{user: user}} = conn, %{"file" => file} = data) do
|
|
||||||
with {:ok, object} <-
|
|
||||||
ActivityPub.upload(
|
|
||||||
file,
|
|
||||||
actor: User.ap_id(user),
|
|
||||||
description: Map.get(data, "description")
|
|
||||||
) do
|
|
||||||
attachment_data = Map.put(object.data, "id", object.id)
|
|
||||||
|
|
||||||
conn
|
|
||||||
|> put_view(StatusView)
|
|
||||||
|> render("attachment.json", %{attachment: attachment_data})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def follows(%{assigns: %{user: follower}} = conn, %{"uri" => uri}) do
|
def follows(%{assigns: %{user: follower}} = conn, %{"uri" => uri}) do
|
||||||
with {_, %User{} = followed} <- {:followed, User.get_cached_by_nickname(uri)},
|
with {_, %User{} = followed} <- {:followed, User.get_cached_by_nickname(uri)},
|
||||||
{_, true} <- {:followed, follower.id != followed.id},
|
{_, true} <- {:followed, follower.id != followed.id},
|
||||||
|
42
lib/pleroma/web/mastodon_api/controllers/media_controller.ex
Normal file
42
lib/pleroma/web/mastodon_api/controllers/media_controller.ex
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.MastodonAPI.MediaController do
|
||||||
|
use Pleroma.Web, :controller
|
||||||
|
|
||||||
|
alias Pleroma.Object
|
||||||
|
alias Pleroma.User
|
||||||
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
|
|
||||||
|
action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
|
||||||
|
plug(:put_view, Pleroma.Web.MastodonAPI.StatusView)
|
||||||
|
|
||||||
|
@doc "POST /api/v1/media"
|
||||||
|
def create(%{assigns: %{user: user}} = conn, %{"file" => file} = data) do
|
||||||
|
with {:ok, object} <-
|
||||||
|
ActivityPub.upload(
|
||||||
|
file,
|
||||||
|
actor: User.ap_id(user),
|
||||||
|
description: Map.get(data, "description")
|
||||||
|
) do
|
||||||
|
attachment_data = Map.put(object.data, "id", object.id)
|
||||||
|
|
||||||
|
render(conn, "attachment.json", %{attachment: attachment_data})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc "PUT /api/v1/media/:id"
|
||||||
|
def update(%{assigns: %{user: user}} = conn, %{"id" => id, "description" => description})
|
||||||
|
when is_binary(description) do
|
||||||
|
with %Object{} = object <- Object.get_by_id(id),
|
||||||
|
true <- Object.authorize_mutation(object, user),
|
||||||
|
{:ok, %Object{data: data}} <- Object.update_data(object, %{"name" => description}) do
|
||||||
|
attachment_data = Map.put(data, "id", object.id)
|
||||||
|
|
||||||
|
render(conn, "attachment.json", %{attachment: attachment_data})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def update(_conn, _data), do: {:error, :bad_request}
|
||||||
|
end
|
@ -405,8 +405,8 @@ defmodule Pleroma.Web.Router do
|
|||||||
|
|
||||||
post("/polls/:id/votes", PollController, :vote)
|
post("/polls/:id/votes", PollController, :vote)
|
||||||
|
|
||||||
post("/media", MastodonAPIController, :upload)
|
post("/media", MediaController, :create)
|
||||||
put("/media/:id", MastodonAPIController, :update_media)
|
put("/media/:id", MediaController, :update)
|
||||||
|
|
||||||
delete("/lists/:id", ListController, :delete)
|
delete("/lists/:id", ListController, :delete)
|
||||||
post("/lists", ListController, :create)
|
post("/lists", ListController, :create)
|
||||||
|
92
test/web/mastodon_api/controllers/media_controller_test.exs
Normal file
92
test/web/mastodon_api/controllers/media_controller_test.exs
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.MastodonAPI.MediaControllerTest do
|
||||||
|
use Pleroma.Web.ConnCase
|
||||||
|
|
||||||
|
alias Pleroma.Object
|
||||||
|
alias Pleroma.User
|
||||||
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
|
|
||||||
|
import Pleroma.Factory
|
||||||
|
|
||||||
|
describe "media upload" do
|
||||||
|
setup do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
build_conn()
|
||||||
|
|> assign(:user, user)
|
||||||
|
|
||||||
|
image = %Plug.Upload{
|
||||||
|
content_type: "image/jpg",
|
||||||
|
path: Path.absname("test/fixtures/image.jpg"),
|
||||||
|
filename: "an_image.jpg"
|
||||||
|
}
|
||||||
|
|
||||||
|
[conn: conn, image: image]
|
||||||
|
end
|
||||||
|
|
||||||
|
clear_config([:media_proxy])
|
||||||
|
clear_config([Pleroma.Upload])
|
||||||
|
|
||||||
|
test "returns uploaded image", %{conn: conn, image: image} do
|
||||||
|
desc = "Description of the image"
|
||||||
|
|
||||||
|
media =
|
||||||
|
conn
|
||||||
|
|> post("/api/v1/media", %{"file" => image, "description" => desc})
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
assert media["type"] == "image"
|
||||||
|
assert media["description"] == desc
|
||||||
|
assert media["id"]
|
||||||
|
|
||||||
|
object = Object.get_by_id(media["id"])
|
||||||
|
assert object.data["actor"] == User.ap_id(conn.assigns[:user])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "PUT /api/v1/media/:id" do
|
||||||
|
setup do
|
||||||
|
actor = insert(:user)
|
||||||
|
|
||||||
|
file = %Plug.Upload{
|
||||||
|
content_type: "image/jpg",
|
||||||
|
path: Path.absname("test/fixtures/image.jpg"),
|
||||||
|
filename: "an_image.jpg"
|
||||||
|
}
|
||||||
|
|
||||||
|
{:ok, %Object{} = object} =
|
||||||
|
ActivityPub.upload(
|
||||||
|
file,
|
||||||
|
actor: User.ap_id(actor),
|
||||||
|
description: "test-m"
|
||||||
|
)
|
||||||
|
|
||||||
|
[actor: actor, object: object]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "updates name of media", %{conn: conn, actor: actor, object: object} do
|
||||||
|
media =
|
||||||
|
conn
|
||||||
|
|> assign(:user, actor)
|
||||||
|
|> put("/api/v1/media/#{object.id}", %{"description" => "test-media"})
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
assert media["description"] == "test-media"
|
||||||
|
assert refresh_record(object).data["name"] == "test-media"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns error wheb request is bad", %{conn: conn, actor: actor, object: object} do
|
||||||
|
media =
|
||||||
|
conn
|
||||||
|
|> assign(:user, actor)
|
||||||
|
|> put("/api/v1/media/#{object.id}", %{})
|
||||||
|
|> json_response(400)
|
||||||
|
|
||||||
|
assert media == %{"error" => "bad_request"}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -12,7 +12,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
|
|||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
alias Pleroma.Tests.ObanHelpers
|
alias Pleroma.Tests.ObanHelpers
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.ActivityPub.ActivityPub
|
|
||||||
alias Pleroma.Web.CommonAPI
|
alias Pleroma.Web.CommonAPI
|
||||||
alias Pleroma.Web.OAuth.App
|
alias Pleroma.Web.OAuth.App
|
||||||
alias Pleroma.Web.Push
|
alias Pleroma.Web.Push
|
||||||
@ -77,43 +76,6 @@ test "creates an oauth app", %{conn: conn} do
|
|||||||
assert expected == json_response(conn, 200)
|
assert expected == json_response(conn, 200)
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "media upload" do
|
|
||||||
setup do
|
|
||||||
user = insert(:user)
|
|
||||||
|
|
||||||
conn =
|
|
||||||
build_conn()
|
|
||||||
|> assign(:user, user)
|
|
||||||
|
|
||||||
image = %Plug.Upload{
|
|
||||||
content_type: "image/jpg",
|
|
||||||
path: Path.absname("test/fixtures/image.jpg"),
|
|
||||||
filename: "an_image.jpg"
|
|
||||||
}
|
|
||||||
|
|
||||||
[conn: conn, image: image]
|
|
||||||
end
|
|
||||||
|
|
||||||
clear_config([:media_proxy])
|
|
||||||
clear_config([Pleroma.Upload])
|
|
||||||
|
|
||||||
test "returns uploaded image", %{conn: conn, image: image} do
|
|
||||||
desc = "Description of the image"
|
|
||||||
|
|
||||||
media =
|
|
||||||
conn
|
|
||||||
|> post("/api/v1/media", %{"file" => image, "description" => desc})
|
|
||||||
|> json_response(:ok)
|
|
||||||
|
|
||||||
assert media["type"] == "image"
|
|
||||||
assert media["description"] == desc
|
|
||||||
assert media["id"]
|
|
||||||
|
|
||||||
object = Repo.get(Object, media["id"])
|
|
||||||
assert object.data["actor"] == User.ap_id(conn.assigns[:user])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
test "getting a list of mutes", %{conn: conn} do
|
test "getting a list of mutes", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
@ -550,48 +512,6 @@ test "returns suggestions", %{conn: conn, user: user, other_user: other_user} do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "PUT /api/v1/media/:id" do
|
|
||||||
setup do
|
|
||||||
actor = insert(:user)
|
|
||||||
|
|
||||||
file = %Plug.Upload{
|
|
||||||
content_type: "image/jpg",
|
|
||||||
path: Path.absname("test/fixtures/image.jpg"),
|
|
||||||
filename: "an_image.jpg"
|
|
||||||
}
|
|
||||||
|
|
||||||
{:ok, %Object{} = object} =
|
|
||||||
ActivityPub.upload(
|
|
||||||
file,
|
|
||||||
actor: User.ap_id(actor),
|
|
||||||
description: "test-m"
|
|
||||||
)
|
|
||||||
|
|
||||||
[actor: actor, object: object]
|
|
||||||
end
|
|
||||||
|
|
||||||
test "updates name of media", %{conn: conn, actor: actor, object: object} do
|
|
||||||
media =
|
|
||||||
conn
|
|
||||||
|> assign(:user, actor)
|
|
||||||
|> put("/api/v1/media/#{object.id}", %{"description" => "test-media"})
|
|
||||||
|> json_response(:ok)
|
|
||||||
|
|
||||||
assert media["description"] == "test-media"
|
|
||||||
assert refresh_record(object).data["name"] == "test-media"
|
|
||||||
end
|
|
||||||
|
|
||||||
test "returns error wheb request is bad", %{conn: conn, actor: actor, object: object} do
|
|
||||||
media =
|
|
||||||
conn
|
|
||||||
|> assign(:user, actor)
|
|
||||||
|> put("/api/v1/media/#{object.id}", %{})
|
|
||||||
|> json_response(400)
|
|
||||||
|
|
||||||
assert media == %{"error" => "bad_request"}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "DELETE /auth/sign_out" do
|
describe "DELETE /auth/sign_out" do
|
||||||
test "redirect to root page", %{conn: conn} do
|
test "redirect to root page", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
Loading…
Reference in New Issue
Block a user