Implement report notes destruction
authorMaxim Filippov <colixer@gmail.com>
Sun, 8 Dec 2019 08:27:23 +0000 (11:27 +0300)
committerMaxim Filippov <colixer@gmail.com>
Sun, 8 Dec 2019 08:27:23 +0000 (11:27 +0300)
lib/pleroma/moderation_log.ex
lib/pleroma/report_note.ex
lib/pleroma/web/admin_api/admin_api_controller.ex
lib/pleroma/web/admin_api/views/report_view.ex
lib/pleroma/web/router.ex
test/moderation_log_test.exs
test/web/admin_api/admin_api_controller_test.exs

index 706f089dc044f02c07d10ac2b621db30629bbf81..c81477f481e1737b260f04435f5415599ae0695b 100644 (file)
@@ -128,17 +128,35 @@ defmodule Pleroma.ModerationLog do
           {:ok, ModerationLog} | {:error, any}
   def insert_log(%{
         actor: %User{} = actor,
-        action: "report_response",
+        action: "report_note",
         subject: %Activity{} = subject,
         text: text
       }) do
     %ModerationLog{
       data: %{
         "actor" => user_to_map(actor),
-        "action" => "report_response",
+        "action" => "report_note",
         "subject" => report_to_map(subject),
-        "text" => text,
-        "message" => ""
+        "text" => text
+      }
+    }
+    |> insert_log_entry_with_message()
+  end
+
+  @spec insert_log(%{actor: User, subject: Activity, action: String.t(), text: String.t()}) ::
+          {:ok, ModerationLog} | {:error, any}
+  def insert_log(%{
+        actor: %User{} = actor,
+        action: "report_note_delete",
+        subject: %Activity{} = subject,
+        text: text
+      }) do
+    %ModerationLog{
+      data: %{
+        "actor" => user_to_map(actor),
+        "action" => "report_note_delete",
+        "subject" => report_to_map(subject),
+        "text" => text
       }
     }
     |> insert_log_entry_with_message()
@@ -556,12 +574,24 @@ defmodule Pleroma.ModerationLog do
   def get_log_entry_message(%ModerationLog{
         data: %{
           "actor" => %{"nickname" => actor_nickname},
-          "action" => "report_response",
+          "action" => "report_note",
+          "subject" => %{"id" => subject_id, "type" => "report"},
+          "text" => text
+        }
+      }) do
+    "@#{actor_nickname} added note '#{text}' to report ##{subject_id}"
+  end
+
+  @spec get_log_entry_message(ModerationLog) :: String.t()
+  def get_log_entry_message(%ModerationLog{
+        data: %{
+          "actor" => %{"nickname" => actor_nickname},
+          "action" => "report_note_delete",
           "subject" => %{"id" => subject_id, "type" => "report"},
           "text" => text
         }
       }) do
-    "@#{actor_nickname} responded with '#{text}' to report ##{subject_id}"
+    "@#{actor_nickname} deleted note '#{text}' from report ##{subject_id}"
   end
 
   @spec get_log_entry_message(ModerationLog) :: String.t()
index 91102696be05c77588dd5878e78017908c9c7240..0db86d1a1744702af06a69b2c30765064276fdb9 100644 (file)
@@ -38,9 +38,11 @@ defmodule Pleroma.ReportNote do
     |> Repo.insert()
   end
 
-  def get_all_for_status(status_id) do
-    ReportNote
-    |> where(activity_id: ^status_id)
-    |> Repo.all()
+  @spec destroy(FlakeId.Ecto.CompatType.t()) ::
+          {:ok, ReportNote.t()} | {:error, Changeset.t()}
+  def destroy(id) do
+    from(r in ReportNote, where: r.id == ^id)
+    |> Repo.one()
+    |> Repo.delete()
   end
 end
index ee32bac45c2e938493d9919b7a59f79aa1eadebc..d34952cda5d17b9c15f7c4e1095d02d6bc7b380a 100644 (file)
@@ -691,14 +691,14 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
   end
 
   def report_notes_create(%{assigns: %{user: user}} = conn, %{
-        "id" => status_id,
+        "id" => report_id,
         "content" => content
       }) do
