in dev, allow dev FE
[akkoma] / lib / pleroma / workers / attachments_cleanup_worker.ex
index 4ad19c0fc8763ba234e9e4c433718236948bff0c..f5090dae737b2131d8318ce23e0a58718fe13704 100644 (file)
@@ -1,5 +1,5 @@
 # Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Workers.AttachmentsCleanupWorker do
@@ -11,54 +11,38 @@ defmodule Pleroma.Workers.AttachmentsCleanupWorker do
   use Pleroma.Workers.WorkerHelper, queue: "attachments_cleanup"
 
   @impl Oban.Worker
-  def perform(
-        %{
+  def perform(%Job{
+        args: %{
           "op" => "cleanup_attachments",
           "object" => %{"data" => %{"attachment" => [_ | _] = attachments, "actor" => actor}}
-        },
-        _job
-      ) do
-    hrefs =
-      Enum.flat_map(attachments, fn attachment ->
-        Enum.map(attachment["url"], & &1["href"])
-      end)
-
-    # find all objects for copies of the attachments, name and actor doesn't matter here
-    hrefs
-    |> fetch_objects
-    |> prepare_objects(actor, Enum.map(attachments, & &1["name"]))
-    |> Enum.reduce({[], []}, fn {href, %{id: id, count: count}}, {ids, hrefs} ->
-      with 1 <- count do
-        {ids ++ [id], hrefs ++ [href]}
-      else
-        _ -> {ids ++ [id], hrefs}
-      end
-    end)
-    |> do_clean
+        }
+      }) do
+    if Pleroma.Config.get([:instance, :cleanup_attachments], false) do
+      attachments
+      |> Enum.flat_map(fn item -> Enum.map(item["url"], & &1["href"]) end)
+      |> fetch_objects
+      |> prepare_objects(actor, Enum.map(attachments, & &1["name"]))
+      |> filter_objects
+      |> do_clean
+    end
 
     {:ok, :success}
   end
 
-  def perform(%{"op" => "cleanup_attachments", "object" => _object}, _job), do: {:ok, :skip}
+  def perform(%Job{args: %{"op" => "cleanup_attachments", "object" => _object}}), do: {:ok, :skip}
 
   defp do_clean({object_ids, attachment_urls}) do
     uploader = Pleroma.Config.get([Pleroma.Upload, :uploader])
 
-    prefix =
-      case Pleroma.Config.get([Pleroma.Upload, :base_url]) do
-        nil -> "media"
-        _ -> ""
-      end
-
     base_url =
       String.trim_trailing(
-        Pleroma.Config.get([Pleroma.Upload, :base_url], Pleroma.Web.base_url()),
+        Pleroma.Upload.base_url(),
         "/"
       )
 
     Enum.each(attachment_urls, fn href ->
       href
-      |> String.trim_leading("#{base_url}/#{prefix}")
+      |> String.trim_leading("#{base_url}")
       |> uploader.delete_file()
     end)
 
@@ -73,7 +57,17 @@ defmodule Pleroma.Workers.AttachmentsCleanupWorker do
 
   # we should delete 1 object for any given attachment, but don't delete
   # files if there are more than 1 object for it
-  def prepare_objects(objects, actor, names) do
+  defp filter_objects(objects) do
+    Enum.reduce(objects, {[], []}, fn {href, %{id: id, count: count}}, {ids, hrefs} ->
+      with 1 <- count do
+        {ids ++ [id], hrefs ++ [href]}
+      else
+        _ -> {ids ++ [id], hrefs}
+      end
+    end)
+  end
+
+  defp prepare_objects(objects, actor, names) do
     objects
     |> Enum.reduce(%{}, fn %{
                              id: id,
@@ -98,7 +92,7 @@ defmodule Pleroma.Workers.AttachmentsCleanupWorker do
     end)
   end
 
-  def fetch_objects(hrefs) do
+  defp fetch_objects(hrefs) do
     from(o in Object,
       where:
         fragment(