Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into remake-remodel-dms
[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, default: "application/octet-stream")
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 data
46 |> Map.put_new("mediaType", data["mimeType"])
47
48 if data["mediaType"] == "" do
49 data
50 |> Map.put("mediaType", "application/octet-stream")
51 else
52 data
53 end
54 end
55
56 def fix_url(data) do
57 case data["url"] do
58 url when is_binary(url) ->
59 data
60 |> Map.put(
61 "url",
62 [
63 %{
64 "href" => url,
65 "type" => "Link",
66 "mediaType" => data["mediaType"]
67 }
68 ]
69 )
70
71 _ ->
72 data
73 end
74 end
75
76 def validate_data(cng) do
77 cng
78 |> validate_required([:mediaType, :url, :type])
79 end
80 end