move to 2.5.5
[anni] / lib / pleroma / ecto_type / activity_pub / object_validators / recipients.ex
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
5 defmodule Pleroma.EctoType.ActivityPub.ObjectValidators.Recipients do
6   use Ecto.Type
7
8   alias Pleroma.EctoType.ActivityPub.ObjectValidators.ObjectID
9
10   def type, do: {:array, ObjectID}
11
12   def cast(object) when is_binary(object) do
13     cast([object])
14   end
15
16   def cast(object) when is_map(object) do
17     case ObjectID.cast(object) do
18       {:ok, data} -> {:ok, [data]}
19       _ -> :error
20     end
21   end
22
23   def cast(data) when is_list(data) do
24     data =
25       data
26       |> Enum.reduce_while([], fn element, list ->
27         case ObjectID.cast(element) do
28           {:ok, id} ->
29             {:cont, [id | list]}
30
31           _ ->
32             {:cont, list}
33         end
34       end)
35       |> Enum.sort()
36       |> Enum.uniq()
37
38     {:ok, data}
39   end
40
41   def cast(data) do
42     {:error, data}
43   end
44
45   def dump(data) do
46     {:ok, data}
47   end
48
49   def load(data) do
50     {:ok, data}
51   end
52 end