logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

question_validator.ex (2497B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.ActivityPub.ObjectValidators.QuestionValidator do
  5. use Ecto.Schema
  6. alias Pleroma.EctoType.ActivityPub.ObjectValidators
  7. alias Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes
  8. alias Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations
  9. alias Pleroma.Web.ActivityPub.ObjectValidators.QuestionOptionsValidator
  10. alias Pleroma.Web.ActivityPub.Transmogrifier
  11. import Ecto.Changeset
  12. @primary_key false
  13. @derive Jason.Encoder
  14. # Extends from NoteValidator
  15. embedded_schema do
  16. quote do
  17. unquote do
  18. import Elixir.Pleroma.Web.ActivityPub.ObjectValidators.CommonFields
  19. message_fields()
  20. object_fields()
  21. status_object_fields()
  22. end
  23. end
  24. field(:closed, ObjectValidators.DateTime)
  25. field(:voters, {:array, ObjectValidators.ObjectID}, default: [])
  26. embeds_many(:anyOf, QuestionOptionsValidator)
  27. embeds_many(:oneOf, QuestionOptionsValidator)
  28. end
  29. def cast_and_apply(data) do
  30. data
  31. |> cast_data
  32. |> apply_action(:insert)
  33. end
  34. def cast_and_validate(data) do
  35. data
  36. |> cast_data()
  37. |> validate_data()
  38. end
  39. def cast_data(data) do
  40. %__MODULE__{}
  41. |> changeset(data)
  42. end
  43. defp fix_closed(data) do
  44. cond do
  45. is_binary(data["closed"]) -> data
  46. is_binary(data["endTime"]) -> Map.put(data, "closed", data["endTime"])
  47. true -> Map.drop(data, ["closed"])
  48. end
  49. end
  50. defp fix(data) do
  51. data
  52. |> CommonFixes.fix_actor()
  53. |> CommonFixes.fix_object_defaults()
  54. |> CommonFixes.fix_quote_url()
  55. |> Transmogrifier.fix_emoji()
  56. |> fix_closed()
  57. end
  58. def changeset(struct, data) do
  59. data = fix(data)
  60. struct
  61. |> cast(data, __schema__(:fields) -- [:anyOf, :oneOf, :attachment, :tag])
  62. |> cast_embed(:attachment)
  63. |> cast_embed(:anyOf)
  64. |> cast_embed(:oneOf)
  65. |> cast_embed(:tag)
  66. end
  67. defp validate_data(data_cng) do
  68. data_cng
  69. |> validate_inclusion(:type, ["Question"])
  70. |> validate_required([:id, :actor, :attributedTo, :type, :context])
  71. |> CommonValidations.validate_any_presence([:cc, :to])
  72. |> CommonValidations.validate_fields_match([:actor, :attributedTo])
  73. |> CommonValidations.validate_actor_presence()
  74. |> CommonValidations.validate_any_presence([:oneOf, :anyOf])
  75. |> CommonValidations.validate_host_match()
  76. end
  77. end