CommonAPI: Allow URLs into media_ids

This commit is contained in:
Haelwenn (lanodan) Monnier 2021-08-28 03:53:56 +02:00
parent 84ec0fbeaa
commit 1d49a440b2
No known key found for this signature in database
GPG key ID: D5B7A8E43C997DEE
5 changed files with 54 additions and 10 deletions

View file

@ -7,6 +7,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## Unreleased
### Changed
- MastodonAPI: Allow to pass arbitrary URLs when creating a status
### Added

View file

@ -453,7 +453,7 @@ defmodule Pleroma.Web.ApiSpec.StatusOperation do
nullable: true,
type: :array,
items: %Schema{type: :string},
description: "Array of Attachment ids to be attached as media."
description: "Array of Attachment ids or URLs to be attached as media."
},
poll: poll_params(),
in_reply_to_id: %Schema{

View file

@ -23,6 +23,19 @@ defmodule Pleroma.Web.CommonAPI.Utils do
require Logger
require Pleroma.Constants
defp raw_url_to_attachment(url, desc \\ nil) do
%{
"type" => "Document",
"name" => desc,
"url" => [
%{
"type" => "Link",
"href" => url
}
]
}
end
def attachments_from_ids(%{media_ids: ids, descriptions: desc}) do
attachments_from_ids_descs(ids, desc)
end
@ -36,11 +49,15 @@ defmodule Pleroma.Web.CommonAPI.Utils do
def attachments_from_ids_no_descs([]), do: []
def attachments_from_ids_no_descs(ids) do
Enum.map(ids, fn media_id ->
case Repo.get(Object, media_id) do
%Object{data: data} -> data
_ -> nil
end
Enum.map(ids, fn
"http" <> _ = id ->
raw_url_to_attachment(id)
media_id ->
case Repo.get(Object, media_id) do
%Object{data: data} -> data
_ -> nil
end
end)
|> Enum.reject(&is_nil/1)
end
@ -50,10 +67,14 @@ defmodule Pleroma.Web.CommonAPI.Utils do
def attachments_from_ids_descs(ids, descs_str) do
{_, descs} = Jason.decode(descs_str)
Enum.map(ids, fn media_id ->
with %Object{data: data} <- Repo.get(Object, media_id) do
Map.put(data, "name", descs[media_id])
end
Enum.map(ids, fn
"http" <> _ = media_id ->
raw_url_to_attachment(media_id, descs[media_id])
media_id ->
with %Object{data: data} <- Repo.get(Object, media_id) do
Map.put(data, "name", descs[media_id])
end
end)
|> Enum.reject(&is_nil/1)
end

View file

@ -655,6 +655,16 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do
assert Utils.attachments_from_ids(%{media_ids: ["#{object.id}"]}) == [object.data]
end
test "returns attachment object with raw URL" do
assert Utils.attachments_from_ids(%{media_ids: ["https://example.org/corndog.jpeg"]}) == [
%{
"name" => nil,
"type" => "Document",
"url" => [%{"href" => "https://example.org/corndog.jpeg", "type" => "Link"}]
}
]
end
test "returns [] when not pass media_ids" do
assert Utils.attachments_from_ids(%{}) == []
end

View file

@ -182,6 +182,18 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do
assert json_response_and_validate_schema(conn, 200)
end
test "posting an undefined status with arbitrary URL as attachment", %{conn: conn} do
assert response =
conn
|> put_req_header("content-type", "application/json")
|> post("/api/v1/statuses", %{
"media_ids" => ["https://example.org/corndog.jpeg"]
})
|> json_response_and_validate_schema(200)
assert [%{"url" => "https://example.org/corndog.jpeg"}] = response["media_attachments"]
end
test "replying to a status", %{user: user, conn: conn} do
{:ok, replied_to} = CommonAPI.post(user, %{status: "cofe"})