From 72cb334b6af6db61f960772e48af481aafd17c23 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Thu, 21 Nov 2024 16:19:53 -0700 Subject: [PATCH] feat(network): Support for deleting an indexer from Sonarr --- src/network/radarr_network.rs | 4 +-- src/network/radarr_network_tests.rs | 4 +-- src/network/sonarr_network.rs | 40 ++++++++++++++++++++- src/network/sonarr_network_tests.rs | 55 ++++++++++++++++++++++++++++- 4 files changed, 97 insertions(+), 6 deletions(-) diff --git a/src/network/radarr_network.rs b/src/network/radarr_network.rs index fa745a6..f02965a 100644 --- a/src/network/radarr_network.rs +++ b/src/network/radarr_network.rs @@ -160,7 +160,7 @@ impl<'a, 'b> Network<'a, 'b> { .await .map(RadarrSerdeable::from), RadarrEvent::DeleteIndexer(indexer_id) => self - .delete_indexer(indexer_id) + .delete_radarr_indexer(indexer_id) .await .map(RadarrSerdeable::from), RadarrEvent::DeleteMovie(params) => { @@ -537,7 +537,7 @@ impl<'a, 'b> Network<'a, 'b> { .await } - async fn delete_indexer(&mut self, indexer_id: Option) -> Result<()> { + async fn delete_radarr_indexer(&mut self, indexer_id: Option) -> Result<()> { let event = RadarrEvent::DeleteIndexer(None); let id = if let Some(i_id) = indexer_id { i_id diff --git a/src/network/radarr_network_tests.rs b/src/network/radarr_network_tests.rs index d55ddd5..e9dcc43 100644 --- a/src/network/radarr_network_tests.rs +++ b/src/network/radarr_network_tests.rs @@ -3282,7 +3282,7 @@ mod test { } #[tokio::test] - async fn test_handle_delete_indexer_event() { + async fn test_handle_delete_radarr_indexer_event() { let (async_server, app_arc, _server) = mock_servarr_api( RequestMethod::Delete, None, @@ -3311,7 +3311,7 @@ mod test { } #[tokio::test] - async fn test_handle_delete_indexer_event_uses_provided_id() { + async fn test_handle_delete_radarr_indexer_event_uses_provided_id() { let (async_server, app_arc, _server) = mock_servarr_api( RequestMethod::Delete, None, diff --git a/src/network/sonarr_network.rs b/src/network/sonarr_network.rs index 8e858e1..98b0ccb 100644 --- a/src/network/sonarr_network.rs +++ b/src/network/sonarr_network.rs @@ -33,6 +33,7 @@ pub enum SonarrEvent { ClearBlocklist, DeleteBlocklistItem(Option), DeleteDownload(Option), + DeleteIndexer(Option), GetAllIndexerSettings, GetBlocklist, GetDownloads, @@ -66,7 +67,7 @@ impl NetworkResource for SonarrEvent { SonarrEvent::GetEpisodes(_) | SonarrEvent::GetEpisodeDetails(_) => "/episode", SonarrEvent::GetHistory(_) | SonarrEvent::GetEpisodeHistory(_) => "/history", SonarrEvent::GetHostConfig | SonarrEvent::GetSecurityConfig => "/config/host", - SonarrEvent::GetIndexers => "/indexer", + SonarrEvent::GetIndexers | SonarrEvent::DeleteIndexer(_) => "/indexer", SonarrEvent::GetLogs(_) => "/log", SonarrEvent::GetQualityProfiles => "/qualityprofile", SonarrEvent::GetQueuedEvents => "/command", @@ -107,6 +108,10 @@ impl<'a, 'b> Network<'a, 'b> { .delete_sonarr_download(download_id) .await .map(SonarrSerdeable::from), + SonarrEvent::DeleteIndexer(indexer_id) => self + .delete_sonarr_indexer(indexer_id) + .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 @@ -268,6 +273,39 @@ impl<'a, 'b> Network<'a, 'b> { .await } + async fn delete_sonarr_indexer(&mut self, indexer_id: Option) -> Result<()> { + let event = SonarrEvent::DeleteIndexer(None); + let id = if let Some(i_id) = indexer_id { + i_id + } else { + self + .app + .lock() + .await + .data + .sonarr_data + .indexers + .current_selection() + .id + }; + + info!("Deleting Sonarr indexer for indexer with id: {id}"); + + let request_props = self + .request_props_from( + event, + RequestMethod::Delete, + None::<()>, + Some(format!("/{id}")), + None, + ) + .await; + + self + .handle_request::<(), ()>(request_props, |_, _| ()) + .await + } + 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 f6656ad..b1f7e24 100644 --- a/src/network/sonarr_network_tests.rs +++ b/src/network/sonarr_network_tests.rs @@ -151,7 +151,9 @@ mod test { } #[rstest] - fn test_resource_indexer(#[values(SonarrEvent::GetIndexers)] event: SonarrEvent) { + fn test_resource_indexer( + #[values(SonarrEvent::GetIndexers, SonarrEvent::DeleteIndexer(None))] event: SonarrEvent, + ) { assert_str_eq!(event.resource(), "/indexer"); } @@ -326,6 +328,57 @@ mod test { async_server.assert_async().await; } + #[tokio::test] + async fn test_handle_delete_sonarr_indexer_event() { + let (async_server, app_arc, _server) = mock_servarr_api( + RequestMethod::Delete, + None, + None, + None, + SonarrEvent::DeleteIndexer(None), + Some("/1"), + None, + ) + .await; + app_arc + .lock() + .await + .data + .sonarr_data + .indexers + .set_items(vec![indexer()]); + let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + + assert!(network + .handle_sonarr_event(SonarrEvent::DeleteIndexer(None)) + .await + .is_ok()); + + async_server.assert_async().await; + } + + #[tokio::test] + async fn test_handle_delete_sonarr_indexer_event_uses_provided_id() { + let (async_server, app_arc, _server) = mock_servarr_api( + RequestMethod::Delete, + None, + None, + None, + SonarrEvent::DeleteIndexer(None), + Some("/1"), + None, + ) + .await; + let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + + assert!(network + .handle_sonarr_event(SonarrEvent::DeleteIndexer(Some(1))) + .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) {