Merge branch 'cache-follow-state' into 'develop'
Cache follow state Closes #1180 See merge request pleroma/pleroma!1573
This commit is contained in:
commit
9fb71ce7f4
|
@ -26,4 +26,28 @@ def run(["tag"]) do
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def run(["render_timeline", nickname]) do
|
||||||
|
start_pleroma()
|
||||||
|
user = Pleroma.User.get_by_nickname(nickname)
|
||||||
|
|
||||||
|
activities =
|
||||||
|
%{}
|
||||||
|
|> Map.put("type", ["Create", "Announce"])
|
||||||
|
|> Map.put("blocking_user", user)
|
||||||
|
|> Map.put("muting_user", user)
|
||||||
|
|> Map.put("user", user)
|
||||||
|
|> Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities()
|
||||||
|
|> Enum.reverse()
|
||||||
|
|
||||||
|
Benchee.run(%{
|
||||||
|
"render_timeline" => fn ->
|
||||||
|
Pleroma.Web.MastodonAPI.StatusView.render("index.json", %{
|
||||||
|
activities: activities,
|
||||||
|
for: user,
|
||||||
|
as: :activity
|
||||||
|
})
|
||||||
|
end
|
||||||
|
})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -132,6 +132,28 @@ def user_info(%User{} = user, args \\ %{}) do
|
||||||
|> Map.put(:follower_count, follower_count)
|
|> Map.put(:follower_count, follower_count)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def follow_state(%User{} = user, %User{} = target) do
|
||||||
|
follow_activity = Utils.fetch_latest_follow(user, target)
|
||||||
|
|
||||||
|
if follow_activity,
|
||||||
|
do: follow_activity.data["state"],
|
||||||
|
# Ideally this would be nil, but then Cachex does not commit the value
|
||||||
|
else: false
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_cached_follow_state(user, target) do
|
||||||
|
key = "follow_state:#{user.ap_id}|#{target.ap_id}"
|
||||||
|
Cachex.fetch!(:user_cache, key, fn _ -> {:commit, follow_state(user, target)} end)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_follow_state_cache(user_ap_id, target_ap_id, state) do
|
||||||
|
Cachex.put(
|
||||||
|
:user_cache,
|
||||||
|
"follow_state:#{user_ap_id}|#{target_ap_id}",
|
||||||
|
state
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
def set_info_cache(user, args) do
|
def set_info_cache(user, args) do
|
||||||
Cachex.put(:user_cache, "user_info:#{user.id}", user_info(user, args))
|
Cachex.put(:user_cache, "user_info:#{user.id}", user_info(user, args))
|
||||||
end
|
end
|
||||||
|
|
|
@ -388,7 +388,8 @@ def unannounce(
|
||||||
def follow(follower, followed, activity_id \\ nil, local \\ true) do
|
def follow(follower, followed, activity_id \\ nil, local \\ true) do
|
||||||
with data <- make_follow_data(follower, followed, activity_id),
|
with data <- make_follow_data(follower, followed, activity_id),
|
||||||
{:ok, activity} <- insert(data, local),
|
{:ok, activity} <- insert(data, local),
|
||||||
:ok <- maybe_federate(activity) do
|
:ok <- maybe_federate(activity),
|
||||||
|
_ <- User.set_follow_state_cache(follower.ap_id, followed.ap_id, activity.data["state"]) do
|
||||||
{:ok, activity}
|
{:ok, activity}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -374,6 +374,7 @@ def update_follow_state_for_all(
|
||||||
[state, actor, object]
|
[state, actor, object]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
User.set_follow_state_cache(actor, object, state)
|
||||||
activity = Activity.get_by_id(activity.id)
|
activity = Activity.get_by_id(activity.id)
|
||||||
{:ok, activity}
|
{:ok, activity}
|
||||||
rescue
|
rescue
|
||||||
|
@ -382,12 +383,16 @@ def update_follow_state_for_all(
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_follow_state(%Activity{} = activity, state) do
|
def update_follow_state(
|
||||||
|
%Activity{data: %{"actor" => actor, "object" => object}} = activity,
|
||||||
|
state
|
||||||
|
) do
|
||||||
with new_data <-
|
with new_data <-
|
||||||
activity.data
|
activity.data
|
||||||
|> Map.put("state", state),
|
|> Map.put("state", state),
|
||||||
changeset <- Changeset.change(activity, data: new_data),
|
changeset <- Changeset.change(activity, data: new_data),
|
||||||
{:ok, activity} <- Repo.update(changeset) do
|
{:ok, activity} <- Repo.update(changeset),
|
||||||
|
_ <- User.set_follow_state_cache(actor, object, state) do
|
||||||
{:ok, activity}
|
{:ok, activity}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -37,11 +37,11 @@ def render("relationship.json", %{user: nil, target: _target}) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def render("relationship.json", %{user: %User{} = user, target: %User{} = target}) do
|
def render("relationship.json", %{user: %User{} = user, target: %User{} = target}) do
|
||||||
follow_activity = Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(user, target)
|
follow_state = User.get_cached_follow_state(user, target)
|
||||||
|
|
||||||
requested =
|
requested =
|
||||||
if follow_activity && !User.following?(target, user) do
|
if follow_state && !User.following?(user, target) do
|
||||||
follow_activity.data["state"] == "pending"
|
follow_state == "pending"
|
||||||
else
|
else
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue