Move building of url to modules

We got a path and there's a "base_url" function. With that the url was
build. But not all url's are nessecarely build like this. Building the
url should be the responsability of the Uploader itself, so it's now
moved to there.
This commit is contained in:
ilja 2023-03-27 09:25:44 +02:00
parent 2edb0944ba
commit 9d8ab46cd6
7 changed files with 28 additions and 24 deletions

View file

@ -63,7 +63,7 @@ defmodule Pleroma.Upload do
blurhash: String.t(),
path: String.t()
}
defstruct [:id, :name, :tempfile, :content_type, :width, :height, :blurhash, :path]
defstruct [:id, :name, :tempfile, :content_type, :width, :height, :blurhash, :path, :url]
defp get_description(opts, upload) do
case {opts[:description], Config.get([Pleroma.Upload, :default_description])} do
@ -97,7 +97,7 @@ def store(upload, opts \\ []) do
%{
"type" => "Link",
"mediaType" => upload.content_type,
"href" => get_url(upload.name, upload.path)
"href" => url_with_query_params(upload)
}
|> Maps.put_if_present("width", upload.width)
|> Maps.put_if_present("height", upload.height)
@ -212,19 +212,13 @@ defp tempfile_for_image(data) do
tmp_path
end
defp get_url(name, path) do
base_url = base_url()
path =
URI.encode(path, &char_unescaped?/1) <>
if Config.get([__MODULE__, :link_name], false) do
"?name=#{URI.encode(name, &char_unescaped?/1)}"
else
""
end
[base_url, path]
|> Path.join()
defp url_with_query_params(%__MODULE__{url: url, name: name}) do
url <>
if Config.get([__MODULE__, :link_name], false) do
"?name=#{URI.encode(name, &char_unescaped?/1)}"
else
""
end
end
def base_url(), do: Config.get([__MODULE__, :uploader]).base_url()

View file

@ -30,7 +30,9 @@ def put_file(upload) do
File.cp!(upload.tempfile, result_file)
end
{:ok, upload}
url = [base_url(), URI.encode(upload.path, &Pleroma.Upload.char_unescaped?/1)] |> Path.join()
{:ok, upload |> Map.put(:url, url)}
end
def upload_path do

View file

@ -47,7 +47,8 @@ def put_file(%Pleroma.Upload{} = upload) do
case ExAws.request(op) do
{:ok, _} ->
{:ok, Map.put(upload, :path, s3_name)}
{:ok,
upload |> Map.put(:path, s3_name) |> Map.put(:url, Path.join([base_url(), s3_name]))}
error ->
Logger.error("#{__MODULE__}: #{inspect(error)}")

View file

@ -35,18 +35,18 @@ defmodule Pleroma.Uploaders.Uploader do
"""
@callback put_file(upload :: struct()) ::
:ok | {:ok, Pleroma.Upload} | {:error, String.t()} | :wait_callback
:ok | {:ok, Pleroma.Upload.t()} | {:error, String.t()} | :wait_callback
@callback delete_file(file :: String.t()) :: :ok | {:error, String.t()}
@callback base_url() :: String.t()
@callback http_callback(Plug.Conn.t(), Map.t(), Pleroma.Upload) ::
{:ok, Plug.Conn.t(), Pleroma.Upload}
@callback http_callback(Plug.Conn.t(), Map.t(), Pleroma.Upload.t()) ::
{:ok, Plug.Conn.t(), Pleroma.Upload.t()}
| {:error, Plug.Conn.t(), String.t()}
@optional_callbacks http_callback: 3
@spec put_file(module(), upload :: struct()) :: {:ok, Pleroma.Upload} | {:error, String.t()}
@spec put_file(module(), upload :: struct()) :: {:ok, Pleroma.Upload.t()} | {:error, String.t()}
def put_file(uploader, upload) do
case uploader.put_file(upload) do
{:ok, %Pleroma.Upload{}} = ok -> ok

View file

@ -38,7 +38,12 @@ def put_file(%{path: path} = _upload, module_name) do
describe "Tried storing a file when http callback response success result" do
defmodule TestUploaderSuccess do
def http_callback(conn, _params, upload),
do: {:ok, conn, Map.put(upload, :path, "post-process-file.jpg")}
do:
{:ok, conn,
Map.merge(upload, %{
path: "post-process-file.jpg",
url: "http://localhost:4001/media/post-process-file.jpg"
})}
def put_file(upload), do: TestUploaderBase.put_file(upload, __MODULE__)

View file

@ -21,7 +21,8 @@ test "put file to local folder" do
name: "image.jpg",
content_type: "image/jpeg",
path: file_path,
tempfile: Path.absname("test/fixtures/image_tmp.jpg")
tempfile: Path.absname("test/fixtures/image_tmp.jpg"),
url: "http://localhost:4001/media/local_upload/files/image.jpg"
}
assert Local.put_file(file) == {:ok, file}

View file

@ -59,7 +59,8 @@ test "it returns path with bucket namespace when namespace is set" do
name: "image-tet.jpg",
content_type: "image/jpeg",
path: "test_folder/image-tet.jpg",
tempfile: Path.absname("test/instance_static/add/shortcode.png")
tempfile: Path.absname("test/instance_static/add/shortcode.png"),
url: "https://s3.amazonaws.com/test_bucket/test_folder/image-tet.jpg"
}
[file_upload: file_upload]