-    with {:ok, _} <- ReportNote.create(user.id, status_id, content) do
+    with {:ok, _} <- ReportNote.create(user.id, report_id, content) do
       ModerationLog.insert_log(%{
-        action: "report_response",
+        action: "report_note",
         actor: user,
-        subject: Activity.get_by_id(status_id),
+        subject: Activity.get_by_id(report_id),
         text: content
       })
 
@@ -708,6 +708,24 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
     end
   end
 
+  def report_notes_delete(%{assigns: %{user: user}} = conn, %{
+        "id" => note_id,
+        "report_id" => report_id
+      }) do
+    with {:ok, note} <- ReportNote.destroy(note_id) do
+      ModerationLog.insert_log(%{
+        action: "report_note_delete",
+        actor: user,
+        subject: Activity.get_by_id(report_id),
+        text: note.content
+      })
+
+      json_response(conn, :no_content, "")
+    else
+      _ -> json_response(conn, :bad_request, "")
+    end
+  end
+
   def status_update(%{assigns: %{user: admin}} = conn, %{"id" => id} = params) do
     with {:ok, activity} <- CommonAPI.update_activity_scope(id, params) do
       {:ok, sensitive} = Ecto.Type.cast(:boolean, params["sensitive"])
index f5c6ba40146851b73a82f2757c185e61e84162d0..294861044f1942cb8d722c0d44b7edea062b977f 100644 (file)
@@ -69,13 +69,19 @@ defmodule Pleroma.Web.AdminAPI.ReportView do
 
   def render("index_notes.json", _), do: []
 
-  def render("show_note.json", %{content: content, user_id: user_id, inserted_at: inserted_at}) do
+  def render("show_note.json", %{
+        id: id,
+        content: content,
+        user_id: user_id,
+        inserted_at: inserted_at
+      }) do
     user = User.get_by_id(user_id)
 
     %{
+      id: id,
       content: content,
       user: merge_account_views(user),
-      created_at: inserted_at
+      created_at: Utils.to_masto_date(inserted_at)
     }
   end
 
index af220a98b8b072dbf93bc025d00c9ae597558c9a..3baaa73d9dc8e7237009741b920b1d77d089eef3 100644 (file)
@@ -188,6 +188,7 @@ defmodule Pleroma.Web.Router do
     get("/reports/:id", AdminAPIController, :report_show)
     patch("/reports", AdminAPIController, :reports_update)
     post("/reports/:id/notes", AdminAPIController, :report_notes_create)
+    delete("/reports/:report_id/notes/:id", AdminAPIController, :report_notes_delete)
 
     put("/statuses/:id", AdminAPIController, :status_update)
     delete("/statuses/:id", AdminAPIController, :status_delete)
index 4240f6a654b55b8eef529269b1757cb24867c202..e162df93b69a1f41b106f274088e05c83a36abd2 100644 (file)
@@ -214,7 +214,7 @@ defmodule Pleroma.ModerationLogTest do
       {:ok, _} =
         ModerationLog.insert_log(%{
           actor: moderator,
-          action: "report_response",
+          action: "report_note",
           subject: report,
           text: "look at this"
         })
index 2a3e49af8a82c90066a5e11e46c8a7139db09025..fda47300cc6a257c2a6d1ca7b43e76bd85d1db8f 100644 (file)
@@ -10,6 +10,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
   alias Pleroma.HTML
   alias Pleroma.ModerationLog
   alias Pleroma.Repo
+  alias Pleroma.ReportNote
   alias Pleroma.Tests.ObanHelpers
   alias Pleroma.User
   alias Pleroma.UserInviteToken
@@ -2940,7 +2941,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
     end
 
     test "it creates report note", %{admin_id: admin_id, report_id: report_id} do
-      [note, _] = Repo.all(Pleroma.ReportNote)
+      [note, _] = Repo.all(ReportNote)
 
       assert %{
                activity_id: ^report_id,
@@ -2964,6 +2965,18 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
       assert note["created_at"]
       assert response["total"] == 1
     end
+
+    test "it deletes the note", %{admin: admin, report_id: report_id} do
+      assert ReportNote |> Repo.all() |> length() == 2
+
+      [note, _] = Repo.all(ReportNote)
+
+      build_conn()
+      |> assign(:user, admin)
+      |> delete("/api/pleroma/admin/reports/#{report_id}/notes/#{note.id}")
+
+      assert ReportNote |> Repo.all() |> length() == 1
+    end
   end
 end