aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorlain <lain@soykaf.club>2020-04-28 17:29:54 +0200
committerlain <lain@soykaf.club>2020-04-28 17:29:54 +0200
commitdedffd100c231aa69d7a7f7cd7126b90a84fc1ec (patch)
tree80771fd1e882e49e33ba793940d6cc9be49c7cc3 /lib
parentabd09282292f7e902c77b158ae3d86e9bfd5b986 (diff)
downloadpleroma-dedffd100c231aa69d7a7f7cd7126b90a84fc1ec.tar.gz
Pipeline: Unify, refactor, DRY.
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/web/activity_pub/builder.ex4
-rw-r--r--lib/pleroma/web/activity_pub/object_validator.ex18
-rw-r--r--lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex31
-rw-r--r--lib/pleroma/web/common_api/common_api.ex5
4 files changed, 23 insertions, 35 deletions
diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex
index 7576ed278..7f9c071b3 100644
--- a/lib/pleroma/web/activity_pub/builder.ex
+++ b/lib/pleroma/web/activity_pub/builder.ex
@@ -11,13 +11,13 @@ defmodule Pleroma.Web.ActivityPub.Builder do
alias Pleroma.Web.ActivityPub.Utils
alias Pleroma.Web.ActivityPub.Visibility
- def create(actor, object_id, recipients) do
+ def create(actor, object, recipients) do
{:ok,
%{
"id" => Utils.generate_activity_id(),
"actor" => actor.ap_id,
"to" => recipients,
- "object" => object_id,
+ "object" => object,
"type" => "Create",
"published" => DateTime.utc_now() |> DateTime.to_iso8601()
}, []}
diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex
index a4da9242a..bada3509d 100644
--- a/lib/pleroma/web/activity_pub/object_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validator.ex
@@ -38,16 +38,24 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do
end
end
- def validate(%{"type" => "Create"} = object, meta) do
- with {:ok, object} <-
- object
+ def validate(%{"type" => "Create", "object" => object} = create_activity, meta) do
+ with {:ok, object_data} <- cast_and_apply(object),
+ meta = Keyword.put(meta, :object_data, object_data |> stringify_keys),
+ {:ok, create_activity} <-
+ create_activity
|> CreateChatMessageValidator.cast_and_validate(meta)
|> Ecto.Changeset.apply_action(:insert) do
- object = stringify_keys(object)
- {:ok, object, meta}
+ create_activity = stringify_keys(create_activity)
+ {:ok, create_activity, meta}
end
end
+ def cast_and_apply(%{"type" => "ChatMessage"} = object) do
+ ChatMessageValidator.cast_and_apply(object)
+ end
+
+ def cast_and_apply(o), do: {:error, {:validator_not_set, o}}
+
def stringify_keys(%{__struct__: _} = object) do
object
|> Map.from_struct()
diff --git a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex
index 043d847d1..d9c36e313 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex
@@ -4,9 +4,6 @@
defmodule Pleroma.Web.ActivityPub.Transmogrifier.ChatMessageHandling do
alias Pleroma.Repo
- alias Pleroma.Web.ActivityPub.ObjectValidator
- alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator
- alias Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator
alias Pleroma.Web.ActivityPub.Pipeline
def handle_incoming(
@@ -15,30 +12,14 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.ChatMessageHandling do
) do
# Create has to be run inside a transaction because the object is created as a side effect.
# If this does not work, we need to roll back creating the activity.
- case Repo.transaction(fn -> do_handle_incoming(data) end) do
- {:ok, value} ->
- value
+ case Repo.transaction(fn -> Pipeline.common_pipeline(data, local: false) end) do
+ {:ok, {:ok, activity, _}} ->
+ {:ok, activity}
- {:error, e} ->
- {:error, e}
- end
- end
+ {:ok, e} ->
+ e
- def do_handle_incoming(
- %{"type" => "Create", "object" => %{"type" => "ChatMessage"} = object_data} = data
- ) do
- with {_, {:ok, cast_data_sym}} <-
- {:casting_data, data |> CreateChatMessageValidator.cast_and_apply()},
- cast_data = ObjectValidator.stringify_keys(cast_data_sym),
- {_, {:ok, object_cast_data_sym}} <-
- {:casting_object_data, object_data |> ChatMessageValidator.cast_and_apply()},
- object_cast_data = ObjectValidator.stringify_keys(object_cast_data_sym),
- {_, {:ok, activity, _meta}} <-
- {:common_pipeline,
- Pipeline.common_pipeline(cast_data, local: false, object_data: object_cast_data)} do
- {:ok, activity}
- else
- e ->
+ {:error, e} ->
{:error, e}
end
end
diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex
index c39d1cee6..ef86ec1e4 100644
--- a/lib/pleroma/web/common_api/common_api.ex
+++ b/lib/pleroma/web/common_api/common_api.ex
@@ -40,12 +40,11 @@ defmodule Pleroma.Web.CommonAPI do
)},
{_, {:ok, create_activity_data, _meta}} <-
{:build_create_activity,
- Builder.create(user, chat_message_data["id"], [recipient.ap_id])},
+ Builder.create(user, chat_message_data, [recipient.ap_id])},
{_, {:ok, %Activity{} = activity, _meta}} <-
{:common_pipeline,
Pipeline.common_pipeline(create_activity_data,
- local: true,
- object_data: chat_message_data
+ local: true
)} do
{:ok, activity}
else