pleroma/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex

97 lines
2.4 KiB
Elixir
Raw Normal View History

2020-05-06 16:12:36 +02:00
# Pleroma: A lightweight social networking server
2022-02-26 07:11:42 +01:00
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
2020-05-06 16:12:36 +02:00
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator do
use Ecto.Schema
alias Pleroma.EctoType.ActivityPub.ObjectValidators
2020-05-06 16:12:36 +02:00
import Ecto.Changeset
@primary_key false
embedded_schema do
2022-06-24 16:54:11 +02:00
field(:id, :string)
2020-05-06 16:12:36 +02:00
field(:type, :string)
field(:mediaType, ObjectValidators.MIME, default: "application/octet-stream")
2020-05-06 16:12:36 +02:00
field(:name, :string)
field(:blurhash, :string)
2020-05-06 16:12:36 +02:00
embeds_many :url, UrlObjectValidator, primary_key: false do
field(:type, :string)
field(:href, ObjectValidators.Uri)
field(:mediaType, ObjectValidators.MIME, default: "application/octet-stream")
2021-05-12 22:38:49 +02:00
field(:width, :integer)
field(:height, :integer)
end
2020-05-06 16:12:36 +02:00
end
def cast_and_validate(data) do
data
|> cast_data()
|> validate_data()
end
def cast_data(data) do
%__MODULE__{}
|> changeset(data)
end
def changeset(struct, data) do
data =
data
|> fix_media_type()
|> fix_url()
struct
2022-06-24 16:54:11 +02:00
|> cast(data, [:id, :type, :mediaType, :name, :blurhash])
|> cast_embed(:url, with: &url_changeset/2, required: true)
|> validate_inclusion(:type, ~w[Link Document Audio Image Video])
|> validate_required([:type, :mediaType])
end
def url_changeset(struct, data) do
data = fix_media_type(data)
struct
2021-05-12 22:38:49 +02:00
|> cast(data, [:type, :href, :mediaType, :width, :height])
|> validate_inclusion(:type, ["Link"])
|> validate_required([:type, :href, :mediaType])
2020-05-06 16:12:36 +02:00
end
def fix_media_type(data) do
Map.put_new(data, "mediaType", data["mimeType"] || "application/octet-stream")
2020-05-06 16:12:36 +02:00
end
defp handle_href(href, mediaType, data) do
2020-08-19 00:05:48 +02:00
[
%{
"href" => href,
"type" => "Link",
"mediaType" => mediaType,
"width" => data["width"],
"height" => data["height"]
2020-08-19 00:05:48 +02:00
}
]
end
defp fix_url(data) do
cond do
is_binary(data["url"]) ->
Map.put(data, "url", handle_href(data["url"], data["mediaType"], data))
2020-08-19 00:05:48 +02:00
is_binary(data["href"]) and data["url"] == nil ->
Map.put(data, "url", handle_href(data["href"], data["mediaType"], data))
2020-08-19 00:05:48 +02:00
true ->
2020-05-06 16:12:36 +02:00
data
end
end
defp validate_data(cng) do
2020-05-06 16:12:36 +02:00
cng
|> validate_inclusion(:type, ~w[Document Audio Image Video])
|> validate_required([:mediaType, :type])
2020-05-06 16:12:36 +02:00
end
end