feat(network): Support for editing all sonarr indexer settings

This commit is contained in:
2024-11-25 13:58:34 -07:00
parent 45542cd3a9
commit 1e3141e4ee
4 changed files with 144 additions and 6 deletions
+5 -2
View File
@@ -181,7 +181,7 @@ impl<'a, 'b> Network<'a, 'b> {
.await .await
.map(RadarrSerdeable::from), .map(RadarrSerdeable::from),
RadarrEvent::EditAllIndexerSettings(params) => self RadarrEvent::EditAllIndexerSettings(params) => self
.edit_all_indexer_settings(params) .edit_all_radarr_indexer_settings(params)
.await .await
.map(RadarrSerdeable::from), .map(RadarrSerdeable::from),
RadarrEvent::EditCollection(params) => self RadarrEvent::EditCollection(params) => self
@@ -710,7 +710,10 @@ impl<'a, 'b> Network<'a, 'b> {
.await .await
} }
async fn edit_all_indexer_settings(&mut self, params: Option<IndexerSettings>) -> Result<Value> { async fn edit_all_radarr_indexer_settings(
&mut self,
params: Option<IndexerSettings>,
) -> Result<Value> {
info!("Updating Radarr indexer settings"); info!("Updating Radarr indexer settings");
let event = RadarrEvent::EditAllIndexerSettings(None); let event = RadarrEvent::EditAllIndexerSettings(None);
+2 -2
View File
@@ -3711,7 +3711,7 @@ mod test {
} }
#[tokio::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!({ let indexer_settings_json = json!({
"minimumAge": 0, "minimumAge": 0,
"maximumSize": 0, "maximumSize": 0,
@@ -3753,7 +3753,7 @@ mod test {
} }
#[tokio::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!({ let indexer_settings_json = json!({
"minimumAge": 0, "minimumAge": 0,
"maximumSize": 0, "maximumSize": 0,
+45 -1
View File
@@ -49,6 +49,7 @@ pub enum SonarrEvent {
DeleteSeries(Option<DeleteSeriesParams>), DeleteSeries(Option<DeleteSeriesParams>),
DeleteTag(i64), DeleteTag(i64),
DownloadRelease(SonarrReleaseDownloadBody), DownloadRelease(SonarrReleaseDownloadBody),
EditAllIndexerSettings(Option<IndexerSettings>),
GetAllIndexerSettings, GetAllIndexerSettings,
GetBlocklist, GetBlocklist,
GetDownloads, GetDownloads,
@@ -95,7 +96,9 @@ impl NetworkResource for SonarrEvent {
SonarrEvent::ClearBlocklist => "/blocklist/bulk", SonarrEvent::ClearBlocklist => "/blocklist/bulk",
SonarrEvent::DownloadRelease(_) => "/release", SonarrEvent::DownloadRelease(_) => "/release",
SonarrEvent::DeleteBlocklistItem(_) => "/blocklist", SonarrEvent::DeleteBlocklistItem(_) => "/blocklist",
SonarrEvent::GetAllIndexerSettings => "/config/indexer", SonarrEvent::GetAllIndexerSettings | SonarrEvent::EditAllIndexerSettings(_) => {
"/config/indexer"
}
SonarrEvent::GetBlocklist => "/blocklist?page=1&pageSize=10000", SonarrEvent::GetBlocklist => "/blocklist?page=1&pageSize=10000",
SonarrEvent::GetDownloads | SonarrEvent::DeleteDownload(_) => "/queue", SonarrEvent::GetDownloads | SonarrEvent::DeleteDownload(_) => "/queue",
SonarrEvent::GetEpisodes(_) | SonarrEvent::GetEpisodeDetails(_) => "/episode", SonarrEvent::GetEpisodes(_) | SonarrEvent::GetEpisodeDetails(_) => "/episode",
@@ -191,6 +194,10 @@ impl<'a, 'b> Network<'a, 'b> {
.download_sonarr_release(sonarr_release_download_body) .download_sonarr_release(sonarr_release_download_body)
.await .await
.map(SonarrSerdeable::from), .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::GetBlocklist => self.get_sonarr_blocklist().await.map(SonarrSerdeable::from),
SonarrEvent::GetDownloads => self.get_sonarr_downloads().await.map(SonarrSerdeable::from), SonarrEvent::GetDownloads => self.get_sonarr_downloads().await.map(SonarrSerdeable::from),
SonarrEvent::GetEpisodes(series_id) => self SonarrEvent::GetEpisodes(series_id) => self
@@ -714,6 +721,43 @@ impl<'a, 'b> Network<'a, 'b> {
.await .await
} }
async fn edit_all_sonarr_indexer_settings(
&mut self,
params: Option<IndexerSettings>,
) -> Result<Value> {
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::<IndexerSettings, Value>(request_props, |_, _| {})
.await;
self.app.lock().await.data.sonarr_data.indexer_settings = None;
resp
}
async fn get_all_sonarr_indexer_settings(&mut self) -> Result<IndexerSettings> { async fn get_all_sonarr_indexer_settings(&mut self) -> Result<IndexerSettings> {
info!("Fetching Sonarr indexer settings"); info!("Fetching Sonarr indexer settings");
let event = SonarrEvent::GetAllIndexerSettings; let event = SonarrEvent::GetAllIndexerSettings;
+92 -1
View File
@@ -17,7 +17,7 @@ mod test {
use crate::models::sonarr_models::{ use crate::models::sonarr_models::{
AddSeriesBody, AddSeriesOptions, AddSeriesSearchResult, AddSeriesSearchResultStatistics, AddSeriesBody, AddSeriesOptions, AddSeriesSearchResult, AddSeriesSearchResultStatistics,
SeriesMonitor, IndexerSettings, SeriesMonitor,
}; };
use crate::app::{App, ServarrConfig}; use crate::app::{App, ServarrConfig};
@@ -135,6 +135,17 @@ mod test {
"id": 1 "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] #[rstest]
fn test_resource_episode( fn test_resource_episode(
#[values(SonarrEvent::GetEpisodes(None), SonarrEvent::GetEpisodeDetails(None))] #[values(SonarrEvent::GetEpisodes(None), SonarrEvent::GetEpisodeDetails(None))]
@@ -967,6 +978,76 @@ mod test {
async_server.assert_async().await; 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] #[rstest]
#[tokio::test] #[tokio::test]
async fn test_handle_get_sonarr_blocklist_event(#[values(true, false)] use_custom_sorting: bool) { 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 { fn language() -> Language {
Language { Language {
id: 1, id: 1,