From 76c105286f850ab540ef4d0d77f8f44a81e7e9b8 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Fri, 14 Mar 2025 19:55:32 -0500 Subject: [PATCH] Create management portal in Flutter #39 --- repertory/repertory/include/ui/handlers.hpp | 3 ++ repertory/repertory/src/ui/handlers.cpp | 34 ++++++++++++++----- web/repertory/lib/helpers.dart | 36 ++++++++++++++------- web/repertory/lib/models/mount_list.dart | 2 +- 4 files changed, 54 insertions(+), 21 deletions(-) diff --git a/repertory/repertory/include/ui/handlers.hpp b/repertory/repertory/include/ui/handlers.hpp index 408e9e03..af9c7849 100644 --- a/repertory/repertory/include/ui/handlers.hpp +++ b/repertory/repertory/include/ui/handlers.hpp @@ -66,6 +66,9 @@ private: auto launch_process(provider_type prov, std::string_view name, std::string_view args, bool background = false) const -> std::vector; + + void set_key_value(provider_type prov, std::string_view name, + std::string_view key, std::string_view value) const; }; } // namespace repertory::ui diff --git a/repertory/repertory/src/ui/handlers.cpp b/repertory/repertory/src/ui/handlers.cpp index 092246f0..a72d339f 100644 --- a/repertory/repertory/src/ui/handlers.cpp +++ b/repertory/repertory/src/ui/handlers.cpp @@ -101,13 +101,13 @@ handlers::handlers(mgmt_app_config *config, httplib::Server *server) handle_get_mount_status(req, res); }); - server->Post("/api/v1/mount", - [this](auto &&req, auto &&res) { handle_post_mount(req, res); }); - server->Post("/api/v1/add_mount", [this](auto &&req, auto &&res) { handle_post_add_mount(req, res); }); + server->Post("/api/v1/mount", + [this](auto &&req, auto &&res) { handle_post_mount(req, res); }); + server->Put("/api/v1/set_value_by_name", [this](auto &&req, auto &&res) { handle_put_set_value_by_name(req, res); }); @@ -150,6 +150,16 @@ handlers::handlers(mgmt_app_config *config, httplib::Server *server) handlers::~handlers() { event_system::instance().stop(); } +void handlers::set_key_value(provider_type prov, std::string_view name, + std::string_view key, + std::string_view value) const { +#if defined(_WIN32) + launch_process(prov, name, fmt::format(R"(-set {} "{}")", key, value)); +#else // !defined(_WIN32) + launch_process(prov, name, fmt::format("-set {} '{}'", key, value)); +#endif // defined(_WIN32) +} + void handlers::handle_get_mount(auto &&req, auto &&res) const { REPERTORY_USES_FUNCTION_NAME(); @@ -264,6 +274,18 @@ void handlers::handle_post_add_mount(auto &&req, auto &&res) const { fmt::println("config: {}-{}-{}", name, app_config::get_provider_name(prov), cfg.dump(2)); + launch_process(prov, name, "-gc"); + for (const auto &[key, value] : cfg.items()) { + if (value.is_object()) { + for (const auto &[key2, value2] : value.items()) { + set_key_value(prov, name, fmt::format("{}.{}", key, key2), + value2.template get()); + } + } else { + set_key_value(prov, name, key, value.template get()); + } + } + res.status = http_error_codes::ok; } @@ -288,11 +310,7 @@ void handlers::handle_put_set_value_by_name(auto &&req, auto &&res) const { auto prov = provider_type_from_string(req.get_param_value("type")); auto value = req.get_param_value("value"); -#if defined(_WIN32) - launch_process(prov, name, fmt::format(R"(-set {} "{}")", key, value)); -#else //! defined(_WIN32) - launch_process(prov, name, fmt::format("-set {} '{}'", key, value)); -#endif // defined(_WIN32) + set_key_value(prov, name, key, value); res.status = http_error_codes::ok; } diff --git a/web/repertory/lib/helpers.dart b/web/repertory/lib/helpers.dart index c250b089..b5340965 100644 --- a/web/repertory/lib/helpers.dart +++ b/web/repertory/lib/helpers.dart @@ -175,21 +175,33 @@ bool validateSettings( }) { settings.forEach((key, value) { final settingKey = rootKey == null ? key : '$rootKey.$key'; - if (value is Map) { - validateSettings( - value as Map, - failed, - rootKey: settingKey, - ); - } else { - for (var validator in getSettingValidators(settingKey)) { - if (validator(value.toString())) { - continue; - } - failed.add(settingKey); + if (value is Map) { + validateSettings(value, failed, rootKey: settingKey); + return; + } + + for (var validator in getSettingValidators(settingKey)) { + if (validator(value.toString())) { + continue; } + failed.add(settingKey); } }); return failed.isEmpty; } + +convertAllToString(Map settings) { + settings.forEach((key, value) { + if (value is Map) { + convertAllToString(value); + return; + } + + if (value is String) { + return; + } + + settings[key] = value.toString(); + }); +} diff --git a/web/repertory/lib/models/mount_list.dart b/web/repertory/lib/models/mount_list.dart index 8a8f979a..e95cbf00 100644 --- a/web/repertory/lib/models/mount_list.dart +++ b/web/repertory/lib/models/mount_list.dart @@ -61,7 +61,7 @@ class MountList with ChangeNotifier { await http.post( Uri.parse( Uri.encodeFull( - '${getBaseUri()}/api/v1/add_mount?name=$name&type=$type&config=${jsonEncode(mountConfig)}', + '${getBaseUri()}/api/v1/add_mount?name=$name&type=$type&config=${jsonEncode(convertAllToString(mountConfig))}', ), ), );