Move construction of S3 base URL with optional namespace and bucket to Upload.base_url/0
[akkoma] / lib / pleroma / upload.ex
index db2cc1dae278009701222528e3bd159a7b7a494e..a52b698bf65a21f98bcb3466ffa43a35e91dcae4 100644 (file)
@@ -31,6 +31,7 @@ defmodule Pleroma.Upload do
 
   """
   alias Ecto.UUID
+  alias Pleroma.Config
   require Logger
 
   @type source ::
@@ -228,4 +229,53 @@ defmodule Pleroma.Upload do
   end
 
   defp url_from_spec(_upload, _base_url, {:url, url}), do: url
+
+  def base_url do
+    uploader = Config.get([Pleroma.Upload, :uploader])
+    upload_base_url = Config.get([Pleroma.Upload, :base_url])
+    public_endpoint = Config.get([uploader, :public_endpoint])
+
+    case uploader do
+      Pleroma.Uploaders.Local ->
+        cond do
+          !is_nil(upload_base_url) ->
+            upload_base_url
+
+          true ->
+            Pleroma.Web.base_url() <> "/media/"
+        end
+
+      Pleroma.Uploaders.S3 ->
+        bucket = Config.get([Pleroma.Uploaders.S3, :bucket])
+
+        bucket_with_namespace =
+          cond do
+            truncated_namespace = Config.get([Pleroma.Uploaders.S3, :truncated_namespace]) ->
+              truncated_namespace
+
+            namespace = Config.get([Pleroma.Uploaders.S3, :bucket_namespace]) ->
+              namespace <> ":" <> bucket
+
+            true ->
+              bucket
+          end
+
+        cond do
+          !is_nil(public_endpoint) ->
+            Path.join([public_endpoint, bucket_with_namespace])
+
+          true ->
+            Path.join([upload_base_url, bucket_with_namespace])
+        end
+
+      _ ->
+        cond do
+          !is_nil(public_endpoint) ->
+            public_endpoint
+
+          true ->
+            upload_base_url
+        end
+    end
+  end
 end