diff options
Diffstat (limited to 'lib/pleroma/web/activity_pub/object_validators/listen_validator.ex')
-rw-r--r-- | lib/pleroma/web/activity_pub/object_validators/listen_validator.ex | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/lib/pleroma/web/activity_pub/object_validators/listen_validator.ex b/lib/pleroma/web/activity_pub/object_validators/listen_validator.ex new file mode 100644 index 000000000..0c5e6819d --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/listen_validator.ex @@ -0,0 +1,82 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.ListenValidator do + use Ecto.Schema + + alias Pleroma.EctoType.ActivityPub.ObjectValidators + alias Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes + alias Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations + + import Ecto.Changeset + + @primary_key false + @derive Jason.Encoder + + embedded_schema do + quote do + unquote do + import Elixir.Pleroma.Web.ActivityPub.ObjectValidators.CommonFields + message_fields() + end + end + + field(:actor, ObjectValidators.ObjectID) + field(:published, ObjectValidators.DateTime) + + embeds_one :object, UrlObjectValidator, primary_key: false do + field(:type, :string) + + field(:to, ObjectValidators.Recipients, default: []) + field(:cc, ObjectValidators.Recipients, default: []) + field(:bto, ObjectValidators.Recipients, default: []) + field(:bcc, ObjectValidators.Recipients, default: []) + + field(:title, :string) + field(:artist, :string) + field(:album, :string) + field(:length, :integer) + end + end + + def changeset(struct, data) do + struct + |> cast(data, __schema__(:fields) -- [:object]) + |> cast_embed(:object, with: &audio_changeset/2) + end + + def audio_changeset(struct, data) do + struct + |> cast(data, Map.keys(struct) -- [:__struct__]) + |> validate_inclusion(:type, ["Audio"]) + end + + def cast_data(data, meta \\ []) do + data = fix(data, meta) + + %__MODULE__{} + |> changeset(data) + end + + def cast_and_validate(data, meta \\ []) do + data + |> cast_data(meta) + |> validate_data(meta) + end + + defp fix(data, _meta) do + data + |> CommonFixes.fix_actor() + |> CommonFixes.fix_activity_addressing() + end + + defp validate_data(data_cng, _meta) do + # TODO: Restrict to Audio objects + + data_cng + |> validate_inclusion(:type, ["Listen"]) + |> validate_required([:id, :type, :object, :actor, :to, :cc, :published]) + |> CommonValidations.validate_actor_presence() + end +end |