X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=lib%2Fpleroma%2Fweb%2Fmastodon_api%2Fmastodon_api.ex;h=54cb6c97a3bbb7374360ac63766a4d048e875a1b;hb=a3a9cec4835738216800d2cebd295fb8dbf10f34;hp=8b137891791fe96927ad78e64b0aad7bded08bdc;hpb=4afbef39f49948ddd3b1cd1bbda58ff7e3ac2785;p=akkoma diff --git a/lib/pleroma/web/mastodon_api/mastodon_api.ex b/lib/pleroma/web/mastodon_api/mastodon_api.ex index 8b1378917..54cb6c97a 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api.ex @@ -1 +1,63 @@ +defmodule Pleroma.Web.MastodonAPI.MastodonAPI do + import Ecto.Query + import Ecto.Changeset + alias Pleroma.Repo + alias Pleroma.User + + @default_limit 20 + + def get_followers(user, params \\ %{}) do + user + |> User.get_followers_query() + |> paginate(params) + |> Repo.all() + end + + def get_friends(user, params \\ %{}) do + user + |> User.get_friends_query() + |> paginate(params) + |> Repo.all() + end + + def paginate(query, params \\ %{}) do + options = cast_params(params) + + query + |> restrict(:max_id, options) + |> restrict(:since_id, options) + |> restrict(:limit, options) + |> order_by([u], fragment("? desc nulls last", u.id)) + end + + def cast_params(params) do + param_types = %{ + max_id: :string, + since_id: :string, + limit: :integer + } + + changeset = cast({%{}, param_types}, params, Map.keys(param_types)) + changeset.changes + end + + defp restrict(query, :max_id, %{max_id: max_id}) do + query + |> where([q], q.id < ^max_id) + end + + defp restrict(query, :since_id, %{since_id: since_id}) do + query + |> where([q], q.id > ^since_id) + end + + defp restrict(query, :limit, options) do + limit = Map.get(options, :limit, @default_limit) + + query + |> limit(^limit) + end + + defp restrict(query, _, _), do: query +end