Fresh repository history for elektrine/tarakan hosted at https://git.elektrine.com/elektrine/tarakan.
89 lines
2.7 KiB
Elixir
89 lines
2.7 KiB
Elixir
defmodule TarakanWeb.ModerationReportLive.New do
|
|
use TarakanWeb, :live_view
|
|
|
|
alias Tarakan.Moderation
|
|
|
|
@subject_options [
|
|
{"Repository", "repository"},
|
|
{"Account", "account"},
|
|
{"Scan", "scan"},
|
|
{"Finding", "finding"},
|
|
{"Job", "review_task"},
|
|
{"Contribution", "contribution"}
|
|
]
|
|
|
|
@reason_options [
|
|
{"Spam", "spam"},
|
|
{"Unsafe disclosure", "unsafe_disclosure"},
|
|
{"Harassment", "harassment"},
|
|
{"Plagiarism", "plagiarism"},
|
|
{"Malicious instructions", "malicious_instructions"},
|
|
{"Fabricated evidence", "fabricated_evidence"},
|
|
{"Secrets or personal data", "secrets_or_pii"},
|
|
{"Other", "other"}
|
|
]
|
|
|
|
@impl true
|
|
def mount(params, _session, socket) do
|
|
{:ok,
|
|
socket
|
|
|> assign(:page_title, "Report content")
|
|
|> assign(:subject_options, @subject_options)
|
|
|> assign(:reason_options, @reason_options)
|
|
|> assign(:form, report_form(initial_params(params)))}
|
|
end
|
|
|
|
@impl true
|
|
def handle_event("submit", %{"report" => attrs}, socket) do
|
|
case Moderation.report(socket.assigns.current_scope, attrs) do
|
|
{:ok, case_record} ->
|
|
{:noreply,
|
|
socket
|
|
|> put_flash(:info, "Report submitted for restricted moderator review.")
|
|
|> push_navigate(to: ~p"/moderation/cases/#{case_record.id}")}
|
|
|
|
{:error, %Ecto.Changeset{} = changeset} ->
|
|
{:noreply, assign(socket, :form, to_form(changeset, as: :report))}
|
|
|
|
error ->
|
|
{:noreply,
|
|
socket
|
|
|> assign(:form, report_form(attrs))
|
|
|> put_flash(:error, error_message(error))}
|
|
end
|
|
end
|
|
|
|
def handle_event("submit", _params, socket) do
|
|
{:noreply, put_flash(socket, :error, "Complete the report before submitting it.")}
|
|
end
|
|
|
|
defp initial_params(params) do
|
|
%{
|
|
"subject_type" => query_value(params, "subject_type", "repository"),
|
|
"subject_id" => query_value(params, "subject_id", ""),
|
|
"reason" => query_value(params, "reason", "unsafe_disclosure"),
|
|
"description" => ""
|
|
}
|
|
end
|
|
|
|
defp query_value(params, key, default) do
|
|
case Map.get(params, key) do
|
|
value when is_binary(value) -> value
|
|
_other -> default
|
|
end
|
|
end
|
|
|
|
defp report_form(attrs), do: to_form(attrs, as: :report)
|
|
|
|
defp error_message({:error, :rate_limited}),
|
|
do: "You have reached the daily report limit. Try again later."
|
|
|
|
defp error_message({:error, :subject_not_found}),
|
|
do: "That content could not be found or is not visible to your account."
|
|
|
|
defp error_message({:error, :unauthorized}),
|
|
do: "Your account is not authorized to submit this report."
|
|
|
|
defp error_message({:error, :invalid_report}), do: "The report is incomplete."
|
|
defp error_message({:error, _reason}), do: "The report could not be submitted."
|
|
end
|