Delete files when updating parent identities

Closes #127

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2019-06-05 18:29:39 +02:00
parent 10dbe14a52
commit e8cabd38d4
10 changed files with 263 additions and 25 deletions

View File

@@ -88,6 +88,16 @@ defmodule MobilizonWeb.Upload do
end
end
def remove(url, opts \\ []) do
with opts <- get_opts(opts),
%URI{path: "/media/" <> path, host: host} <- URI.parse(url),
true <- host == MobilizonWeb.Endpoint.host() do
MobilizonWeb.Uploaders.Uploader.remove_file(opts.uploader, path)
else
%URI{} = _uri -> {:error, "URL doesn't match pattern"}
end
end
def char_unescaped?(char) do
URI.char_unreserved?(char) or char == ?/
end

View File

@@ -14,18 +14,8 @@ defmodule MobilizonWeb.Uploaders.Local do
end
def put_file(upload) do
{local_path, file} =
case Enum.reverse(String.split(upload.path, "/", trim: true)) do
[file] ->
{upload_path(), file}
[file | folders] ->
path = Path.join([upload_path()] ++ Enum.reverse(folders))
File.mkdir_p!(path)
{path, file}
end
result_file = Path.join(local_path, file)
{path, file} = local_path(upload.path)
result_file = Path.join(path, file)
unless File.exists?(result_file) do
File.cp!(upload.tempfile, result_file)
@@ -34,6 +24,40 @@ defmodule MobilizonWeb.Uploaders.Local do
:ok
end
def remove_file(path) do
with {path, file} <- local_path(path),
full_path <- Path.join(path, file),
true <- File.exists?(full_path),
:ok <- File.rm(full_path),
:ok <- remove_folder(path) do
{:ok, path}
else
false -> {:error, "File #{path} doesn't exist"}
end
end
defp remove_folder(path) do
with {:subfolder, true} <- {:subfolder, path != upload_path()},
{:empty_folder, {:ok, [] = _files}} <- {:empty_folder, File.ls(path)} do
File.rmdir(path)
else
{:subfolder, _} -> :ok
{:empty_folder, _} -> {:error, "Error: Folder is not empty"}
end
end
defp local_path(path) do
case Enum.reverse(String.split(path, "/", trim: true)) do
[file] ->
{upload_path(), file}
[file | folders] ->
path = Path.join([upload_path()] ++ Enum.reverse(folders))
File.mkdir_p!(path)
{path, file}
end
end
def upload_path do
Mobilizon.CommonConfig.get!([__MODULE__, :uploads])
end

View File

@@ -35,6 +35,8 @@ defmodule MobilizonWeb.Uploaders.Uploader do
@callback put_file(MobilizonWeb.Upload.t()) ::
:ok | {:ok, file_spec()} | {:error, String.t()} | :wait_callback
@callback remove_file(file_spec()) :: :ok | {:ok, file_spec()} | {:error, String.t()}
@callback http_callback(Plug.Conn.t(), Map.t()) ::
{:ok, Plug.Conn.t()}
| {:ok, Plug.Conn.t(), file_spec()}
@@ -42,7 +44,6 @@ defmodule MobilizonWeb.Uploaders.Uploader do
@optional_callbacks http_callback: 2
@spec put_file(module(), MobilizonWeb.Upload.t()) :: {:ok, file_spec()} | {:error, String.t()}
def put_file(uploader, upload) do
case uploader.put_file(upload) do
:ok -> {:ok, {:file, upload.path}}
@@ -52,6 +53,10 @@ defmodule MobilizonWeb.Uploaders.Uploader do
end
end
def remove_file(uploader, path) do
uploader.remove_file(path)
end
defp handle_callback(uploader, upload) do
:global.register_name({__MODULE__, upload.path}, self())