Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

78 lines
1.8KB

  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.ActivityPub.ObjectValidators.TagValidator do
  5. use Ecto.Schema
  6. alias Pleroma.EctoType.ActivityPub.ObjectValidators
  7. import Ecto.Changeset
  8. @primary_key false
  9. embedded_schema do
  10. # Common
  11. field(:type, :string)
  12. field(:name, :string)
  13. # Mention, Hashtag
  14. field(:href, ObjectValidators.Uri)
  15. # Emoji
  16. embeds_one :icon, IconObjectValidator, primary_key: false do
  17. field(:type, :string)
  18. field(:url, ObjectValidators.Uri)
  19. end
  20. field(:updated, ObjectValidators.DateTime)
  21. field(:id, ObjectValidators.Uri)
  22. end
  23. def cast_and_validate(data) do
  24. data
  25. |> cast_data()
  26. end
  27. def cast_data(data) do
  28. %__MODULE__{}
  29. |> changeset(data)
  30. end
  31. def changeset(struct, %{"type" => "Mention"} = data) do
  32. struct
  33. |> cast(data, [:type, :name, :href])
  34. |> validate_required([:type, :href])
  35. end
  36. def changeset(struct, %{"type" => "Hashtag", "name" => name} = data) do
  37. name =
  38. cond do
  39. "#" <> name -> name
  40. name -> name
  41. end
  42. |> String.downcase()
  43. data = Map.put(data, "name", name)
  44. struct
  45. |> cast(data, [:type, :name, :href])
  46. |> validate_required([:type, :name])
  47. end
  48. def changeset(struct, %{"type" => "Emoji"} = data) do
  49. data = Map.put(data, "name", String.trim(data["name"], ":"))
  50. struct
  51. |> cast(data, [:type, :name, :updated, :id])
  52. |> cast_embed(:icon, with: &icon_changeset/2)
  53. |> validate_required([:type, :name, :icon])
  54. end
  55. def icon_changeset(struct, data) do
  56. struct
  57. |> cast(data, [:type, :url])
  58. |> validate_inclusion(:type, ~w[Image])
  59. |> validate_required([:type, :url])
  60. end
  61. end