From 068ff6ac10d0d354c7fe61af0956f48dd68dbdae Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Fri, 27 Jun 2025 19:47:44 -0400 Subject: [PATCH] get/set provider priority --- .../video/enqueue_image_to_video_command.rs | 1 - .../desktop/artcraft/src/core/commands/mod.rs | 1 + .../providers/get_provider_order_command.rs | 33 +++++++++++++++++++ .../src/core/commands/providers/mod.rs | 2 ++ .../providers/set_provider_order_command.rs | 31 +++++++++++++++++ .../src/core/commands/response/shorthand.rs | 16 +++++++++ .../src/core/state/provider_priority.rs | 2 +- crates/desktop/artcraft/src/lib.rs | 4 +++ 8 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 crates/desktop/artcraft/src/core/commands/providers/get_provider_order_command.rs create mode 100644 crates/desktop/artcraft/src/core/commands/providers/mod.rs create mode 100644 crates/desktop/artcraft/src/core/commands/providers/set_provider_order_command.rs diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/video/enqueue_image_to_video_command.rs b/crates/desktop/artcraft/src/core/commands/enqueue/video/enqueue_image_to_video_command.rs index dc88664f3d..b5bf9d9a57 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/video/enqueue_image_to_video_command.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/video/enqueue_image_to_video_command.rs @@ -4,7 +4,6 @@ use crate::core::commands::enqueue::video::internal_video_error::InternalVideoEr use crate::core::commands::response::failure_response_wrapper::{CommandErrorResponseWrapper, CommandErrorStatus}; use crate::core::commands::response::shorthand::Response; use crate::core::commands::response::success_response_wrapper::SerializeMarker; -use crate::core::events::sendable_event_trait::SendableEvent; use crate::core::model::video_models::VideoModel; use crate::core::state::data_dir::app_data_root::AppDataRoot; use crate::core::state::data_dir::trait_data_subdir::DataSubdir; diff --git a/crates/desktop/artcraft/src/core/commands/mod.rs b/crates/desktop/artcraft/src/core/commands/mod.rs index a9de77b4ed..f8d27fce1f 100644 --- a/crates/desktop/artcraft/src/core/commands/mod.rs +++ b/crates/desktop/artcraft/src/core/commands/mod.rs @@ -3,4 +3,5 @@ pub mod enqueue; pub mod flip_image; pub mod get_app_info_command; pub mod platform_info_command; +pub mod providers; pub mod response; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/core/commands/providers/get_provider_order_command.rs b/crates/desktop/artcraft/src/core/commands/providers/get_provider_order_command.rs new file mode 100644 index 0000000000..3ce458b1ac --- /dev/null +++ b/crates/desktop/artcraft/src/core/commands/providers/get_provider_order_command.rs @@ -0,0 +1,33 @@ +use crate::core::commands::response::shorthand::ResponseOrErrorMessage; +use crate::core::commands::response::success_response_wrapper::SerializeMarker; +use crate::core::state::app_preferences::app_preferences_manager::AppPreferencesManager; +use crate::core::state::app_preferences::preferred_download_directory::PreferredDownloadDirectory; +use crate::core::state::provider_priority::{Provider, ProviderPriorityStore}; +use errors::AnyhowResult; +use log::{error, info}; +use serde_derive::Serialize; +use tauri::{AppHandle, State}; + +#[derive(Serialize)] +pub struct GetProviderOrderResponse { + pub providers: Vec, +} + +impl SerializeMarker for GetProviderOrderResponse{} + +#[tauri::command] +pub async fn get_provider_order_command( + provider_priority_store: State<'_, ProviderPriorityStore>, +) -> ResponseOrErrorMessage { + info!("get_provider_order_command called"); + + let providers = provider_priority_store.get_priority() + .map_err(|err| { + error!("Failed to get provider order: {:?}", err); + "Failed to retrieve provider order" + })?; + + Ok(GetProviderOrderResponse { + providers, + }.into()) +} diff --git a/crates/desktop/artcraft/src/core/commands/providers/mod.rs b/crates/desktop/artcraft/src/core/commands/providers/mod.rs new file mode 100644 index 0000000000..e3a06fefa8 --- /dev/null +++ b/crates/desktop/artcraft/src/core/commands/providers/mod.rs @@ -0,0 +1,2 @@ +pub mod get_provider_order_command; +pub mod set_provider_order_command; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/core/commands/providers/set_provider_order_command.rs b/crates/desktop/artcraft/src/core/commands/providers/set_provider_order_command.rs new file mode 100644 index 0000000000..d7d403952c --- /dev/null +++ b/crates/desktop/artcraft/src/core/commands/providers/set_provider_order_command.rs @@ -0,0 +1,31 @@ +use crate::core::commands::response::shorthand::{ResponseOrErrorMessage, SuccessOrErrorMessage}; +use crate::core::commands::response::success_response_wrapper::SerializeMarker; +use crate::core::model::image_models::ImageModel; +use crate::core::state::app_preferences::app_preferences_manager::AppPreferencesManager; +use crate::core::state::app_preferences::preferred_download_directory::PreferredDownloadDirectory; +use crate::core::state::provider_priority::{Provider, ProviderPriorityStore}; +use errors::AnyhowResult; +use log::{error, info}; +use serde_derive::{Deserialize, Serialize}; +use tauri::{AppHandle, State}; + +#[derive(Deserialize)] +pub struct SetProviderOrderRequest { + pub providers: Vec, +} + +#[tauri::command] +pub async fn set_provider_order_command( + request: SetProviderOrderRequest, + provider_priority_store: State<'_, ProviderPriorityStore>, +) -> SuccessOrErrorMessage { + info!("set_provider_order_command called"); + + provider_priority_store.set_priority(&request.providers) + .map_err(|err| { + error!("Failed to set provider order: {:?}", err); + "Failed to set provider order" + })?; + + Ok(().into()) +} diff --git a/crates/desktop/artcraft/src/core/commands/response/shorthand.rs b/crates/desktop/artcraft/src/core/commands/response/shorthand.rs index 1bae5ac7fc..fbb333f4ad 100644 --- a/crates/desktop/artcraft/src/core/commands/response/shorthand.rs +++ b/crates/desktop/artcraft/src/core/commands/response/shorthand.rs @@ -30,3 +30,19 @@ pub type Response = /// No inner payloads for this type. Just strings as messages. pub type SimpleResponse = Response<(), (), ()>; + +/// Either an empty success payload or error message. +pub type SuccessOrErrorMessage = + Result, CommandErrorResponseWrapper<(), ()>>; + +/// Either a success or error message. +pub type ResponseOrErrorMessage = + Result, CommandErrorResponseWrapper<(), ()>>; + +/// Either a success or error type. +pub type ResponseOrErrorType = + Result, CommandErrorResponseWrapper>; + +/// Either a success or error payload. +pub type ResponseOrError = + Result, CommandErrorResponseWrapper<(), ErrPayload>>; diff --git a/crates/desktop/artcraft/src/core/state/provider_priority.rs b/crates/desktop/artcraft/src/core/state/provider_priority.rs index b4ceea5824..395ae3dd68 100644 --- a/crates/desktop/artcraft/src/core/state/provider_priority.rs +++ b/crates/desktop/artcraft/src/core/state/provider_priority.rs @@ -84,7 +84,7 @@ impl ProviderPriorityStore { } } - pub fn set_priority(&mut self, ordered_list: &[Provider]) -> AnyhowResult<()> { + pub fn set_priority(&self, ordered_list: &[Provider]) -> AnyhowResult<()> { match self.provider_priority.write() { Err(err) => { Err(anyhow::anyhow!("Failed to acquire write lock on provider priority: {}", err)) diff --git a/crates/desktop/artcraft/src/lib.rs b/crates/desktop/artcraft/src/lib.rs index e61f5e5fe8..06b9ad6397 100644 --- a/crates/desktop/artcraft/src/lib.rs +++ b/crates/desktop/artcraft/src/lib.rs @@ -11,6 +11,8 @@ use crate::core::commands::enqueue::video::enqueue_image_to_video_command::enque use crate::core::commands::flip_image::flip_image; use crate::core::commands::get_app_info_command::get_app_info_command; use crate::core::commands::platform_info_command::platform_info_command; +use crate::core::commands::providers::get_provider_order_command::get_provider_order_command; +use crate::core::commands::providers::set_provider_order_command::set_provider_order_command; use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; use crate::core::state::app_preferences::app_preferences_manager::load_app_preferences_or_default; use crate::core::state::data_dir::app_data_root::AppDataRoot; @@ -197,6 +199,8 @@ pub fn run() { get_app_info_command, get_app_preferences_command, get_fal_api_key_command, + get_provider_order_command, + set_provider_order_command, open_sora_login_command, platform_info_command, set_fal_api_key_command,