diff options
| author | kaniini <nenolod@gmail.com> | 2019-03-12 16:27:47 +0000 | 
|---|---|---|
| committer | kaniini <nenolod@gmail.com> | 2019-03-12 16:27:47 +0000 | 
| commit | c231ed610a8ebf95d9fb0a4bfa9e557ebf050a92 (patch) | |
| tree | 3323be8a5519e8d8ded0acc14d9d080554a5bf54 /lib | |
| parent | 4aa285e6ceb79ca8995ea9ff3585ea79e787650c (diff) | |
| parent | 984b5f8adfd1e7b981a270193d1ebd76f468576c (diff) | |
| download | pleroma-c231ed610a8ebf95d9fb0a4bfa9e557ebf050a92.tar.gz pleroma-c231ed610a8ebf95d9fb0a4bfa9e557ebf050a92.zip | |
Merge branch 'masto-api-followers-following' into 'develop'
MastoAPI followers/following endpoints
See merge request pleroma/pleroma!924
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/web/mastodon_api/mastodon_api.ex | 62 | ||||
| -rw-r--r-- | lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 11 | 
2 files changed, 69 insertions, 4 deletions
| diff --git a/lib/pleroma/web/mastodon_api/mastodon_api.ex b/lib/pleroma/web/mastodon_api/mastodon_api.ex index 8b1378917..c952c5806 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.User +  alias Pleroma.Repo + +  @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 diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index e7ca96114..a97bc7569 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -22,6 +22,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do    alias Pleroma.Web.MastodonAPI.MastodonView    alias Pleroma.Web.MastodonAPI.StatusView    alias Pleroma.Web.MastodonAPI.ReportView +  alias Pleroma.Web.MastodonAPI.MastodonAPI    alias Pleroma.Web.ActivityPub.ActivityPub    alias Pleroma.Web.ActivityPub.Utils    alias Pleroma.Web.ActivityPub.Visibility @@ -652,9 +653,9 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do      |> render("index.json", %{activities: activities, for: user, as: :activity})    end -  def followers(%{assigns: %{user: for_user}} = conn, %{"id" => id}) do +  def followers(%{assigns: %{user: for_user}} = conn, %{"id" => id} = params) do      with %User{} = user <- Repo.get(User, id), -         {:ok, followers} <- User.get_followers(user) do +         followers <- MastodonAPI.get_followers(user, params) do        followers =          cond do            for_user && user.id == for_user.id -> followers @@ -663,14 +664,15 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do          end        conn +      |> add_link_headers(:followers, followers, user)        |> put_view(AccountView)        |> render("accounts.json", %{users: followers, as: :user})      end    end -  def following(%{assigns: %{user: for_user}} = conn, %{"id" => id}) do +  def following(%{assigns: %{user: for_user}} = conn, %{"id" => id} = params) do      with %User{} = user <- Repo.get(User, id), -         {:ok, followers} <- User.get_friends(user) do +         followers <- MastodonAPI.get_friends(user, params) do        followers =          cond do            for_user && user.id == for_user.id -> followers @@ -679,6 +681,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do          end        conn +      |> add_link_headers(:following, followers, user)        |> put_view(AccountView)        |> render("accounts.json", %{users: followers, as: :user})      end | 
