Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into remake-remodel-dms
[akkoma] / lib / pleroma / web / activity_pub / transmogrifier / chat_message_handling.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.ActivityPub.Transmogrifier.ChatMessageHandling do
6 alias Pleroma.Object
7 alias Pleroma.Web.ActivityPub.ObjectValidator
8 alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator
9 alias Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator
10 alias Pleroma.Web.ActivityPub.Pipeline
11
12 def handle_incoming(
13 %{"type" => "Create", "object" => %{"type" => "ChatMessage"} = object_data} = data,
14 _options
15 ) do
16 with {_, {:ok, cast_data_sym}} <-
17 {:casting_data, data |> CreateChatMessageValidator.cast_and_apply()},
18 cast_data = ObjectValidator.stringify_keys(cast_data_sym),
19 {_, {:ok, object_cast_data_sym}} <-
20 {:casting_object_data, object_data |> ChatMessageValidator.cast_and_apply()},
21 object_cast_data = ObjectValidator.stringify_keys(object_cast_data_sym),
22 # For now, just strip HTML
23 stripped_content = Pleroma.HTML.strip_tags(object_cast_data["content"]),
24 object_cast_data = object_cast_data |> Map.put("content", stripped_content),
25 {_, true} <- {:to_fields_match, cast_data["to"] == object_cast_data["to"]},
26 {_, {:ok, validated_object, _meta}} <-
27 {:validate_object, ObjectValidator.validate(object_cast_data, %{})},
28 {_, {:ok, _created_object}} <- {:persist_object, Object.create(validated_object)},
29 {_, {:ok, activity, _meta}} <-
30 {:common_pipeline, Pipeline.common_pipeline(cast_data, local: false)} do
31 {:ok, activity}
32 else
33 e ->
34 {:error, e}
35 end
36 end
37 end