ChatMessages: Add attachments.
[akkoma] / lib / pleroma / web / activity_pub / object_validators / attachment_validator.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.ObjectValidators.AttachmentValidator do
6 use Ecto.Schema
7
8 alias Pleroma.Web.ActivityPub.ObjectValidators.UrlObjectValidator
9
10 import Ecto.Changeset
11
12 @primary_key false
13 embedded_schema do
14 field(:type, :string)
15 field(:mediaType, :string)
16 field(:name, :string)
17
18 embeds_many(:url, UrlObjectValidator)
19 end
20
21 def cast_and_validate(data) do
22 data
23 |> cast_data()
24 |> validate_data()
25 end
26
27 def cast_data(data) do
28 %__MODULE__{}
29 |> changeset(data)
30 end
31
32 def changeset(struct, data) do
33 data =
34 data
35 |> fix_media_type()
36 |> fix_url()
37
38 struct
39 |> cast(data, [:type, :mediaType, :name])
40 |> cast_embed(:url, required: true)
41 end
42
43 def fix_media_type(data) do
44 data
45 |> Map.put_new("mediaType", data["mimeType"])
46 end
47
48 def fix_url(data) do
49 case data["url"] do
50 url when is_binary(url) ->
51 data
52 |> Map.put(
53 "url",
54 [
55 %{
56 "href" => url,
57 "type" => "Link",
58 "mediaType" => data["mediaType"]
59 }
60 ]
61 )
62
63 _ ->
64 data
65 end
66 end
67
68 def validate_data(cng) do
69 cng
70 |> validate_required([:mediaType, :url, :type])
71 end
72 end