Move tag fixup to object_validator
authorHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Thu, 1 Apr 2021 11:49:04 +0000 (13:49 +0200)
committerHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Mon, 5 Apr 2021 17:07:45 +0000 (19:07 +0200)
lib/pleroma/web/activity_pub/object_validator.ex
lib/pleroma/web/activity_pub/pipeline.ex

index 15784b28ce709c76f5dbde8270416956d55d4d1d..70d9a35a92f545ba3d7da58e49a99689b8a686f6 100644 (file)
@@ -113,9 +113,34 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do
     end
   end
 
+  def validate(%{"type" => type} = object, meta)
+      when type in ~w[Event Question Audio Video Article] do
+    validator =
+      case type do
+        "Event" -> EventValidator
+        "Question" -> QuestionValidator
+        "Audio" -> AudioVideoValidator
+        "Video" -> AudioVideoValidator
+        "Article" -> ArticleNoteValidator
+      end
+
+    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)
+
+      {:ok, object, meta}
+    end
+  end
+
   def validate(%{"type" => type} = object, meta)
       when type in ~w[Accept Reject Follow Update Like EmojiReact Announce
-      Event ChatMessage Question Audio Video Article Answer] do
+      ChatMessage Answer] do
     validator =
       case type do
         "Accept" -> AcceptRejectValidator
@@ -125,12 +150,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do
         "Like" -> LikeValidator
         "EmojiReact" -> EmojiReactValidator
         "Announce" -> AnnounceValidator
-        "Event" -> EventValidator
         "ChatMessage" -> ChatMessageValidator
-        "Question" -> QuestionValidator
-        "Audio" -> AudioVideoValidator
-        "Video" -> AudioVideoValidator
-        "Article" -> ArticleNoteValidator
         "Answer" -> AnswerValidator
       end
 
index e184a937621595cd0444db0bc8f10949f4adc811..377eccb920d20006904e9a45ea63e8a932cbb8d4 100644 (file)
@@ -44,7 +44,6 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do
 
   def do_common_pipeline(message, meta) do
     with {_, {:ok, message, meta}} <- {:validate, @object_validator.validate(message, meta)},
-         {_, {:ok, message, meta}} <- {:fixup, validation_fixups(message, meta)},
          {_, {:ok, message, meta}} <- {:mrf, @mrf.pipeline_filter(message, meta)},
          {_, {:ok, message, meta}} <- {:persist, @activity_pub.persist(message, meta)},
          {_, {:ok, message, meta}} <- {:side_effects, @side_effects.handle(message, meta)},
@@ -56,19 +55,6 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do
     end
   end
 
-  defp validation_fixups(message, meta) do
-    # Insert copy of hashtags as strings for the non-hashtag table indexing
-    message =
-      if message["tag"] do
-        tag = Object.hashtags(%Object{data: message}) ++ (message["tag"] || [])
-        Map.put(message, "tag", tag)
-      else
-        message
-      end
-
-    {:ok, message, meta}
-  end
-
   defp maybe_federate(%Object{}, _), do: {:ok, :not_federated}
 
   defp maybe_federate(%Activity{} = activity, meta) do