summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authormarcin mikołajczak <git@mkljczk.pl>2023-08-19 19:03:25 +0200
committermarcin mikołajczak <git@mkljczk.pl>2023-08-19 19:03:48 +0200
commit62340b50b57eeab0b7ab4093e07d05080991bfc4 (patch)
treeddbb6b72c33630776e06a67fb93994f7501fca02 /lib
parentedc8689d9176e0134dc9d3a45dae5b530f8950e9 (diff)
downloadpleroma-62340b50b57eeab0b7ab4093e07d05080991bfc4.tar.gz
pleroma-62340b50b57eeab0b7ab4093e07d05080991bfc4.zip
Move maybe_add_content_map out of Transmogrifier, use code from tusooa's branch for MapOfString
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/ecto_type/activity_pub/object_validators/map_of_string.ex48
-rw-r--r--lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex1
-rw-r--r--lib/pleroma/web/activity_pub/object_validators/common_fields.ex1
-rw-r--r--lib/pleroma/web/activity_pub/object_validators/common_fixes.ex8
-rw-r--r--lib/pleroma/web/activity_pub/object_validators/event_validator.ex20
-rw-r--r--lib/pleroma/web/activity_pub/transmogrifier.ex8
6 files changed, 69 insertions, 17 deletions
diff --git a/lib/pleroma/ecto_type/activity_pub/object_validators/map_of_string.ex b/lib/pleroma/ecto_type/activity_pub/object_validators/map_of_string.ex
new file mode 100644
index 000000000..e86275f92
--- /dev/null
+++ b/lib/pleroma/ecto_type/activity_pub/object_validators/map_of_string.ex
@@ -0,0 +1,48 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.EctoType.ActivityPub.ObjectValidators.MapOfString do
+ use Ecto.Type
+
+ import Pleroma.Web.CommonAPI.Utils, only: [is_good_locale_code?: 1]
+
+ def type, do: :map
+
+ def cast(%{} = object) do
+ with {status, %{} = data} when status in [:modified, :ok] <- validate_map(object) do
+ {:ok, data}
+ else
+ {_, nil} -> {:ok, nil}
+ {:error, _} -> :error
+ end
+ end
+
+ def cast(_), do: :error
+
+ def dump(data), do: {:ok, data}
+
+ def load(data), do: {:ok, data}
+
+ defp validate_map(%{} = object) do
+ {status, data} =
+ object
+ |> Enum.reduce({:ok, %{}}, fn
+ {lang, value}, {status, acc} when is_binary(lang) and is_binary(value) ->
+ if is_good_locale_code?(lang) do
+ {status, Map.put(acc, lang, value)}
+ else
+ {:modified, acc}
+ end
+
+ _, {_status, acc} ->
+ {:modified, acc}
+ end)
+
+ if data == %{} do
+ {status, nil}
+ else
+ {status, data}
+ end
+ end
+end
diff --git a/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex b/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
index 9e6a1b0fb..0c7aa769b 100644
--- a/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
@@ -87,6 +87,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator do
|> Transmogrifier.fix_emoji()
|> Transmogrifier.fix_content_map()
|> CommonFixes.maybe_add_language(meta)
+ |> CommonFixes.maybe_add_content_map()
end
def changeset(struct, data, meta \\ []) do
diff --git a/lib/pleroma/web/activity_pub/object_validators/common_fields.ex b/lib/pleroma/web/activity_pub/object_validators/common_fields.ex
index 7ba393270..0cef5b533 100644
--- a/lib/pleroma/web/activity_pub/object_validators/common_fields.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/common_fields.ex
@@ -31,6 +31,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFields do
defmacro object_fields do
quote bind_quoted: binding() do
field(:content, :string)
+ field(:contentMap, ObjectValidators.MapOfString)
field(:published, ObjectValidators.DateTime)
field(:updated, ObjectValidators.DateTime)
diff --git a/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex b/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex
index 66e44afe6..b141cc74c 100644
--- a/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex
@@ -11,6 +11,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes do
alias Pleroma.Web.ActivityPub.Utils
import Pleroma.Web.CommonAPI.Utils, only: [is_good_locale_code?: 1]
+ import Pleroma.Web.Utils.Guards, only: [not_empty_string: 1]
def cast_and_filter_recipients(message, field, follower_collection, field_fallback \\ []) do
{:ok, data} = ObjectValidators.Recipients.cast(message[field] || field_fallback)
@@ -118,4 +119,11 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes do
end
defp get_language_from_content_map(_), do: nil
+
+ def maybe_add_content_map(%{"language" => language, "content" => content} = object)
+ when not_empty_string(language) do
+ Map.put(object, "contentMap", Map.put(%{}, language, content))
+ end
+
+ def maybe_add_content_map(object), do: object
end
diff --git a/lib/pleroma/web/activity_pub/object_validators/event_validator.ex b/lib/pleroma/web/activity_pub/object_validators/event_validator.ex
index ab204f69a..56ca6fe40 100644
--- a/lib/pleroma/web/activity_pub/object_validators/event_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/event_validator.ex
@@ -26,32 +26,34 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.EventValidator do
end
end
- def cast_and_apply(data) do
+ def cast_and_apply(data, meta \\ []) do
data
- |> cast_data
+ |> cast_data(meta)
|> apply_action(:insert)
end
- def cast_and_validate(data) do
+ def cast_and_validate(data, meta \\ []) do
data
- |> cast_data()
+ |> cast_data(meta)
|> validate_data()
end
- def cast_data(data) do
+ def cast_data(data, meta \\ []) do
%__MODULE__{}
- |> changeset(data)
+ |> changeset(data, meta)
end
- defp fix(data) do
+ defp fix(data, meta) do
data
|> CommonFixes.fix_actor()
|> CommonFixes.fix_object_defaults()
|> Transmogrifier.fix_emoji()
+ |> CommonFixes.maybe_add_language(meta)
+ |> CommonFixes.maybe_add_content_map()
end
- def changeset(struct, data) do
- data = fix(data)
+ def changeset(struct, data, meta \\ []) do
+ data = fix(data, meta)
struct
|> cast(data, __schema__(:fields) -- [:attachment, :tag])
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index fd7059dea..a60e98c28 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -682,7 +682,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> add_mention_tags
|> add_emoji_tags
|> add_attributed_to
- |> maybe_add_content_map
|> prepare_attachments
|> set_conversation
|> set_reply_to_uri
@@ -956,11 +955,4 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def maybe_fix_user_url(data), do: data
def maybe_fix_user_object(data), do: maybe_fix_user_url(data)
-
- defp maybe_add_content_map(%{"language" => language, "content" => content} = object)
- when not_empty_string(language) do
- Map.put(object, "contentMap", Map.put(%{}, language, content))
- end
-
- defp maybe_add_content_map(object), do: object
end