@@ -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}, | |||
@@ -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("/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) | |||
@@ -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.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) | |||