Browse Source

Merge branch 'split-masto-api/media' into 'develop'

Extract media actions from `MastodonAPIController` to `MediaController`

See merge request pleroma/pleroma!1756
object-id-column
kaniini 4 years ago
parent
commit
b4369e7e68
5 changed files with 136 additions and 116 deletions
  1. +0
    -34
      lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex
  2. +42
    -0
      lib/pleroma/web/mastodon_api/controllers/media_controller.ex
  3. +2
    -2
      lib/pleroma/web/router.ex
  4. +92
    -0
      test/web/mastodon_api/controllers/media_controller_test.exs
  5. +0
    -80
      test/web/mastodon_api/mastodon_api_controller_test.exs

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

@@ -10,7 +10,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
alias Pleroma.Bookmark
alias Pleroma.Config
alias Pleroma.HTTP
alias Pleroma.Object
alias Pleroma.Pagination
alias Pleroma.Plugs.RateLimiter
alias Pleroma.Repo
@@ -115,39 +114,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
json(conn, mastodon_emoji)
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
with {_, %User{} = followed} <- {:followed, User.get_cached_by_nickname(uri)},
{_, true} <- {:followed, follower.id != followed.id},


+ 42
- 0
lib/pleroma/web/mastodon_api/controllers/media_controller.ex View 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

+ 2
- 2
lib/pleroma/web/router.ex View File

@@ -405,8 +405,8 @@ defmodule Pleroma.Web.Router do

post("/polls/:id/votes", PollController, :vote)

post("/media", MastodonAPIController, :upload)
put("/media/:id", MastodonAPIController, :update_media)
post("/media", MediaController, :create)
put("/media/:id", MediaController, :update)

delete("/lists/:id", ListController, :delete)
post("/lists", ListController, :create)


+ 92
- 0
test/web/mastodon_api/controllers/media_controller_test.exs View 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

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

@@ -12,7 +12,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
alias Pleroma.Repo
alias Pleroma.Tests.ObanHelpers
alias Pleroma.User
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.CommonAPI
alias Pleroma.Web.OAuth.App
alias Pleroma.Web.Push
@@ -77,43 +76,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
assert expected == json_response(conn, 200)
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
user = insert(:user)
other_user = insert(:user)
@@ -550,48 +512,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
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
test "redirect to root page", %{conn: conn} do
user = insert(:user)


Loading…
Cancel
Save