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

91 lines
2.4 KiB
Elixir
Raw Normal View History

2020-06-11 20:23:10 +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-06-11 20:23:10 +02:00
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.ActivityPub.ObjectValidators.QuestionValidator do
use Ecto.Schema
2020-06-20 00:23:04 +02:00
alias Pleroma.EctoType.ActivityPub.ObjectValidators
alias Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes
2020-06-11 20:23:10 +02:00
alias Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations
alias Pleroma.Web.ActivityPub.ObjectValidators.QuestionOptionsValidator
alias Pleroma.Web.ActivityPub.Transmogrifier
2020-06-11 20:23:10 +02:00
import Ecto.Changeset
@primary_key false
@derive Jason.Encoder
# Extends from NoteValidator
embedded_schema do
quote do
unquote do
import Elixir.Pleroma.Web.ActivityPub.ObjectValidators.CommonFields
message_fields()
object_fields()
status_object_fields()
end
end
2020-06-11 20:23:10 +02:00
2020-06-20 00:23:04 +02:00
field(:closed, ObjectValidators.DateTime)
field(:voters, {:array, ObjectValidators.ObjectID}, default: [])
2020-06-11 20:23:10 +02:00
embeds_many(:anyOf, QuestionOptionsValidator)
embeds_many(:oneOf, QuestionOptionsValidator)
end
def cast_and_apply(data) do
data
|> cast_data
|> apply_action(:insert)
end
def cast_and_validate(data) do
data
|> cast_data()
|> validate_data()
end
def cast_data(data) do
%__MODULE__{}
|> changeset(data)
end
defp fix_closed(data) do
cond do
is_binary(data["closed"]) -> data
is_binary(data["endTime"]) -> Map.put(data, "closed", data["endTime"])
true -> Map.drop(data, ["closed"])
end
end
defp fix(data) do
data
|> CommonFixes.fix_actor()
|> CommonFixes.fix_object_defaults()
|> Transmogrifier.fix_emoji()
|> fix_closed()
end
2020-06-11 20:23:10 +02:00
def changeset(struct, data) do
data = fix(data)
2020-06-11 20:23:10 +02:00
struct
2021-01-07 18:23:01 +01:00
|> cast(data, __schema__(:fields) -- [:anyOf, :oneOf, :attachment, :tag])
|> cast_embed(:attachment)
2020-06-11 20:23:10 +02:00
|> cast_embed(:anyOf)
|> cast_embed(:oneOf)
2021-01-07 18:23:01 +01:00
|> cast_embed(:tag)
2020-06-11 20:23:10 +02:00
end
defp validate_data(data_cng) do
2020-06-11 20:23:10 +02:00
data_cng
|> validate_inclusion(:type, ["Question"])
|> validate_required([:id, :actor, :attributedTo, :type, :context])
2020-06-11 20:23:10 +02:00
|> CommonValidations.validate_any_presence([:cc, :to])
|> CommonValidations.validate_fields_match([:actor, :attributedTo])
|> CommonValidations.validate_actor_presence()
2020-06-11 20:23:10 +02:00
|> CommonValidations.validate_any_presence([:oneOf, :anyOf])
|> CommonValidations.validate_host_match()
2020-06-11 20:23:10 +02:00
end
end