Expose posts media through AP
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -9,9 +9,15 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Post do
|
||||
alias Mobilizon.Federation.ActivityPub
|
||||
alias Mobilizon.Federation.ActivityPub.Utils
|
||||
alias Mobilizon.Federation.ActivityStream.{Converter, Convertible}
|
||||
alias Mobilizon.Federation.ActivityStream.Converter.Media, as: MediaConverter
|
||||
alias Mobilizon.Posts.Post
|
||||
require Logger
|
||||
|
||||
import Mobilizon.Federation.ActivityStream.Converter.Utils,
|
||||
only: [
|
||||
process_pictures: 2
|
||||
]
|
||||
|
||||
@behaviour Converter
|
||||
|
||||
defimpl Convertible, for: Post do
|
||||
@@ -20,6 +26,8 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Post do
|
||||
defdelegate model_to_as(post), to: PostConverter
|
||||
end
|
||||
|
||||
@banner_picture_name "Banner"
|
||||
|
||||
@doc """
|
||||
Convert an post struct to an ActivityStream representation
|
||||
"""
|
||||
@@ -35,8 +43,11 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Post do
|
||||
"name" => post.title,
|
||||
"content" => post.body,
|
||||
"attributedTo" => creator_url,
|
||||
"published" => (post.publish_at || post.inserted_at) |> to_date()
|
||||
"published" => (post.publish_at || post.inserted_at) |> to_date(),
|
||||
"attachment" => []
|
||||
}
|
||||
|> maybe_add_post_picture(post)
|
||||
|> maybe_add_inline_media(post)
|
||||
end
|
||||
|
||||
@doc """
|
||||
@@ -48,15 +59,19 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Post do
|
||||
%{"type" => "Article", "actor" => creator, "attributedTo" => group} = object
|
||||
) do
|
||||
with {:ok, %Actor{id: attributed_to_id}} <- get_actor(group),
|
||||
{:ok, %Actor{id: author_id}} <- get_actor(creator) do
|
||||
{:ok, %Actor{id: author_id}} <- get_actor(creator),
|
||||
[description: description, picture_id: picture_id, medias: medias] <-
|
||||
process_pictures(object, attributed_to_id) do
|
||||
%{
|
||||
title: object["name"],
|
||||
body: object["content"],
|
||||
body: description,
|
||||
url: object["id"],
|
||||
attributed_to_id: attributed_to_id,
|
||||
author_id: author_id,
|
||||
local: false,
|
||||
publish_at: object["published"]
|
||||
publish_at: object["published"],
|
||||
picture_id: picture_id,
|
||||
medias: medias
|
||||
}
|
||||
else
|
||||
{:error, err} -> {:error, err}
|
||||
@@ -70,4 +85,34 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Post do
|
||||
|
||||
defp to_date(%DateTime{} = date), do: DateTime.to_iso8601(date)
|
||||
defp to_date(%NaiveDateTime{} = date), do: NaiveDateTime.to_iso8601(date)
|
||||
|
||||
@spec maybe_add_post_picture(map(), Post.t()) :: map()
|
||||
defp maybe_add_post_picture(res, post) do
|
||||
if is_nil(post.picture),
|
||||
do: res,
|
||||
else:
|
||||
Map.update(
|
||||
res,
|
||||
"attachment",
|
||||
[],
|
||||
&(&1 ++
|
||||
[
|
||||
post.picture
|
||||
|> MediaConverter.model_to_as()
|
||||
|> Map.put("name", @banner_picture_name)
|
||||
])
|
||||
)
|
||||
end
|
||||
|
||||
@spec maybe_add_inline_media(map(), Post.t()) :: map()
|
||||
defp maybe_add_inline_media(res, post) do
|
||||
medias = Enum.map(post.media, &MediaConverter.model_to_as/1)
|
||||
|
||||
Map.update(
|
||||
res,
|
||||
"attachment",
|
||||
[],
|
||||
&(&1 ++ medias)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user