forked from AkkomaGang/akkoma
Merge branch 'count-only-public-statuses' into 'develop'
Increment user note count only on public activities #703 See merge request pleroma/pleroma!884
This commit is contained in:
commit
c93479c6f5
3 changed files with 94 additions and 2 deletions
|
@ -81,6 +81,14 @@ defp check_remote_limit(%{"object" => %{"content" => content}}) when not is_nil(
|
||||||
|
|
||||||
defp check_remote_limit(_), do: true
|
defp check_remote_limit(_), do: true
|
||||||
|
|
||||||
|
def increase_note_count_if_public(actor, object) do
|
||||||
|
if is_public?(object), do: User.increase_note_count(actor), else: {:ok, actor}
|
||||||
|
end
|
||||||
|
|
||||||
|
def decrease_note_count_if_public(actor, object) do
|
||||||
|
if is_public?(object), do: User.decrease_note_count(actor), else: {:ok, actor}
|
||||||
|
end
|
||||||
|
|
||||||
def insert(map, local \\ true) when is_map(map) do
|
def insert(map, local \\ true) when is_map(map) do
|
||||||
with nil <- Activity.normalize(map),
|
with nil <- Activity.normalize(map),
|
||||||
map <- lazy_put_activity_defaults(map),
|
map <- lazy_put_activity_defaults(map),
|
||||||
|
@ -163,7 +171,7 @@ def create(%{to: to, actor: actor, context: context, object: object} = params) d
|
||||||
),
|
),
|
||||||
{:ok, activity} <- insert(create_data, local),
|
{:ok, activity} <- insert(create_data, local),
|
||||||
# Changing note count prior to enqueuing federation task in order to avoid race conditions on updating user.info
|
# Changing note count prior to enqueuing federation task in order to avoid race conditions on updating user.info
|
||||||
{:ok, _actor} <- User.increase_note_count(actor),
|
{:ok, _actor} <- increase_note_count_if_public(actor, activity),
|
||||||
:ok <- maybe_federate(activity) do
|
:ok <- maybe_federate(activity) do
|
||||||
{:ok, activity}
|
{:ok, activity}
|
||||||
end
|
end
|
||||||
|
@ -312,7 +320,7 @@ def delete(%Object{data: %{"id" => id, "actor" => actor}} = object, local \\ tru
|
||||||
with {:ok, _} <- Object.delete(object),
|
with {:ok, _} <- Object.delete(object),
|
||||||
{:ok, activity} <- insert(data, local),
|
{:ok, activity} <- insert(data, local),
|
||||||
# Changing note count prior to enqueuing federation task in order to avoid race conditions on updating user.info
|
# Changing note count prior to enqueuing federation task in order to avoid race conditions on updating user.info
|
||||||
{:ok, _actor} <- User.decrease_note_count(user),
|
{:ok, _actor} <- decrease_note_count_if_public(user, object),
|
||||||
:ok <- maybe_federate(activity) do
|
:ok <- maybe_federate(activity) do
|
||||||
{:ok, activity}
|
{:ok, activity}
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
defmodule Pleroma.Repo.Migrations.UpdateUserNoteCounters do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
@public "https://www.w3.org/ns/activitystreams#Public"
|
||||||
|
|
||||||
|
def up do
|
||||||
|
execute """
|
||||||
|
WITH public_note_count AS (
|
||||||
|
SELECT
|
||||||
|
data->>'actor' AS actor,
|
||||||
|
count(id) AS count
|
||||||
|
FROM objects
|
||||||
|
WHERE data->>'type' = 'Note' AND (
|
||||||
|
data->'cc' ? '#{@public}' OR data->'to' ? '#{@public}'
|
||||||
|
)
|
||||||
|
GROUP BY data->>'actor'
|
||||||
|
)
|
||||||
|
UPDATE users AS u
|
||||||
|
SET "info" = jsonb_set(u.info, '{note_count}', o.count::varchar::jsonb, true)
|
||||||
|
FROM public_note_count AS o
|
||||||
|
WHERE u.ap_id = o.actor
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
def down do
|
||||||
|
execute """
|
||||||
|
WITH public_note_count AS (
|
||||||
|
SELECT
|
||||||
|
data->>'actor' AS actor,
|
||||||
|
count(id) AS count
|
||||||
|
FROM objects
|
||||||
|
WHERE data->>'type' = 'Note'
|
||||||
|
GROUP BY data->>'actor'
|
||||||
|
)
|
||||||
|
UPDATE users AS u
|
||||||
|
SET "info" = jsonb_set(u.info, '{note_count}', o.count::varchar::jsonb, true)
|
||||||
|
FROM public_note_count AS o
|
||||||
|
WHERE u.ap_id = o.actor
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
end
|
|
@ -213,6 +213,25 @@ test "removes doubled 'to' recipients" do
|
||||||
assert activity.actor == user.ap_id
|
assert activity.actor == user.ap_id
|
||||||
assert activity.recipients == ["user1", "user2", user.ap_id]
|
assert activity.recipients == ["user1", "user2", user.ap_id]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "increases user note count only for public activities" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, _} =
|
||||||
|
CommonAPI.post(Repo.get(User, user.id), %{"status" => "1", "visibility" => "public"})
|
||||||
|
|
||||||
|
{:ok, _} =
|
||||||
|
CommonAPI.post(Repo.get(User, user.id), %{"status" => "2", "visibility" => "unlisted"})
|
||||||
|
|
||||||
|
{:ok, _} =
|
||||||
|
CommonAPI.post(Repo.get(User, user.id), %{"status" => "2", "visibility" => "private"})
|
||||||
|
|
||||||
|
{:ok, _} =
|
||||||
|
CommonAPI.post(Repo.get(User, user.id), %{"status" => "3", "visibility" => "direct"})
|
||||||
|
|
||||||
|
user = Repo.get(User, user.id)
|
||||||
|
assert user.info.note_count == 2
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "fetch activities for recipients" do
|
describe "fetch activities for recipients" do
|
||||||
|
@ -648,6 +667,30 @@ test "it creates a delete activity and deletes the original object" do
|
||||||
|
|
||||||
assert Repo.get(Object, object.id).data["type"] == "Tombstone"
|
assert Repo.get(Object, object.id).data["type"] == "Tombstone"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "decrements user note count only for public activities" do
|
||||||
|
user = insert(:user, info: %{note_count: 10})
|
||||||
|
|
||||||
|
{:ok, a1} =
|
||||||
|
CommonAPI.post(Repo.get(User, user.id), %{"status" => "yeah", "visibility" => "public"})
|
||||||
|
|
||||||
|
{:ok, a2} =
|
||||||
|
CommonAPI.post(Repo.get(User, user.id), %{"status" => "yeah", "visibility" => "unlisted"})
|
||||||
|
|
||||||
|
{:ok, a3} =
|
||||||
|
CommonAPI.post(Repo.get(User, user.id), %{"status" => "yeah", "visibility" => "private"})
|
||||||
|
|
||||||
|
{:ok, a4} =
|
||||||
|
CommonAPI.post(Repo.get(User, user.id), %{"status" => "yeah", "visibility" => "direct"})
|
||||||
|
|
||||||
|
{:ok, _} = a1.data["object"]["id"] |> Object.get_by_ap_id() |> ActivityPub.delete()
|
||||||
|
{:ok, _} = a2.data["object"]["id"] |> Object.get_by_ap_id() |> ActivityPub.delete()
|
||||||
|
{:ok, _} = a3.data["object"]["id"] |> Object.get_by_ap_id() |> ActivityPub.delete()
|
||||||
|
{:ok, _} = a4.data["object"]["id"] |> Object.get_by_ap_id() |> ActivityPub.delete()
|
||||||
|
|
||||||
|
user = Repo.get(User, user.id)
|
||||||
|
assert user.info.note_count == 10
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "timeline post-processing" do
|
describe "timeline post-processing" do
|
||||||
|
|
Loading…
Reference in a new issue