From 6a0049eb8f55541f61ba8b40cf4d951e5b25a17c Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Thu, 21 Nov 2024 14:46:18 -0700 Subject: [PATCH] feat(network): Support for deleting a download from Sonarr --- README.md | 2 +- 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 | 59 ++++++++++++++++++++++++++++- 5 files changed, 102 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 32415e3..ec4cafb 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ docker run --rm -it -v ~/.config/managarr/config.yml:/root/.config/managarr/conf You can also clone this repo and run `make docker` to build a docker image locally and run it using the above command. -Please note that you will need to create and popular your configuration file first before starting the container. Otherwise the container will fail to start. +Please note that you will need to create and popular your configuration file first before starting the container. Otherwise, the container will fail to start. ## Features Key: diff --git a/src/network/radarr_network.rs b/src/network/radarr_network.rs index aaf6d72..fa745a6 100644 --- a/src/network/radarr_network.rs +++ b/src/network/radarr_network.rs @@ -156,7 +156,7 @@ impl<'a, 'b> Network<'a, 'b> { .await .map(RadarrSerdeable::from), RadarrEvent::DeleteDownload(download_id) => self - .delete_download(download_id) + .delete_radarr_download(download_id) .await .map(RadarrSerdeable::from), RadarrEvent::DeleteIndexer(indexer_id) => self @@ -504,7 +504,7 @@ impl<'a, 'b> Network<'a, 'b> { .await } - async fn delete_download(&mut self, download_id: Option) -> Result<()> { + async fn delete_radarr_download(&mut self, download_id: Option) -> Result<()> { let event = RadarrEvent::DeleteDownload(None); let id = if let Some(dl_id) = download_id { dl_id diff --git a/src/network/radarr_network_tests.rs b/src/network/radarr_network_tests.rs index 6dc5809..d55ddd5 100644 --- a/src/network/radarr_network_tests.rs +++ b/src/network/radarr_network_tests.rs @@ -3231,7 +3231,7 @@ mod test { } #[tokio::test] - async fn test_handle_delete_download_event() { + async fn test_handle_delete_radarr_download_event() { let (async_server, app_arc, _server) = mock_servarr_api( RequestMethod::Delete, None, @@ -3260,7 +3260,7 @@ mod test { } #[tokio::test] - async fn test_handle_delete_download_event_uses_provided_id() { + async fn test_handle_delete_radarr_download_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 5fbdef0..8e858e1 100644 --- a/src/network/sonarr_network.rs +++ b/src/network/sonarr_network.rs @@ -32,6 +32,7 @@ mod sonarr_network_tests; pub enum SonarrEvent { ClearBlocklist, DeleteBlocklistItem(Option), + DeleteDownload(Option), GetAllIndexerSettings, GetBlocklist, GetDownloads, @@ -61,7 +62,7 @@ impl NetworkResource for SonarrEvent { SonarrEvent::DeleteBlocklistItem(_) => "/blocklist", SonarrEvent::GetAllIndexerSettings => "/config/indexer", SonarrEvent::GetBlocklist => "/blocklist?page=1&pageSize=10000", - SonarrEvent::GetDownloads => "/queue", + SonarrEvent::GetDownloads | SonarrEvent::DeleteDownload(_) => "/queue", SonarrEvent::GetEpisodes(_) | SonarrEvent::GetEpisodeDetails(_) => "/episode", SonarrEvent::GetHistory(_) | SonarrEvent::GetEpisodeHistory(_) => "/history", SonarrEvent::GetHostConfig | SonarrEvent::GetSecurityConfig => "/config/host", @@ -102,6 +103,10 @@ impl<'a, 'b> Network<'a, 'b> { .delete_sonarr_blocklist_item(blocklist_item_id) .await .map(SonarrSerdeable::from), + SonarrEvent::DeleteDownload(download_id) => self + .delete_sonarr_download(download_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 @@ -230,6 +235,39 @@ impl<'a, 'b> Network<'a, 'b> { .await } + async fn delete_sonarr_download(&mut self, download_id: Option) -> Result<()> { + let event = SonarrEvent::DeleteDownload(None); + let id = if let Some(dl_id) = download_id { + dl_id + } else { + self + .app + .lock() + .await + .data + .sonarr_data + .downloads + .current_selection() + .id + }; + + info!("Deleting Sonarr download for download 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 12b0bbd..f6656ad 100644 --- a/src/network/sonarr_network_tests.rs +++ b/src/network/sonarr_network_tests.rs @@ -163,6 +163,13 @@ mod test { assert_str_eq!(event.resource(), "/history"); } + #[rstest] + fn test_resource_queue( + #[values(SonarrEvent::GetDownloads, SonarrEvent::DeleteDownload(None))] event: SonarrEvent, + ) { + assert_str_eq!(event.resource(), "/queue"); + } + #[rstest] fn test_resource_release( #[values( @@ -179,7 +186,6 @@ mod test { #[case(SonarrEvent::DeleteBlocklistItem(None), "/blocklist")] #[case(SonarrEvent::HealthCheck, "/health")] #[case(SonarrEvent::GetBlocklist, "/blocklist?page=1&pageSize=10000")] - #[case(SonarrEvent::GetDownloads, "/queue")] #[case(SonarrEvent::GetSeriesHistory(None), "/history/series")] #[case(SonarrEvent::GetLogs(Some(500)), "/log")] #[case(SonarrEvent::GetQualityProfiles, "/qualityprofile")] @@ -269,6 +275,57 @@ mod test { async_server.assert_async().await; } + #[tokio::test] + async fn test_handle_delete_sonarr_download_event() { + let (async_server, app_arc, _server) = mock_servarr_api( + RequestMethod::Delete, + None, + None, + None, + SonarrEvent::DeleteDownload(None), + Some("/1"), + None, + ) + .await; + app_arc + .lock() + .await + .data + .sonarr_data + .downloads + .set_items(vec![download_record()]); + let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + + assert!(network + .handle_sonarr_event(SonarrEvent::DeleteDownload(None)) + .await + .is_ok()); + + async_server.assert_async().await; + } + + #[tokio::test] + async fn test_handle_delete_sonarr_download_event_uses_provided_id() { + let (async_server, app_arc, _server) = mock_servarr_api( + RequestMethod::Delete, + None, + None, + None, + SonarrEvent::DeleteDownload(None), + Some("/1"), + None, + ) + .await; + let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + + assert!(network + .handle_sonarr_event(SonarrEvent::DeleteDownload(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) {