From dda1bfac1578ca3cd93b2d86dada3a36bf057fff Mon Sep 17 00:00:00 2001 From: ddink Date: Mon, 7 Oct 2024 12:29:53 -0500 Subject: [PATCH] add customizable asset delete callbacks --- lib/beacon/config.ex | 4 ++++ lib/beacon/lifecycle/asset.ex | 16 ++++++++++++++++ lib/beacon/media_library.ex | 8 ++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/beacon/config.ex b/lib/beacon/config.ex index 2ee7fb70..05fd3bdd 100644 --- a/lib/beacon/config.ex +++ b/lib/beacon/config.ex @@ -152,6 +152,10 @@ defmodule Beacon.Config do [ {identifier :: atom(), fun :: (Ecto.Schema.t(), Beacon.MediaLibrary.UploadMetadata.t() -> {:cont, any()} | {:halt, Exception.t()})} ]} + | {:soft_delete_asset, + [ + {identifier :: atom(), fun :: (Ecto.Schema.t() -> {:cont, any()} | {:halt, Exception.t()})} + ]} @typedoc """ Add extra fields to pages. diff --git a/lib/beacon/lifecycle/asset.ex b/lib/beacon/lifecycle/asset.ex index 63560643..c1207108 100644 --- a/lib/beacon/lifecycle/asset.ex +++ b/lib/beacon/lifecycle/asset.ex @@ -48,4 +48,20 @@ defmodule Beacon.Lifecycle.Asset do end def variant_480w(asset, _metadata), do: {:cont, asset} + + def delete_uploaded_asset(%MediaLibrary.Asset{site: site, media_type: media_type} = asset) do + config = + site + |> Beacon.Config.fetch!() + |> Beacon.Config.config_for_media_type(media_type) + |> Enum.into(%{}) + + if Map.get(config, :delete_asset_callbacks) do + Enum.reduce(config.delete_asset_callbacks, asset, fn + callback, asset -> callback.(asset) + end) + end + + {:cont, asset} + end end diff --git a/lib/beacon/media_library.ex b/lib/beacon/media_library.ex index d3e2c42e..f1a6c59b 100644 --- a/lib/beacon/media_library.ex +++ b/lib/beacon/media_library.ex @@ -343,8 +343,12 @@ defmodule Beacon.MediaLibrary do ) case update do - {1, _} -> {:ok, repo(asset).reload(asset)} - _ -> :error + {1, _} -> + Lifecycle.Asset.delete_uploaded_asset(asset) + {:ok, repo(asset).reload(asset)} + + _ -> + :error end end end