From b47f282223da3c2aba84eb4acc8a1162728371f3 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Thu, 30 Jan 2025 09:39:45 +0000 Subject: [PATCH] Add database backup functionality --- .../components/layouts/app.html.heex | 9 +++++++++ .../controllers/archive_controller.ex | 18 ++++++++++++++++++ lib/music_library_web/router.ex | 2 ++ priv/gettext/default.pot | 3 ++- 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 lib/music_library_web/controllers/archive_controller.ex diff --git a/lib/music_library_web/components/layouts/app.html.heex b/lib/music_library_web/components/layouts/app.html.heex index 8f7bea40..49eddcd7 100644 --- a/lib/music_library_web/components/layouts/app.html.heex +++ b/lib/music_library_web/components/layouts/app.html.heex @@ -28,6 +28,15 @@ {gettext("Errors")} + + <.icon + name="hero-archive-box-arrow-down" + class="h-4 w-4 mr-2" + aria-hidden="true" + data-slot="icon" + /> + {gettext("Backup")} + <.icon name="hero-arrow-left-start-on-rectangle" diff --git a/lib/music_library_web/controllers/archive_controller.ex b/lib/music_library_web/controllers/archive_controller.ex new file mode 100644 index 00000000..607a6625 --- /dev/null +++ b/lib/music_library_web/controllers/archive_controller.ex @@ -0,0 +1,18 @@ +defmodule MusicLibraryWeb.ArchiveController do + use MusicLibraryWeb, :controller + + def backup(conn, _params) do + database_path = database_path() + current_time = DateTime.utc_now() + file_name = "music_library_#{DateTime.to_unix(current_time)}.db" + + send_download(conn, {:file, database_path}, + filename: file_name, + content_type: "application/x-sqlite3" + ) + end + + defp database_path do + Application.get_env(:music_library, MusicLibrary.Repo)[:database] + end +end diff --git a/lib/music_library_web/router.ex b/lib/music_library_web/router.ex index 467ffdd2..48b70513 100644 --- a/lib/music_library_web/router.ex +++ b/lib/music_library_web/router.ex @@ -31,6 +31,8 @@ defmodule MusicLibraryWeb.Router do scope "/" do pipe_through :logged_in + get "/backup", ArchiveController, :backup + get "/covers/:record_id", CoverController, :show live "/", StatsLive.Index, :index diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 67eace7b..e1382592 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -123,7 +123,7 @@ msgstr "" msgid "Login" msgstr "" -#: lib/music_library_web/components/layouts/app.html.heex:38 +#: lib/music_library_web/components/layouts/app.html.heex:47 #, elixir-autogen, elixir-format msgid "Logout" msgstr "" @@ -550,6 +550,7 @@ msgstr "" msgid "Album" msgstr "" +#: lib/music_library_web/components/layouts/app.html.heex:38 #: lib/music_library_web/components/record_components.ex:213 #, elixir-autogen, elixir-format msgid "Backup"