diff options
author | lain <lain@soykaf.club> | 2018-03-31 20:02:09 +0200 |
---|---|---|
committer | lain <lain@soykaf.club> | 2018-03-31 20:02:09 +0200 |
commit | 2222e5599c4f93c310564a01a16c37763a5c430d (patch) | |
tree | 940b7d19ddec9744fd93225ab78bc8734e033ceb /lib | |
parent | 57b24b2cbaba9a85a715a311db31654995232b10 (diff) | |
download | pleroma-2222e5599c4f93c310564a01a16c37763a5c430d.tar.gz |
Don't fetch anything except ap_id for follower / following
collections.
Should speed up the queries because ecto doesn't have to parse the json.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/user.ex | 34 | ||||
-rw-r--r-- | lib/pleroma/web/activity_pub/views/user_view.ex | 21 |
2 files changed, 36 insertions, 19 deletions
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 55b290309..abeb169d9 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -278,24 +278,30 @@ defmodule Pleroma.User do end end - def get_followers(%User{id: id, follower_address: follower_address}) do - q = - from( - u in User, - where: fragment("? <@ ?", ^[follower_address], u.following), - where: u.id != ^id - ) + def get_followers_query(%User{id: id, follower_address: follower_address}) do + from( + u in User, + where: fragment("? <@ ?", ^[follower_address], u.following), + where: u.id != ^id + ) + end + + def get_followers(user) do + q = get_followers_query(user) {:ok, Repo.all(q)} end - def get_friends(%User{id: id, following: following}) do - q = - from( - u in User, - where: u.follower_address in ^following, - where: u.id != ^id - ) + def get_friends_query(%User{id: id, following: following}) do + from( + u in User, + where: u.follower_address in ^following, + where: u.id != ^id + ) + end + + def get_friends(user) do + q = get_friends_query(user) {:ok, Repo.all(q)} end diff --git a/lib/pleroma/web/activity_pub/views/user_view.ex b/lib/pleroma/web/activity_pub/views/user_view.ex index 997d8308f..92afd0872 100644 --- a/lib/pleroma/web/activity_pub/views/user_view.ex +++ b/lib/pleroma/web/activity_pub/views/user_view.ex @@ -3,9 +3,11 @@ defmodule Pleroma.Web.ActivityPub.UserView do alias Pleroma.Web.Salmon alias Pleroma.Web.WebFinger alias Pleroma.User + alias Pleroma.Repo alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Transmogrifier alias Pleroma.Web.ActivityPub.Utils + import Ecto.Query def render("user.json", %{user: user}) do {:ok, user} = WebFinger.ensure_keys_present(user) @@ -45,10 +47,11 @@ defmodule Pleroma.Web.ActivityPub.UserView do |> Map.merge(Utils.make_json_ld_header()) end - def collection(collection, iri, page) do + def collection(collection, iri, page, total \\ nil) do offset = (page - 1) * 10 items = Enum.slice(collection, offset, 10) items = Enum.map(items, fn user -> user.ap_id end) + total = total || length(collection) map = %{ "id" => "#{iri}?page=#{page}", @@ -64,14 +67,18 @@ defmodule Pleroma.Web.ActivityPub.UserView do end def render("following.json", %{user: user, page: page}) do - {:ok, following} = User.get_friends(user) + query = User.get_friends_query(user) + query = from(user in query, select: [:ap_id]) + following = Repo.all(query) collection(following, "#{user.ap_id}/following", page) |> Map.merge(Utils.make_json_ld_header()) end def render("following.json", %{user: user}) do - {:ok, following} = User.get_friends(user) + query = User.get_friends_query(user) + query = from(user in query, select: [:ap_id]) + following = Repo.all(query) %{ "id" => "#{user.ap_id}/following", @@ -83,14 +90,18 @@ defmodule Pleroma.Web.ActivityPub.UserView do end def render("followers.json", %{user: user, page: page}) do - {:ok, followers} = User.get_followers(user) + query = User.get_followers_query(user) + query = from(user in query, select: [:ap_id]) + followers = Repo.all(query) collection(followers, "#{user.ap_id}/followers", page) |> Map.merge(Utils.make_json_ld_header()) end def render("followers.json", %{user: user}) do - {:ok, followers} = User.get_followers(user) + query = User.get_followers_query(user) + query = from(user in query, select: [:ap_id]) + followers = Repo.all(query) %{ "id" => "#{user.ap_id}/followers", |