aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma
diff options
context:
space:
mode:
authorfeld <feld@feld.me>2019-12-05 13:34:34 +0000
committerfeld <feld@feld.me>2019-12-05 13:34:34 +0000
commitd0bd4348b34075e1d9ed6905255c85c452e0b4ca (patch)
treecc088ae9f32d5e69b5fd08936e5a855fd52adfe1 /lib/pleroma
parent228bf4d214abe3bb62c52128d3bc145e396b174d (diff)
parentfcabcab4430b0aa075243bf98630d67c79f3ef9b (diff)
downloadpleroma-d0bd4348b34075e1d9ed6905255c85c452e0b4ca.tar.gz
Merge branch 'feature/admin-api-render-whole-status' into 'develop'
Miscellaneous grouped reports fixes Closes admin-fe#48 and admin-fe#51 See merge request pleroma/pleroma!2007
Diffstat (limited to 'lib/pleroma')
-rw-r--r--lib/pleroma/web/activity_pub/utils.ex133
-rw-r--r--lib/pleroma/web/admin_api/admin_api_controller.ex4
-rw-r--r--lib/pleroma/web/admin_api/views/report_view.ex9
3 files changed, 89 insertions, 57 deletions
diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex
index 01aacbde3..2ca805c09 100644
--- a/lib/pleroma/web/activity_pub/utils.ex
+++ b/lib/pleroma/web/activity_pub/utils.ex
@@ -722,16 +722,22 @@ defmodule Pleroma.Web.ActivityPub.Utils do
act when is_binary(act) -> act
end
- activity = Activity.get_by_ap_id_with_object(id)
- actor = User.get_by_ap_id(activity.object.data["actor"])
+ case Activity.get_by_ap_id_with_object(id) do
+ %Activity{} = activity ->
+ %{
+ "type" => "Note",
+ "id" => activity.data["id"],
+ "content" => activity.object.data["content"],
+ "published" => activity.object.data["published"],
+ "actor" =>
+ AccountView.render("show.json", %{
+ user: User.get_by_ap_id(activity.object.data["actor"])
+ })
+ }
- %{
- "type" => "Note",
- "id" => activity.data["id"],
- "content" => activity.object.data["content"],
- "published" => activity.object.data["published"],
- "actor" => AccountView.render("show.json", %{user: actor})
- }
+ _ ->
+ %{"id" => id, "deleted" => true}
+ end
end
defp build_flag_object(_), do: []
@@ -788,63 +794,76 @@ defmodule Pleroma.Web.ActivityPub.Utils do
ActivityPub.fetch_activities([], params, :offset)
end
- @spec get_reports_grouped_by_status(%{required(:activity) => String.t()}) :: %{
- required(:groups) => [
- %{
- required(:date) => String.t(),
- required(:account) => %{},
- required(:status) => %{},
- required(:actors) => [%User{}],
- required(:reports) => [%Activity{}]
- }
- ],
- required(:total) => integer
- }
- def get_reports_grouped_by_status(groups) do
- parsed_groups =
- groups
- |> Enum.map(fn entry ->
- activity =
- case Jason.decode(entry.activity) do
- {:ok, activity} -> activity
- _ -> build_flag_object(entry.activity)
- end
-
- parse_report_group(activity)
- end)
-
- %{
- groups: parsed_groups
- }
- end
-
def parse_report_group(activity) do
reports = get_reports_by_status_id(activity["id"])
max_date = Enum.max_by(reports, &NaiveDateTime.from_iso8601!(&1.data["published"]))
actors = Enum.map(reports, & &1.user_actor)
+ [%{data: %{"object" => [account_id | _]}} | _] = reports
+
+ account =
+ AccountView.render("show.json", %{
+ user: User.get_by_ap_id(account_id)
+ })
+
+ status = get_status_data(activity)
%{
date: max_date.data["published"],
- account: activity["actor"],
- status: %{
- id: activity["id"],
- content: activity["content"],
- published: activity["published"]
- },
+ account: account,
+ status: status,
actors: Enum.uniq(actors),
reports: reports
}
end
+ defp get_status_data(status) do
+ case status["deleted"] do
+ true ->
+ %{
+ "id" => status["id"],
+ "deleted" => true
+ }
+
+ _ ->
+ Activity.get_by_ap_id(status["id"])
+ end
+ end
+
def get_reports_by_status_id(ap_id) do
from(a in Activity,
where: fragment("(?)->>'type' = 'Flag'", a.data),
- where: fragment("(?)->'object' @> ?", a.data, ^[%{id: ap_id}])
+ where: fragment("(?)->'object' @> ?", a.data, ^[%{id: ap_id}]),
+ or_where: fragment("(?)->'object' @> ?", a.data, ^[ap_id])
)
|> Activity.with_preloaded_user_actor()
|> Repo.all()
end
+ @spec get_reports_grouped_by_status([String.t()]) :: %{
+ required(:groups) => [
+ %{
+ required(:date) => String.t(),
+ required(:account) => %{},
+ required(:status) => %{},
+ required(:actors) => [%User{}],
+ required(:reports) => [%Activity{}]
+ }
+ ]
+ }
+ def get_reports_grouped_by_status(activity_ids) do
+ parsed_groups =
+ activity_ids
+ |> Enum.map(fn id ->
+ id
+ |> build_flag_object()
+ |> parse_report_group()
+ end)
+
+ %{
+ groups: parsed_groups
+ }
+ end
+
@spec get_reported_activities() :: [
%{
required(:activity) => String.t(),
@@ -852,17 +871,23 @@ defmodule Pleroma.Web.ActivityPub.Utils do
}
]
def get_reported_activities do
- from(a in Activity,
- where: fragment("(?)->>'type' = 'Flag'", a.data),
+ reported_activities_query =
+ from(a in Activity,
+ where: fragment("(?)->>'type' = 'Flag'", a.data),
+ select: %{
+ activity: fragment("jsonb_array_elements((? #- '{object,0}')->'object')", a.data)
+ },
+ group_by: fragment("activity")
+ )
+
+ from(a in subquery(reported_activities_query),
+ distinct: true,
select: %{
- date: fragment("max(?->>'published') date", a.data),
- activity:
- fragment("jsonb_array_elements_text((? #- '{object,0}')->'object') activity", a.data)
- },
- group_by: fragment("activity"),
- order_by: fragment("date DESC")
+ id: fragment("COALESCE(?->>'id'::text, ? #>> '{}')", a.activity, a.activity)
+ }
)
|> Repo.all()
+ |> Enum.map(& &1.id)
end
def update_report_state(%Activity{} = activity, state)
diff --git a/lib/pleroma/web/admin_api/admin_api_controller.ex b/lib/pleroma/web/admin_api/admin_api_controller.ex
index 24fdc3c82..b003d1f35 100644
--- a/lib/pleroma/web/admin_api/admin_api_controller.ex
+++ b/lib/pleroma/web/admin_api/admin_api_controller.ex
@@ -647,11 +647,11 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
end
def list_grouped_reports(conn, _params) do
- reports = Utils.get_reported_activities()
+ statuses = Utils.get_reported_activities()
conn
|> put_view(ReportView)
- |> render("index_grouped.json", Utils.get_reports_grouped_by_status(reports))
+ |> render("index_grouped.json", Utils.get_reports_grouped_by_status(statuses))
end
def report_show(conn, %{"id" => id}) do
diff --git a/lib/pleroma/web/admin_api/views/report_view.ex b/lib/pleroma/web/admin_api/views/report_view.ex
index ca88595c7..13602efd9 100644
--- a/lib/pleroma/web/admin_api/views/report_view.ex
+++ b/lib/pleroma/web/admin_api/views/report_view.ex
@@ -4,6 +4,7 @@
defmodule Pleroma.Web.AdminAPI.ReportView do
use Pleroma.Web, :view
+ alias Pleroma.Activity
alias Pleroma.HTML
alias Pleroma.User
alias Pleroma.Web.AdminAPI.Report
@@ -45,10 +46,16 @@ defmodule Pleroma.Web.AdminAPI.ReportView do
def render("index_grouped.json", %{groups: groups}) do
reports =
Enum.map(groups, fn group ->
+ status =
+ case group.status do
+ %Activity{} = activity -> StatusView.render("show.json", %{activity: activity})
+ _ -> group.status
+ end
+
%{
date: group[:date],
account: group[:account],
- status: group[:status],
+ status: Map.put_new(status, "deleted", false),
actors: Enum.map(group[:actors], &merge_account_views/1),
reports:
group[:reports]