aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Chvanikov <chvanikoff@pm.me>2020-05-09 11:30:37 +0300
committerRoman Chvanikov <chvanikoff@pm.me>2020-05-09 11:30:37 +0300
commitcbe383ae832f13d5d2a20ee8fb5e85498205fbc3 (patch)
treef61d822df39cf74652508fb343a06662c44e660b
parent39d2f2118aed7906cb352d8a37f22da73f3a3aa3 (diff)
downloadpleroma-cbe383ae832f13d5d2a20ee8fb5e85498205fbc3.tar.gz
Update stats admin endpoint
-rw-r--r--lib/pleroma/counter_cache.ex6
-rw-r--r--lib/pleroma/stats.ex15
-rw-r--r--lib/pleroma/web/admin_api/admin_api_controller.ex7
-rw-r--r--priv/repo/migrations/20200508092434_update_counter_cache_table.exs8
-rw-r--r--test/stats_test.exs55
-rw-r--r--test/web/admin_api/admin_api_controller_test.exs20
6 files changed, 87 insertions, 24 deletions
diff --git a/lib/pleroma/counter_cache.ex b/lib/pleroma/counter_cache.ex
index b469e7b50..a940b5e50 100644
--- a/lib/pleroma/counter_cache.ex
+++ b/lib/pleroma/counter_cache.ex
@@ -40,7 +40,7 @@ defmodule Pleroma.CounterCache do
end
end
- def get_as_map() do
+ def get_sum() do
CounterCache
|> select([c], %{
"public" => sum(c.public),
@@ -49,6 +49,10 @@ defmodule Pleroma.CounterCache do
"direct" => sum(c.direct)
})
|> Repo.one()
+ |> Enum.map(fn {visibility, dec_count} ->
+ {visibility, Decimal.to_integer(dec_count)}
+ end)
+ |> Enum.into(%{})
end
def set(instance, values) do
diff --git a/lib/pleroma/stats.ex b/lib/pleroma/stats.ex
index 4e355bd5c..9a03f01db 100644
--- a/lib/pleroma/stats.ex
+++ b/lib/pleroma/stats.ex
@@ -97,14 +97,11 @@ defmodule Pleroma.Stats do
}
end
- def get_status_visibility_count do
- counter_cache = CounterCache.get_as_map()
-
- %{
- public: counter_cache["status_visibility_public"] || 0,
- unlisted: counter_cache["status_visibility_unlisted"] || 0,
- private: counter_cache["status_visibility_private"] || 0,
- direct: counter_cache["status_visibility_direct"] || 0
- }
+ def get_status_visibility_count(instance \\ nil) do
+ if is_nil(instance) do
+ CounterCache.get_sum()
+ else
+ CounterCache.get_by_instance(instance)
+ end
end
end
diff --git a/lib/pleroma/web/admin_api/admin_api_controller.ex b/lib/pleroma/web/admin_api/admin_api_controller.ex
index 9f1fd3aeb..4db9f4cac 100644
--- a/lib/pleroma/web/admin_api/admin_api_controller.ex
+++ b/lib/pleroma/web/admin_api/admin_api_controller.ex
@@ -1122,11 +1122,10 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
end
end
- def stats(conn, _) do
- count = Stats.get_status_visibility_count()
+ def stats(conn, params) do
+ counters = Stats.get_status_visibility_count(params["instance"])
- conn
- |> json(%{"status_visibility" => count})
+ json(conn, %{"status_visibility" => counters})
end
defp errors(conn, {:error, :not_found}) do
diff --git a/priv/repo/migrations/20200508092434_update_counter_cache_table.exs b/priv/repo/migrations/20200508092434_update_counter_cache_table.exs
index 81a8d6397..3d9bfc877 100644
--- a/priv/repo/migrations/20200508092434_update_counter_cache_table.exs
+++ b/priv/repo/migrations/20200508092434_update_counter_cache_table.exs
@@ -43,7 +43,8 @@ defmodule Pleroma.Repo.Migrations.UpdateCounterCacheTable do
END IF;
IF TG_OP = 'INSERT' THEN
visibility_new := activity_visibility(NEW.actor, NEW.recipients, NEW.data);
- IF NEW.data->>'type' = 'Create' THEN
+ IF NEW.data->>'type' = 'Create'
+ AND visibility_new IN ('public', 'unlisted', 'private', 'direct') THEN
EXECUTE format('INSERT INTO "counter_cache" ("instance", %1$I) VALUES ($1, 1)
ON CONFLICT ("instance") DO
UPDATE SET %1$I = "counter_cache".%1$I + 1', visibility_new)
@@ -53,7 +54,10 @@ defmodule Pleroma.Repo.Migrations.UpdateCounterCacheTable do
ELSIF TG_OP = 'UPDATE' THEN
visibility_new := activity_visibility(NEW.actor, NEW.recipients, NEW.data);
visibility_old := activity_visibility(OLD.actor, OLD.recipients, OLD.data);
- IF (NEW.data->>'type' = 'Create') and (OLD.data->>'type' = 'Create') and visibility_new != visibility_old THEN
+ IF (NEW.data->>'type' = 'Create')
+ AND (OLD.data->>'type' = 'Create')
+ AND visibility_new != visibility_old
+ AND visibility_new IN ('public', 'unlisted', 'private', 'direct') THEN
EXECUTE format('UPDATE "counter_cache" SET
%1$I = greatest("counter_cache".%1$I - 1, 0),
%2$I = "counter_cache".%2$I + 1
diff --git a/test/stats_test.exs b/test/stats_test.exs
index c1aeb2c7f..33ed0b7dd 100644
--- a/test/stats_test.exs
+++ b/test/stats_test.exs
@@ -17,10 +17,11 @@ defmodule Pleroma.StatsTest do
end
end
- describe "status visibility count" do
+ describe "status visibility sum count" do
test "on new status" do
+ instance2 = "instance2.tld"
user = insert(:user)
- other_user = insert(:user)
+ other_user = insert(:user, %{ap_id: "https://#{instance2}/@actor"})
CommonAPI.post(user, %{"visibility" => "public", "status" => "hey"})
@@ -45,24 +46,24 @@ defmodule Pleroma.StatsTest do
})
end)
- assert %{direct: 3, private: 4, public: 1, unlisted: 2} =
+ assert %{"direct" => 3, "private" => 4, "public" => 1, "unlisted" => 2} =
Pleroma.Stats.get_status_visibility_count()
end
test "on status delete" do
user = insert(:user)
{:ok, activity} = CommonAPI.post(user, %{"visibility" => "public", "status" => "hey"})
- assert %{public: 1} = Pleroma.Stats.get_status_visibility_count()
+ assert %{"public" => 1} = Pleroma.Stats.get_status_visibility_count()
CommonAPI.delete(activity.id, user)
- assert %{public: 0} = Pleroma.Stats.get_status_visibility_count()
+ assert %{"public" => 0} = Pleroma.Stats.get_status_visibility_count()
end
test "on status visibility update" do
user = insert(:user)
{:ok, activity} = CommonAPI.post(user, %{"visibility" => "public", "status" => "hey"})
- assert %{public: 1, private: 0} = Pleroma.Stats.get_status_visibility_count()
+ assert %{"public" => 1, "private" => 0} = Pleroma.Stats.get_status_visibility_count()
{:ok, _} = CommonAPI.update_activity_scope(activity.id, %{"visibility" => "private"})
- assert %{public: 0, private: 1} = Pleroma.Stats.get_status_visibility_count()
+ assert %{"public" => 0, "private" => 1} = Pleroma.Stats.get_status_visibility_count()
end
test "doesn't count unrelated activities" do
@@ -73,8 +74,46 @@ defmodule Pleroma.StatsTest do
CommonAPI.favorite(other_user, activity.id)
CommonAPI.repeat(activity.id, other_user)
- assert %{direct: 0, private: 0, public: 1, unlisted: 0} =
+ assert %{"direct" => 0, "private" => 0, "public" => 1, "unlisted" => 0} =
Pleroma.Stats.get_status_visibility_count()
end
end
+
+ describe "status visibility by instance count" do
+ test "single instance" do
+ local_instance = Pleroma.Web.Endpoint.url() |> String.split("//") |> Enum.at(1)
+ instance2 = "instance2.tld"
+ user1 = insert(:user)
+ user2 = insert(:user, %{ap_id: "https://#{instance2}/@actor"})
+
+ CommonAPI.post(user1, %{"visibility" => "public", "status" => "hey"})
+
+ Enum.each(1..5, fn _ ->
+ CommonAPI.post(user1, %{
+ "visibility" => "unlisted",
+ "status" => "hey"
+ })
+ end)
+
+ Enum.each(1..10, fn _ ->
+ CommonAPI.post(user1, %{
+ "visibility" => "direct",
+ "status" => "hey @#{user2.nickname}"
+ })
+ end)
+
+ Enum.each(1..20, fn _ ->
+ CommonAPI.post(user2, %{
+ "visibility" => "private",
+ "status" => "hey"
+ })
+ end)
+
+ assert %{"direct" => 10, "private" => 0, "public" => 1, "unlisted" => 5} =
+ Pleroma.Stats.get_status_visibility_count(local_instance)
+
+ assert %{"direct" => 0, "private" => 20, "public" => 0, "unlisted" => 0} =
+ Pleroma.Stats.get_status_visibility_count(instance2)
+ end
+ end
end
diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs
index 4697af50e..c3de89ac0 100644
--- a/test/web/admin_api/admin_api_controller_test.exs
+++ b/test/web/admin_api/admin_api_controller_test.exs
@@ -3612,6 +3612,26 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
assert %{"direct" => 0, "private" => 0, "public" => 1, "unlisted" => 2} =
response["status_visibility"]
end
+
+ test "by instance", %{conn: conn} do
+ admin = insert(:user, is_admin: true)
+ user1 = insert(:user)
+ instance2 = "instance2.tld"
+ user2 = insert(:user, %{ap_id: "https://#{instance2}/@actor"})
+
+ CommonAPI.post(user1, %{"visibility" => "public", "status" => "hey"})
+ CommonAPI.post(user2, %{"visibility" => "unlisted", "status" => "hey"})
+ CommonAPI.post(user2, %{"visibility" => "private", "status" => "hey"})
+
+ response =
+ conn
+ |> assign(:user, admin)
+ |> get("/api/pleroma/admin/stats", instance: instance2)
+ |> json_response(200)
+
+ assert %{"direct" => 0, "private" => 1, "public" => 0, "unlisted" => 1} =
+ response["status_visibility"]
+ end
end
describe "POST /api/pleroma/admin/oauth_app" do