Verified Commit 1d49a440 authored by Haelwenn's avatar Haelwenn

CommonAPI: Allow URLs into media_ids

parent 84ec0fbe
Pipeline #37307 passed with stages
in 7 minutes and 9 seconds
......@@ -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
......
......@@ -453,7 +453,7 @@ defp create_request 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{
......
......@@ -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 @@ def attachments_from_ids(_), 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 @@ def attachments_from_ids_descs([], _), 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
......
......@@ -655,6 +655,16 @@ test "returns attachments without descs" 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
......
......@@ -182,6 +182,18 @@ test "posting an undefined status with an attachment", %{user: user, conn: conn}
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"})
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment