Merge branch 'feature/add-roles-to-users-admin-api' 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.User
6 alias Pleroma.Repo
7
8 @default_limit 20
9
10 def get_followers(user, params \\ %{}) do
11 user
12 |> User.get_followers_query()
13 |> paginate(params)
14 |> Repo.all()
15 end
16
17 def get_friends(user, params \\ %{}) do
18 user
19 |> User.get_friends_query()
20 |> paginate(params)
21 |> Repo.all()
22 end
23
24 def paginate(query, params \\ %{}) do
25 options = cast_params(params)
26
27 query
28 |> restrict(:max_id, options)
29 |> restrict(:since_id, options)
30 |> restrict(:limit, options)
31 |> order_by([u], fragment("? desc nulls last", u.id))
32 end
33
34 def cast_params(params) do
35 param_types = %{
36 max_id: :string,
37 since_id: :string,
38 limit: :integer
39 }
40
41 changeset = cast({%{}, param_types}, params, Map.keys(param_types))
42 changeset.changes
43 end
44
45 defp restrict(query, :max_id, %{max_id: max_id}) do
46 query
47 |> where([q], q.id < ^max_id)
48 end
49
50 defp restrict(query, :since_id, %{since_id: since_id}) do
51 query
52 |> where([q], q.id > ^since_id)
53 end
54
55 defp restrict(query, :limit, options) do
56 limit = Map.get(options, :limit, @default_limit)
57
58 query
59 |> limit(^limit)
60 end
61
62 defp restrict(query, _, _), do: query
63 end