feat(network): Support for testing all Sonarr indexers at once

This commit is contained in:
2024-11-22 17:35:36 -07:00
parent 68830a8789
commit 6896fcc134
14 changed files with 207 additions and 22 deletions
+60 -3
View File
@@ -5,9 +5,13 @@ use serde_json::{json, Value};
use crate::{
models::{
servarr_data::sonarr::{
modals::{EpisodeDetailsModal, SeasonDetailsModal},
sonarr_data::ActiveSonarrBlock,
radarr_models::IndexerTestResult,
servarr_data::{
modals::IndexerTestResultModalItem,
sonarr::{
modals::{EpisodeDetailsModal, SeasonDetailsModal},
sonarr_data::ActiveSonarrBlock,
},
},
servarr_models::{
AddRootFolderBody, CommandBody, DiskSpace, HostConfig, Indexer, LogResponse, QualityProfile,
@@ -68,6 +72,7 @@ pub enum SonarrEvent {
MarkHistoryItemAsFailed(i64),
StartTask(Option<SonarrTaskName>),
TestIndexer(Option<i64>),
TestAllIndexers,
}
impl NetworkResource for SonarrEvent {
@@ -100,6 +105,7 @@ impl NetworkResource for SonarrEvent {
SonarrEvent::MarkHistoryItemAsFailed(_) => "/history/failed",
SonarrEvent::StartTask(_) => "/command",
SonarrEvent::TestIndexer(_) => "/indexer/test",
SonarrEvent::TestAllIndexers => "/indexer/testall",
}
}
}
@@ -230,6 +236,10 @@ impl<'a, 'b> Network<'a, 'b> {
.test_sonarr_indexer(indexer_id)
.await
.map(SonarrSerdeable::from),
SonarrEvent::TestAllIndexers => self
.test_all_sonarr_indexers()
.await
.map(SonarrSerdeable::from),
}
}
@@ -1376,6 +1386,53 @@ impl<'a, 'b> Network<'a, 'b> {
.await
}
async fn test_all_sonarr_indexers(&mut self) -> Result<Vec<IndexerTestResult>> {
info!("Testing all Sonarr indexers");
let event = SonarrEvent::TestAllIndexers;
let mut request_props = self
.request_props_from(event, RequestMethod::Post, None, None, None)
.await;
request_props.ignore_status_code = true;
self
.handle_request::<(), Vec<IndexerTestResult>>(request_props, |test_results, mut app| {
let mut test_all_indexer_results = StatefulTable::default();
let indexers = app.data.sonarr_data.indexers.items.clone();
let modal_test_results = test_results
.iter()
.map(|result| {
let name = indexers
.iter()
.filter(|&indexer| indexer.id == result.id)
.map(|indexer| indexer.name.clone())
.nth(0)
.unwrap_or_default();
let validation_failures = result
.validation_failures
.iter()
.map(|failure| {
format!(
"Failure for field '{}': {}",
failure.property_name, failure.error_message
)
})
.collect::<Vec<String>>()
.join(", ");
IndexerTestResultModalItem {
name: name.unwrap_or_default(),
is_valid: result.is_valid,
validation_failures: validation_failures.into(),
}
})
.collect();
test_all_indexer_results.set_items(modal_test_results);
app.data.sonarr_data.indexer_test_all_results = Some(test_all_indexer_results);
})
.await
}
async fn extract_series_id(&mut self, series_id: Option<i64>) -> (i64, String) {
let series_id = if let Some(id) = series_id {
id