diff --git a/lib/music_library/assets/cache.ex b/lib/music_library/assets/cache.ex index 0bb815b5..aff33c7c 100644 --- a/lib/music_library/assets/cache.ex +++ b/lib/music_library/assets/cache.ex @@ -27,8 +27,10 @@ defmodule MusicLibrary.Assets.Cache do ) end + @one_week_seconds 60 * 60 * 24 * 7 + @spec prune(non_neg_integer()) :: non_neg_integer() - def prune(older_than_seconds) do + def prune(older_than_seconds \\ @one_week_seconds) do threshold = DateTime.utc_now() |> DateTime.add(older_than_seconds * -1, :second) diff --git a/lib/music_library/worker/prune_asset_cache.ex b/lib/music_library/worker/prune_asset_cache.ex index f7aa266a..e5a4e3a7 100644 --- a/lib/music_library/worker/prune_asset_cache.ex +++ b/lib/music_library/worker/prune_asset_cache.ex @@ -5,11 +5,9 @@ defmodule MusicLibrary.Worker.PruneAssetCache do alias MusicLibrary.Assets.Cache - @one_week_seconds 60 * 60 * 24 * 7 - @impl Oban.Worker def perform(_) do - prune_count = Cache.prune(@one_week_seconds) + prune_count = Cache.prune() Logger.info(fn -> "Pruned #{prune_count} old cached assets. Cache size now #{Cache.total_content_size()} bytes." diff --git a/lib/music_library_web/live/maintenance_live/index.ex b/lib/music_library_web/live/maintenance_live/index.ex index a85480f1..c8f36e20 100644 --- a/lib/music_library_web/live/maintenance_live/index.ex +++ b/lib/music_library_web/live/maintenance_live/index.ex @@ -4,8 +4,11 @@ defmodule MusicLibraryWeb.MaintenanceLive.Index do require Logger alias MusicLibrary.Artists + alias MusicLibrary.Assets.Cache alias MusicLibrary.Maintenance alias MusicLibrary.Records + alias MusicLibrary.RecordsOnThisDayEmail + alias MusicLibrary.Worker.PruneAssets alias MusicLibraryWeb.ErrorMessages @poll_interval 2_000 @@ -153,6 +156,56 @@ defmodule MusicLibraryWeb.MaintenanceLive.Index do +

+ {gettext("Assets")} +

+

+ {gettext("Manage cached and stored assets.")} +

+ +

+ {gettext("Emails")} +

+

+ {gettext("Manually trigger email notifications.")} +

+ """ @@ -257,6 +310,43 @@ defmodule MusicLibraryWeb.MaintenanceLive.Index do |> put_toast(:info, gettext("Operation started in the background."))} end + def handle_event("prune_asset_cache", _params, socket) do + prune_count = Cache.prune() + + {:noreply, + put_toast(socket, :info, gettext("Pruned %{count} cached assets.", count: prune_count))} + end + + def handle_event("prune_assets", _params, socket) do + %{} |> PruneAssets.new() |> Oban.insert() + + {:noreply, put_toast(socket, :info, gettext("Asset pruning started in the background."))} + end + + def handle_event("send_records_on_this_day_email", _params, socket) do + today = DateTime.now!(MusicLibrary.default_timezone()) |> DateTime.to_date() + + socket = + case RecordsOnThisDayEmail.send(today) do + {:ok, :sent} -> + put_toast(socket, :info, gettext("Email sent successfully.")) + + {:ok, :no_records} -> + put_toast(socket, :info, gettext("No records on this day.")) + + {:error, reason} -> + Logger.error("Failed to send records on this day email: #{inspect(reason)}.") + + put_toast( + socket, + :error, + gettext("Failed to send email") <> ": " <> ErrorMessages.friendly_message(reason) + ) + end + + {:noreply, socket} + end + def handle_event("db_vacuum", _params, socket) do case Maintenance.vacuum() do {:ok, _result} -> diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 6295398e..853e6fd3 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -2205,3 +2205,78 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Error generating tracklist PDF" msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Are you sure you want to prune unreferenced assets? This will permanently delete data." +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Asset pruning started in the background." +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Assets" +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Email sent successfully." +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Emails" +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Failed to send email" +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Manage cached and stored assets." +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Manually trigger email notifications." +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "No records on this day." +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Prune asset cache" +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Prune unreferenced assets" +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Pruned %{count} cached assets." +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Pruning..." +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Send records on this day" +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Sending..." +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index 41c2bbd7..677b9039 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -2205,3 +2205,78 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Error generating tracklist PDF" msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Are you sure you want to prune unreferenced assets? This will permanently delete data." +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Asset pruning started in the background." +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Assets" +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Email sent successfully." +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Emails" +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format, fuzzy +msgid "Failed to send email" +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Manage cached and stored assets." +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Manually trigger email notifications." +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format, fuzzy +msgid "No records on this day." +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Prune asset cache" +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Prune unreferenced assets" +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Pruned %{count} cached assets." +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Pruning..." +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Send records on this day" +msgstr "" + +#: lib/music_library_web/live/maintenance_live/index.ex +#, elixir-autogen, elixir-format +msgid "Sending..." +msgstr ""