Allow submitting an array of rule_ids to /api/v1/reports
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
This commit is contained in:
parent
bbf3bc2228
commit
574db5b988
|
@ -19,7 +19,8 @@ defmodule Pleroma.Constants do
|
||||||
"context_id",
|
"context_id",
|
||||||
"deleted_activity_id",
|
"deleted_activity_id",
|
||||||
"pleroma_internal",
|
"pleroma_internal",
|
||||||
"generator"
|
"generator",
|
||||||
|
"rules"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,11 @@ def query do
|
||||||
|> order_by(asc: :priority)
|
|> order_by(asc: :priority)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get(ids) when is_list(ids) do
|
||||||
|
from(r in __MODULE__, where: r.id in ^ids)
|
||||||
|
|> Repo.all()
|
||||||
|
end
|
||||||
|
|
||||||
def get(id), do: Repo.get(__MODULE__, id)
|
def get(id), do: Repo.get(__MODULE__, id)
|
||||||
|
|
||||||
def create(params) do
|
def create(params) do
|
||||||
|
|
|
@ -692,14 +692,18 @@ def make_listen_data(params, additional) do
|
||||||
|
|
||||||
#### Flag-related helpers
|
#### Flag-related helpers
|
||||||
@spec make_flag_data(map(), map()) :: map()
|
@spec make_flag_data(map(), map()) :: map()
|
||||||
def make_flag_data(%{actor: actor, context: context, content: content} = params, additional) do
|
def make_flag_data(
|
||||||
|
%{actor: actor, context: context, content: content} = params,
|
||||||
|
additional
|
||||||
|
) do
|
||||||
%{
|
%{
|
||||||
"type" => "Flag",
|
"type" => "Flag",
|
||||||
"actor" => actor.ap_id,
|
"actor" => actor.ap_id,
|
||||||
"content" => content,
|
"content" => content,
|
||||||
"object" => build_flag_object(params),
|
"object" => build_flag_object(params),
|
||||||
"context" => context,
|
"context" => context,
|
||||||
"state" => "open"
|
"state" => "open",
|
||||||
|
"rules" => Map.get(params, :rules, nil)
|
||||||
}
|
}
|
||||||
|> Map.merge(additional)
|
|> Map.merge(additional)
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,10 +6,12 @@ defmodule Pleroma.Web.AdminAPI.ReportView do
|
||||||
use Pleroma.Web, :view
|
use Pleroma.Web, :view
|
||||||
|
|
||||||
alias Pleroma.HTML
|
alias Pleroma.HTML
|
||||||
|
alias Pleroma.Rule
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.AdminAPI
|
alias Pleroma.Web.AdminAPI
|
||||||
alias Pleroma.Web.AdminAPI.Report
|
alias Pleroma.Web.AdminAPI.Report
|
||||||
alias Pleroma.Web.CommonAPI.Utils
|
alias Pleroma.Web.CommonAPI.Utils
|
||||||
|
alias Pleroma.Web.MastodonAPI.InstanceView
|
||||||
alias Pleroma.Web.MastodonAPI.StatusView
|
alias Pleroma.Web.MastodonAPI.StatusView
|
||||||
|
|
||||||
defdelegate merge_account_views(user), to: AdminAPI.AccountView
|
defdelegate merge_account_views(user), to: AdminAPI.AccountView
|
||||||
|
@ -46,7 +48,8 @@ def render("show.json", %{report: report, user: user, account: account, statuses
|
||||||
as: :activity
|
as: :activity
|
||||||
}),
|
}),
|
||||||
state: report.data["state"],
|
state: report.data["state"],
|
||||||
notes: render(__MODULE__, "index_notes.json", %{notes: report.report_notes})
|
notes: render(__MODULE__, "index_notes.json", %{notes: report.report_notes}),
|
||||||
|
rules: rules(Map.get(report.data, "rules", nil))
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -71,4 +74,14 @@ def render("show_note.json", %{
|
||||||
created_at: Utils.to_masto_date(inserted_at)
|
created_at: Utils.to_masto_date(inserted_at)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp rules(nil) do
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
|
||||||
|
defp rules(rule_ids) do
|
||||||
|
rule_ids
|
||||||
|
|> Rule.get()
|
||||||
|
|> render_many(InstanceView, "rule.json", as: :rule)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -169,6 +169,16 @@ defp report do
|
||||||
inserted_at: %Schema{type: :string, format: :"date-time"}
|
inserted_at: %Schema{type: :string, format: :"date-time"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
rules: %Schema{
|
||||||
|
type: :array,
|
||||||
|
items: %Schema{
|
||||||
|
type: :object,
|
||||||
|
properties: %{
|
||||||
|
id: %Schema{type: :integer},
|
||||||
|
text: %Schema{type: :string}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,6 +53,12 @@ defp create_request do
|
||||||
default: false,
|
default: false,
|
||||||
description:
|
description:
|
||||||
"If the account is remote, should the report be forwarded to the remote admin?"
|
"If the account is remote, should the report be forwarded to the remote admin?"
|
||||||
|
},
|
||||||
|
rule_ids: %Schema{
|
||||||
|
type: :array,
|
||||||
|
nullable: true,
|
||||||
|
items: %Schema{type: :number},
|
||||||
|
description: "Array of rules"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
required: [:account_id],
|
required: [:account_id],
|
||||||
|
@ -60,7 +66,8 @@ defp create_request do
|
||||||
"account_id" => "123",
|
"account_id" => "123",
|
||||||
"status_ids" => ["1337"],
|
"status_ids" => ["1337"],
|
||||||
"comment" => "bad status!",
|
"comment" => "bad status!",
|
||||||
"forward" => "false"
|
"forward" => "false",
|
||||||
|
"rule_ids" => [3]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,6 +7,7 @@ defmodule Pleroma.Web.CommonAPI do
|
||||||
alias Pleroma.Conversation.Participation
|
alias Pleroma.Conversation.Participation
|
||||||
alias Pleroma.Formatter
|
alias Pleroma.Formatter
|
||||||
alias Pleroma.Object
|
alias Pleroma.Object
|
||||||
|
alias Pleroma.Rule
|
||||||
alias Pleroma.ThreadMute
|
alias Pleroma.ThreadMute
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.UserRelationship
|
alias Pleroma.UserRelationship
|
||||||
|
@ -505,14 +506,16 @@ def thread_muted?(_, _), do: false
|
||||||
def report(user, data) do
|
def report(user, data) do
|
||||||
with {:ok, account} <- get_reported_account(data.account_id),
|
with {:ok, account} <- get_reported_account(data.account_id),
|
||||||
{:ok, {content_html, _, _}} <- make_report_content_html(data[:comment]),
|
{:ok, {content_html, _, _}} <- make_report_content_html(data[:comment]),
|
||||||
{:ok, statuses} <- get_report_statuses(account, data) do
|
{:ok, statuses} <- get_report_statuses(account, data),
|
||||||
|
rules <- get_report_rules(Map.get(data, :rule_ids, nil)) do
|
||||||
ActivityPub.flag(%{
|
ActivityPub.flag(%{
|
||||||
context: Utils.generate_context_id(),
|
context: Utils.generate_context_id(),
|
||||||
actor: user,
|
actor: user,
|
||||||
account: account,
|
account: account,
|
||||||
statuses: statuses,
|
statuses: statuses,
|
||||||
content: content_html,
|
content: content_html,
|
||||||
forward: Map.get(data, :forward, false)
|
forward: Map.get(data, :forward, false),
|
||||||
|
rules: rules
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -524,6 +527,16 @@ defp get_reported_account(account_id) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp get_report_rules(nil) do
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
|
defp get_report_rules(rule_ids) do
|
||||||
|
rule_ids
|
||||||
|
|> Rule.get()
|
||||||
|
|> Enum.map(& &1.id)
|
||||||
|
end
|
||||||
|
|
||||||
def update_report_state(activity_ids, state) when is_list(activity_ids) do
|
def update_report_state(activity_ids, state) when is_list(activity_ids) do
|
||||||
case Utils.update_report_state(activity_ids, state) do
|
case Utils.update_report_state(activity_ids, state) do
|
||||||
:ok -> {:ok, activity_ids}
|
:ok -> {:ok, activity_ids}
|
||||||
|
|
|
@ -7,6 +7,7 @@ defmodule Pleroma.Web.AdminAPI.ReportViewTest do
|
||||||
|
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
|
|
||||||
|
alias Pleroma.Rule
|
||||||
alias Pleroma.Web.AdminAPI
|
alias Pleroma.Web.AdminAPI
|
||||||
alias Pleroma.Web.AdminAPI.Report
|
alias Pleroma.Web.AdminAPI.Report
|
||||||
alias Pleroma.Web.AdminAPI.ReportView
|
alias Pleroma.Web.AdminAPI.ReportView
|
||||||
|
@ -38,7 +39,8 @@ test "renders a report" do
|
||||||
statuses: [],
|
statuses: [],
|
||||||
notes: [],
|
notes: [],
|
||||||
state: "open",
|
state: "open",
|
||||||
id: activity.id
|
id: activity.id,
|
||||||
|
rules: []
|
||||||
}
|
}
|
||||||
|
|
||||||
result =
|
result =
|
||||||
|
@ -76,7 +78,8 @@ test "includes reported statuses" do
|
||||||
statuses: [StatusView.render("show.json", %{activity: activity})],
|
statuses: [StatusView.render("show.json", %{activity: activity})],
|
||||||
state: "open",
|
state: "open",
|
||||||
notes: [],
|
notes: [],
|
||||||
id: report_activity.id
|
id: report_activity.id,
|
||||||
|
rules: []
|
||||||
}
|
}
|
||||||
|
|
||||||
result =
|
result =
|
||||||
|
@ -168,4 +171,20 @@ test "reports are ordered newest first" do
|
||||||
assert report2.id == rendered |> Enum.at(0) |> Map.get(:id)
|
assert report2.id == rendered |> Enum.at(0) |> Map.get(:id)
|
||||||
assert report1.id == rendered |> Enum.at(1) |> Map.get(:id)
|
assert report1.id == rendered |> Enum.at(1) |> Map.get(:id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "renders included rules" do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
%{id: id, text: text} = Rule.create(%{text: "Example rule"})
|
||||||
|
|
||||||
|
{:ok, activity} =
|
||||||
|
CommonAPI.report(user, %{
|
||||||
|
account_id: other_user.id,
|
||||||
|
rule_ids: [id]
|
||||||
|
})
|
||||||
|
|
||||||
|
assert %{rules: [%{id: ^id, text: ^text}]} =
|
||||||
|
ReportView.render("show.json", Report.extract_report_info(activity))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
defmodule Pleroma.Web.MastodonAPI.ReportControllerTest do
|
defmodule Pleroma.Web.MastodonAPI.ReportControllerTest do
|
||||||
use Pleroma.Web.ConnCase, async: true
|
use Pleroma.Web.ConnCase, async: true
|
||||||
|
|
||||||
|
alias Pleroma.Activity
|
||||||
|
alias Pleroma.Rule
|
||||||
alias Pleroma.Web.CommonAPI
|
alias Pleroma.Web.CommonAPI
|
||||||
|
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
|
@ -44,6 +46,25 @@ test "submit a report with statuses and comment", %{
|
||||||
|> json_response_and_validate_schema(200)
|
|> json_response_and_validate_schema(200)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "submit a report with rule_ids", %{
|
||||||
|
conn: conn,
|
||||||
|
target_user: target_user
|
||||||
|
} do
|
||||||
|
%{id: rule_id} = Rule.create(%{text: "There are no rules"})
|
||||||
|
|
||||||
|
assert %{"action_taken" => false, "id" => id} =
|
||||||
|
conn
|
||||||
|
|> put_req_header("content-type", "application/json")
|
||||||
|
|> post("/api/v1/reports", %{
|
||||||
|
"account_id" => target_user.id,
|
||||||
|
"forward" => "false",
|
||||||
|
"rule_ids" => [rule_id]
|
||||||
|
})
|
||||||
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
|
assert %Activity{data: %{"rules" => [^rule_id]}} = Activity.get_report(id)
|
||||||
|
end
|
||||||
|
|
||||||
test "account_id is required", %{
|
test "account_id is required", %{
|
||||||
conn: conn,
|
conn: conn,
|
||||||
activity: activity
|
activity: activity
|
||||||
|
|
Loading…
Reference in New Issue