Pass history items through ObjectValidator for updatable object types
This commit is contained in:
parent
4edc867b87
commit
4367489a3e
2 changed files with 106 additions and 7 deletions
|
|
@ -128,15 +128,20 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do
|
|||
end
|
||||
|
||||
with {:ok, object} <-
|
||||
object
|
||||
|> validator.cast_and_validate()
|
||||
|> Ecto.Changeset.apply_action(:insert) do
|
||||
object = stringify_keys(object)
|
||||
do_separate_with_history(object, fn object ->
|
||||
with {:ok, object} <-
|
||||
object
|
||||
|> validator.cast_and_validate()
|
||||
|> Ecto.Changeset.apply_action(:insert) do
|
||||
object = stringify_keys(object)
|
||||
|
||||
# Insert copy of hashtags as strings for the non-hashtag table indexing
|
||||
tag = (object["tag"] || []) ++ Object.hashtags(%Object{data: object})
|
||||
object = Map.put(object, "tag", tag)
|
||||
# Insert copy of hashtags as strings for the non-hashtag table indexing
|
||||
tag = (object["tag"] || []) ++ Object.hashtags(%Object{data: object})
|
||||
object = Map.put(object, "tag", tag)
|
||||
|
||||
{:ok, object}
|
||||
end
|
||||
end) do
|
||||
{:ok, object, meta}
|
||||
end
|
||||
end
|
||||
|
|
@ -262,4 +267,54 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do
|
|||
Object.normalize(object["object"], fetch: true)
|
||||
:ok
|
||||
end
|
||||
|
||||
defp for_each_history_item(
|
||||
%{"type" => "OrderedCollection", "orderedItems" => items} = history,
|
||||
object,
|
||||
fun
|
||||
) do
|
||||
processed_items =
|
||||
Enum.map(items, fn item ->
|
||||
with item <- Map.put(item, "id", object["id"]),
|
||||
{:ok, item} <- fun.(item) do
|
||||
item
|
||||
else
|
||||
_ -> nil
|
||||
end
|
||||
end)
|
||||
|
||||
if Enum.all?(processed_items, &(not is_nil(&1))) do
|
||||
{:ok, Map.put(history, "orderedItems", processed_items)}
|
||||
else
|
||||
{:error, :invalid_history}
|
||||
end
|
||||
end
|
||||
|
||||
defp for_each_history_item(nil, _object, _fun) do
|
||||
{:ok, nil}
|
||||
end
|
||||
|
||||
defp for_each_history_item(_, _object, _fun) do
|
||||
{:error, :invalid_history}
|
||||
end
|
||||
|
||||
# fun is (object -> {:ok, validated_object_with_string_keys})
|
||||
defp do_separate_with_history(object, fun) do
|
||||
with history <- object["formerRepresentations"],
|
||||
object <- Map.drop(object, ["formerRepresentations"]),
|
||||
{_, {:ok, object}} <- {:main_body, fun.(object)},
|
||||
{_, {:ok, history}} <- {:history_items, for_each_history_item(history, object, fun)} do
|
||||
object =
|
||||
if history do
|
||||
Map.put(object, "formerRepresentations", history)
|
||||
else
|
||||
object
|
||||
end
|
||||
|
||||
{:ok, object}
|
||||
else
|
||||
{:main_body, e} -> e
|
||||
{:history_items, e} -> e
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue