From 1e3141e4ee57f9037c4964574499818e2e315cb1 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 25 Nov 2024 13:58:34 -0700 Subject: [PATCH] feat(network): Support for editing all sonarr indexer settings --- src/network/radarr_network.rs | 7 ++- src/network/radarr_network_tests.rs | 4 +- src/network/sonarr_network.rs | 46 +++++++++++++- src/network/sonarr_network_tests.rs | 93 ++++++++++++++++++++++++++++- 4 files changed, 144 insertions(+), 6 deletions(-) diff --git a/src/network/radarr_network.rs b/src/network/radarr_network.rs index 3e3c124..efb6823 100644 --- a/src/network/radarr_network.rs +++ b/src/network/radarr_network.rs @@ -181,7 +181,7 @@ impl<'a, 'b> Network<'a, 'b> { .await .map(RadarrSerdeable::from), RadarrEvent::EditAllIndexerSettings(params) => self - .edit_all_indexer_settings(params) + .edit_all_radarr_indexer_settings(params) .await .map(RadarrSerdeable::from), RadarrEvent::EditCollection(params) => self @@ -710,7 +710,10 @@ impl<'a, 'b> Network<'a, 'b> { .await } - async fn edit_all_indexer_settings(&mut self, params: Option) -> Result { + async fn edit_all_radarr_indexer_settings( + &mut self, + params: Option, + ) -> Result { info!("Updating Radarr indexer settings"); let event = RadarrEvent::EditAllIndexerSettings(None); diff --git a/src/network/radarr_network_tests.rs b/src/network/radarr_network_tests.rs index 1fb3c3b..fc71755 100644 --- a/src/network/radarr_network_tests.rs +++ b/src/network/radarr_network_tests.rs @@ -3711,7 +3711,7 @@ mod test { } #[tokio::test] - async fn test_handle_edit_all_indexer_settings_event() { + async fn test_handle_edit_all_radarr_indexer_settings_event() { let indexer_settings_json = json!({ "minimumAge": 0, "maximumSize": 0, @@ -3753,7 +3753,7 @@ mod test { } #[tokio::test] - async fn test_handle_edit_all_indexer_settings_event_uses_provided_settings() { + async fn test_handle_edit_all_radarr_indexer_settings_event_uses_provided_settings() { let indexer_settings_json = json!({ "minimumAge": 0, "maximumSize": 0, diff --git a/src/network/sonarr_network.rs b/src/network/sonarr_network.rs index ce767af..c205179 100644 --- a/src/network/sonarr_network.rs +++ b/src/network/sonarr_network.rs @@ -49,6 +49,7 @@ pub enum SonarrEvent { DeleteSeries(Option), DeleteTag(i64), DownloadRelease(SonarrReleaseDownloadBody), + EditAllIndexerSettings(Option), GetAllIndexerSettings, GetBlocklist, GetDownloads, @@ -95,7 +96,9 @@ impl NetworkResource for SonarrEvent { SonarrEvent::ClearBlocklist => "/blocklist/bulk", SonarrEvent::DownloadRelease(_) => "/release", SonarrEvent::DeleteBlocklistItem(_) => "/blocklist", - SonarrEvent::GetAllIndexerSettings => "/config/indexer", + SonarrEvent::GetAllIndexerSettings | SonarrEvent::EditAllIndexerSettings(_) => { + "/config/indexer" + } SonarrEvent::GetBlocklist => "/blocklist?page=1&pageSize=10000", SonarrEvent::GetDownloads | SonarrEvent::DeleteDownload(_) => "/queue", SonarrEvent::GetEpisodes(_) | SonarrEvent::GetEpisodeDetails(_) => "/episode", @@ -191,6 +194,10 @@ impl<'a, 'b> Network<'a, 'b> { .download_sonarr_release(sonarr_release_download_body) .await .map(SonarrSerdeable::from), + SonarrEvent::EditAllIndexerSettings(params) => self + .edit_all_sonarr_indexer_settings(params) + .await + .map(SonarrSerdeable::from), SonarrEvent::GetBlocklist => self.get_sonarr_blocklist().await.map(SonarrSerdeable::from), SonarrEvent::GetDownloads => self.get_sonarr_downloads().await.map(SonarrSerdeable::from), SonarrEvent::GetEpisodes(series_id) => self @@ -714,6 +721,43 @@ impl<'a, 'b> Network<'a, 'b> { .await } + async fn edit_all_sonarr_indexer_settings( + &mut self, + params: Option, + ) -> Result { + info!("Updating Sonarr indexer settings"); + let event = SonarrEvent::EditAllIndexerSettings(None); + + let body = if let Some(indexer_settings) = params { + indexer_settings + } else { + self + .app + .lock() + .await + .data + .sonarr_data + .indexer_settings + .as_ref() + .unwrap() + .clone() + }; + + debug!("Indexer settings body: {body:?}"); + + let request_props = self + .request_props_from(event, RequestMethod::Put, Some(body), None, None) + .await; + + let resp = self + .handle_request::(request_props, |_, _| {}) + .await; + + self.app.lock().await.data.sonarr_data.indexer_settings = None; + + resp + } + async fn get_all_sonarr_indexer_settings(&mut self) -> Result { info!("Fetching Sonarr indexer settings"); let event = SonarrEvent::GetAllIndexerSettings; diff --git a/src/network/sonarr_network_tests.rs b/src/network/sonarr_network_tests.rs index 5acfa32..55f5861 100644 --- a/src/network/sonarr_network_tests.rs +++ b/src/network/sonarr_network_tests.rs @@ -17,7 +17,7 @@ mod test { use crate::models::sonarr_models::{ AddSeriesBody, AddSeriesOptions, AddSeriesSearchResult, AddSeriesSearchResultStatistics, - SeriesMonitor, + IndexerSettings, SeriesMonitor, }; use crate::app::{App, ServarrConfig}; @@ -135,6 +135,17 @@ mod test { "id": 1 }"#; + #[rstest] + fn test_resource_all_indexer_settings( + #[values( + SonarrEvent::GetAllIndexerSettings, + SonarrEvent::EditAllIndexerSettings(None) + )] + event: SonarrEvent, + ) { + assert_str_eq!(event.resource(), "/config/indexer"); + } + #[rstest] fn test_resource_episode( #[values(SonarrEvent::GetEpisodes(None), SonarrEvent::GetEpisodeDetails(None))] @@ -967,6 +978,76 @@ mod test { async_server.assert_async().await; } + #[tokio::test] + async fn test_handle_edit_all_indexer_settings_event() { + let indexer_settings_json = json!({ + "id": 1, + "minimumAge": 1, + "maximumSize": 12345, + "retention": 1, + "rssSyncInterval": 60 + }); + let (async_server, app_arc, _server) = mock_servarr_api( + RequestMethod::Put, + Some(indexer_settings_json), + None, + None, + SonarrEvent::EditAllIndexerSettings(None), + None, + None, + ) + .await; + + app_arc.lock().await.data.sonarr_data.indexer_settings = Some(indexer_settings()); + let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + + assert!(network + .handle_sonarr_event(SonarrEvent::EditAllIndexerSettings(None)) + .await + .is_ok()); + + async_server.assert_async().await; + assert!(app_arc + .lock() + .await + .data + .sonarr_data + .indexer_settings + .is_none()); + } + + #[tokio::test] + async fn test_handle_edit_all_indexer_settings_event_uses_provided_settings() { + let indexer_settings_json = json!({ + "id": 1, + "minimumAge": 1, + "maximumSize": 12345, + "retention": 1, + "rssSyncInterval": 60 + }); + let (async_server, app_arc, _server) = mock_servarr_api( + RequestMethod::Put, + Some(indexer_settings_json), + None, + None, + SonarrEvent::EditAllIndexerSettings(None), + None, + None, + ) + .await; + + let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + + assert!(network + .handle_sonarr_event(SonarrEvent::EditAllIndexerSettings( + Some(indexer_settings()) + )) + .await + .is_ok()); + + async_server.assert_async().await; + } + #[rstest] #[tokio::test] async fn test_handle_get_sonarr_blocklist_event(#[values(true, false)] use_custom_sorting: bool) { @@ -5743,6 +5824,16 @@ mod test { } } + fn indexer_settings() -> IndexerSettings { + IndexerSettings { + id: 1, + minimum_age: 1, + retention: 1, + maximum_size: 12345, + rss_sync_interval: 60, + } + } + fn language() -> Language { Language { id: 1,