Added new deletion options to controller and UI

This commit is contained in:
Kieran Eglin 2024-04-02 14:38:24 -07:00
parent 2993c33e36
commit 6e0bdee5b6
No known key found for this signature in database
GPG key ID: 193984967FCF432D
3 changed files with 32 additions and 38 deletions

View file

@ -17,19 +17,12 @@ defmodule PinchflatWeb.MediaItems.MediaItemController do
end end
def delete(conn, %{"id" => id} = params) do def delete(conn, %{"id" => id} = params) do
delete_files = Map.get(params, "delete_files", false) prevent_download = Map.get(params, "prevent_download", false)
media_item = Media.get_media_item!(id) media_item = Media.get_media_item!(id)
{:ok, _} = Media.delete_media_item(media_item, delete_files: delete_files) {:ok, _} = Media.delete_media_files(media_item, prevent_download: prevent_download)
flash_message =
if delete_files do
"Record and files deleted successfully."
else
"Record deleted successfully. Files were not deleted."
end
conn conn
|> put_flash(:info, flash_message) |> put_flash(:info, "Files deleted successfully.")
|> redirect(to: ~p"/sources/#{media_item.source_id}") |> redirect(to: ~p"/sources/#{media_item.source_id}")
end end

View file

@ -4,7 +4,7 @@
<.icon name="hero-arrow-left" class="w-10 h-10 hover:dark:text-white" /> <.icon name="hero-arrow-left" class="w-10 h-10 hover:dark:text-white" />
</.link> </.link>
<h2 class="text-title-md2 font-bold text-black dark:text-white ml-4"> <h2 class="text-title-md2 font-bold text-black dark:text-white ml-4">
Media Item #<%= @media_item.id %> <%= StringUtils.truncate(@media_item.title, 35) %>
</h2> </h2>
</div> </div>
</div> </div>
@ -15,13 +15,22 @@
<.button_dropdown text="Actions" class="justify-center w-full sm:w-50"> <.button_dropdown text="Actions" class="justify-center w-full sm:w-50">
<:option> <:option>
<.link <.link
href={~p"/sources/#{@media_item.source_id}/media/#{@media_item}?delete_files=true"} href={~p"/sources/#{@media_item.source_id}/media/#{@media_item}"}
method="delete" method="delete"
data-confirm="Are you sure you want to delete this record and all associated files on disk? This cannot be undone." data-confirm="Are you sure you want to delete all files for this media item? This cannot be undone."
> >
Delete Files Delete Files
</.link> </.link>
</:option> </:option>
<:option>
<.link
href={~p"/sources/#{@media_item.source_id}/media/#{@media_item}?prevent_download=true"}
method="delete"
data-confirm="Are you sure you want to delete all files for this media item and prevent it from re-downloading in the future? This cannot be undone."
>
Delete and Ignore
</.link>
</:option>
</.button_dropdown> </.button_dropdown>
</:tab_append> </:tab_append>
@ -32,6 +41,7 @@
<.media_preview media_item={@media_item} /> <.media_preview media_item={@media_item} />
<% end %> <% end %>
<h2 class="font-bold text-2xl"><%= @media_item.title %></h2>
<h3 class="font-bold text-xl">Attributes</h3> <h3 class="font-bold text-xl">Attributes</h3>
<section> <section>
<strong>Source:</strong> <strong>Source:</strong>

View file

@ -10,27 +10,28 @@ defmodule PinchflatWeb.MediaItemControllerTest do
test "renders the page", %{conn: conn, media_item: media_item} do test "renders the page", %{conn: conn, media_item: media_item} do
conn = get(conn, ~p"/sources/#{media_item.source_id}/media/#{media_item}") conn = get(conn, ~p"/sources/#{media_item.source_id}/media/#{media_item}")
assert html_response(conn, 200) =~ "Media Item ##{media_item.id}"
assert html_response(conn, 200) =~ "#{media_item.title}"
end end
end end
describe "delete media when just deleting the records" do describe "delete media" do
setup do setup do
media_item = media_item_with_attachments() media_item = media_item_with_attachments()
%{media_item: media_item} %{media_item: media_item}
end end
test "the media item is deleted", %{conn: conn, media_item: media_item} do test "the media item not is deleted", %{conn: conn, media_item: media_item} do
delete(conn, ~p"/sources/#{media_item.source_id}/media/#{media_item.id}") delete(conn, ~p"/sources/#{media_item.source_id}/media/#{media_item.id}")
assert_raise Ecto.NoResultsError, fn -> Repo.reload!(media_item) end assert Repo.reload!(media_item)
end end
test "the files are not deleted", %{conn: conn, media_item: media_item} do test "the files are deleted", %{conn: conn, media_item: media_item} do
delete(conn, ~p"/sources/#{media_item.source_id}/media/#{media_item.id}") delete(conn, ~p"/sources/#{media_item.source_id}/media/#{media_item.id}")
assert File.exists?(media_item.media_filepath) refute File.exists?(media_item.media_filepath)
end end
test "redirects to the source page", %{conn: conn, media_item: media_item} do test "redirects to the source page", %{conn: conn, media_item: media_item} do
@ -38,31 +39,21 @@ defmodule PinchflatWeb.MediaItemControllerTest do
assert redirected_to(conn) == ~p"/sources/#{media_item.source_id}" assert redirected_to(conn) == ~p"/sources/#{media_item.source_id}"
end end
end
describe "delete media when deleting the records and files" do test "doesn't prevent re-download by default", %{conn: conn, media_item: media_item} do
setup do delete(conn, ~p"/sources/#{media_item.source_id}/media/#{media_item.id}")
media_item = media_item_with_attachments()
%{media_item: media_item} media_item = Repo.reload(media_item)
refute media_item.prevent_download
end end
test "the media item is deleted", %{conn: conn, media_item: media_item} do test "can optionally prevent re-download", %{conn: conn, media_item: media_item} do
delete(conn, ~p"/sources/#{media_item.source_id}/media/#{media_item.id}?delete_files=true") delete(conn, ~p"/sources/#{media_item.source_id}/media/#{media_item.id}?prevent_download=true")
assert_raise Ecto.NoResultsError, fn -> Repo.reload!(media_item) end media_item = Repo.reload(media_item)
end
test "the files are deleted", %{conn: conn, media_item: media_item} do assert media_item.prevent_download
delete(conn, ~p"/sources/#{media_item.source_id}/media/#{media_item.id}?delete_files=true")
refute File.exists?(media_item.media_filepath)
end
test "redirects to the source page", %{conn: conn, media_item: media_item} do
conn = delete(conn, ~p"/sources/#{media_item.source_id}/media/#{media_item.id}?delete_files=true")
assert redirected_to(conn) == ~p"/sources/#{media_item.source_id}"
end end
end end