Merge branch 'masto-api-notifications' into 'develop'
[akkoma] / lib / pleroma / web / mastodon_api / mastodon_api.ex
1 defmodule Pleroma.Web.MastodonAPI.MastodonAPI do
2 import Ecto.Query
3 import Ecto.Changeset
4
5 alias Pleroma.Activity
6 alias Pleroma.Notification
7 alias Pleroma.Pagination
8 alias Pleroma.User
9
10 def get_followers(user, params \\ %{}) do
11 user
12 |> User.get_followers_query()
13 |> Pagination.fetch_paginated(params)
14 end
15
16 def get_friends(user, params \\ %{}) do
17 user
18 |> User.get_friends_query()
19 |> Pagination.fetch_paginated(params)
20 end
21
22 def get_notifications(user, params \\ %{}) do
23 options = cast_params(params)
24
25 user
26 |> Notification.for_user_query()
27 |> restrict(:exclude_types, options)
28 |> Pagination.fetch_paginated(params)
29 end
30
31 defp cast_params(params) do
32 param_types = %{
33 exclude_types: {:array, :string}
34 }
35
36 changeset = cast({%{}, param_types}, params, Map.keys(param_types))
37 changeset.changes
38 end
39
40 defp restrict(query, :exclude_types, %{exclude_types: mastodon_types = [_ | _]}) do
41 ap_types =
42 mastodon_types
43 |> Enum.map(&Activity.from_mastodon_notification_type/1)
44 |> Enum.filter(& &1)
45
46 query
47 |> where([q, a], not fragment("? @> ARRAY[?->>'type']::varchar[]", ^ap_types, a.data))
48 end
49
50 defp restrict(query, _, _), do: query
51 end