fix(network): Fixed an issue with dynamic typing in responses from Sonarr for history items

This commit is contained in:
2024-11-20 19:22:13 -07:00
parent df1eea22ab
commit f5631376af
10 changed files with 49 additions and 40 deletions
+4
View File
@@ -41,6 +41,10 @@ pub enum Serdeable {
Sonarr(SonarrSerdeable), Sonarr(SonarrSerdeable),
} }
pub trait EnumDisplayStyle<'a> {
fn to_display_str(self) -> &'a str;
}
pub trait Scrollable { pub trait Scrollable {
fn scroll_down(&mut self); fn scroll_down(&mut self);
fn scroll_up(&mut self); fn scroll_up(&mut self);
+5 -5
View File
@@ -13,7 +13,7 @@ use super::servarr_models::{
HostConfig, Indexer, Language, LogResponse, QualityProfile, QualityWrapper, QueueEvent, Release, HostConfig, Indexer, Language, LogResponse, QualityProfile, QualityWrapper, QueueEvent, Release,
SecurityConfig, SecurityConfig,
}; };
use super::Serdeable; use super::{EnumDisplayStyle, Serdeable};
#[cfg(test)] #[cfg(test)]
#[path = "radarr_models_tests.rs"] #[path = "radarr_models_tests.rs"]
@@ -313,8 +313,8 @@ impl Display for MinimumAvailability {
} }
} }
impl MinimumAvailability { impl<'a> EnumDisplayStyle<'a> for MinimumAvailability {
pub fn to_display_str<'a>(self) -> &'a str { fn to_display_str(self) -> &'a str {
match self { match self {
MinimumAvailability::Tba => "TBA", MinimumAvailability::Tba => "TBA",
MinimumAvailability::Announced => "Announced", MinimumAvailability::Announced => "Announced",
@@ -343,8 +343,8 @@ impl Display for Monitor {
} }
} }
impl Monitor { impl<'a> EnumDisplayStyle<'a> for Monitor {
pub fn to_display_str<'a>(self) -> &'a str { fn to_display_str(self) -> &'a str {
match self { match self {
Monitor::MovieOnly => "Movie only", Monitor::MovieOnly => "Movie only",
Monitor::MovieAndCollection => "Movie and Collection", Monitor::MovieAndCollection => "Movie and Collection",
+1 -1
View File
@@ -11,7 +11,7 @@ mod tests {
Release, RootFolder, SystemStatus, Tag, Task, TaskName, Update, Release, RootFolder, SystemStatus, Tag, Task, TaskName, Update,
}, },
servarr_models::{HostConfig, Log, LogResponse, QueueEvent, SecurityConfig}, servarr_models::{HostConfig, Log, LogResponse, QueueEvent, SecurityConfig},
Serdeable, EnumDisplayStyle, Serdeable,
}; };
#[test] #[test]
+5 -2
View File
@@ -1,5 +1,8 @@
use crate::models::{ use crate::models::{
servarr_models::Release, sonarr_models::Episode, stateful_table::StatefulTable, ScrollableText, servarr_models::Release,
sonarr_models::{Episode, SonarrHistoryItem},
stateful_table::StatefulTable,
ScrollableText,
}; };
#[derive(Default)] #[derive(Default)]
@@ -8,7 +11,7 @@ pub struct EpisodeDetailsModal {
pub file_details: String, pub file_details: String,
pub audio_details: String, pub audio_details: String,
pub video_details: String, pub video_details: String,
// pub episode_history: StatefulTable<MovieHistoryItem>, pub episode_history: StatefulTable<SonarrHistoryItem>,
pub episode_releases: StatefulTable<Release>, pub episode_releases: StatefulTable<Release>,
} }
+1 -1
View File
@@ -479,7 +479,7 @@ impl<'a, 'b> Network<'a, 'b> {
let event = SonarrEvent::GetHistory(events); let event = SonarrEvent::GetHistory(events);
let params = format!( let params = format!(
"pageSize={}&sortDirection=descending&sortKey=time", "pageSize={}&sortDirection=descending&sortKey=date",
events.unwrap_or(500) events.unwrap_or(500)
); );
let request_props = self let request_props = self
+29 -27
View File
@@ -156,8 +156,8 @@ mod test {
} }
#[rstest] #[rstest]
fn test_resource_history(#[values(SonarrEvent::GetSeriesHistory(None))] event: SonarrEvent) { fn test_resource_history(#[values(SonarrEvent::GetHistory(None))] event: SonarrEvent) {
assert_str_eq!(event.resource(), "/history/series"); assert_str_eq!(event.resource(), "/history");
} }
#[rstest] #[rstest]
@@ -177,7 +177,7 @@ mod test {
#[case(SonarrEvent::HealthCheck, "/health")] #[case(SonarrEvent::HealthCheck, "/health")]
#[case(SonarrEvent::GetBlocklist, "/blocklist?page=1&pageSize=10000")] #[case(SonarrEvent::GetBlocklist, "/blocklist?page=1&pageSize=10000")]
#[case(SonarrEvent::GetDownloads, "/queue")] #[case(SonarrEvent::GetDownloads, "/queue")]
#[case(SonarrEvent::GetHistory(None), "/history")] #[case(SonarrEvent::GetSeriesHistory(None), "/history/series")]
#[case(SonarrEvent::GetLogs(Some(500)), "/log")] #[case(SonarrEvent::GetLogs(Some(500)), "/log")]
#[case(SonarrEvent::GetQualityProfiles, "/qualityprofile")] #[case(SonarrEvent::GetQualityProfiles, "/qualityprofile")]
#[case(SonarrEvent::GetStatus, "/system/status")] #[case(SonarrEvent::GetStatus, "/system/status")]
@@ -438,8 +438,8 @@ mod test {
"status": "downloading", "status": "downloading",
"id": 1, "id": 1,
"episodeId": 1, "episodeId": 1,
"size": 3543348019u64, "size": 3543348019f64,
"sizeleft": 1771674009, "sizeleft": 1771674009f64,
"outputPath": "/nfs/tv/Test show/season 1/", "outputPath": "/nfs/tv/Test show/season 1/",
"indexer": "kickass torrents", "indexer": "kickass torrents",
"downloadClient": "transmission", "downloadClient": "transmission",
@@ -798,7 +798,7 @@ mod test {
"sourceTitle": "z episode", "sourceTitle": "z episode",
"episodeId": 1007, "episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } }, "quality": { "quality": { "name": "Bluray-1080p" } },
"languages": [{"name": "English"}], "language": { "name": "English" },
"date": "2024-02-10T07:28:45Z", "date": "2024-02-10T07:28:45Z",
"eventType": "grabbed", "eventType": "grabbed",
"data": { "data": {
@@ -811,7 +811,7 @@ mod test {
"sourceTitle": "A Episode", "sourceTitle": "A Episode",
"episodeId": 2001, "episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } }, "quality": { "quality": { "name": "Bluray-1080p" } },
"languages": [{"name": "English"}], "language": { "name": "English" },
"date": "2024-02-10T07:28:45Z", "date": "2024-02-10T07:28:45Z",
"eventType": "grabbed", "eventType": "grabbed",
"data": { "data": {
@@ -841,7 +841,7 @@ mod test {
None, None,
SonarrEvent::GetHistory(None), SonarrEvent::GetHistory(None),
None, None,
Some("pageSize=500&sortDirection=descending&sortKey=time"), Some("pageSize=500&sortDirection=descending&sortKey=date"),
) )
.await; .await;
app_arc.lock().await.data.sonarr_data.history.sort_asc = true; app_arc.lock().await.data.sonarr_data.history.sort_asc = true;
@@ -890,7 +890,7 @@ mod test {
"sourceTitle": "z episode", "sourceTitle": "z episode",
"episodeId": 1007, "episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } }, "quality": { "quality": { "name": "Bluray-1080p" } },
"languages": [{"name": "English"}], "language": { "name": "English" },
"date": "2024-02-10T07:28:45Z", "date": "2024-02-10T07:28:45Z",
"eventType": "grabbed", "eventType": "grabbed",
"data": { "data": {
@@ -903,7 +903,7 @@ mod test {
"sourceTitle": "A Episode", "sourceTitle": "A Episode",
"episodeId": 2001, "episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } }, "quality": { "quality": { "name": "Bluray-1080p" } },
"languages": [{"name": "English"}], "language": { "name": "English" },
"date": "2024-02-10T07:28:45Z", "date": "2024-02-10T07:28:45Z",
"eventType": "grabbed", "eventType": "grabbed",
"data": { "data": {
@@ -933,7 +933,7 @@ mod test {
None, None,
SonarrEvent::GetHistory(Some(1000)), SonarrEvent::GetHistory(Some(1000)),
None, None,
Some("pageSize=1000&sortDirection=descending&sortKey=time"), Some("pageSize=1000&sortDirection=descending&sortKey=date"),
) )
.await; .await;
app_arc.lock().await.data.sonarr_data.history.sort_asc = true; app_arc.lock().await.data.sonarr_data.history.sort_asc = true;
@@ -961,7 +961,7 @@ mod test {
"sourceTitle": "z episode", "sourceTitle": "z episode",
"episodeId": 1007, "episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } }, "quality": { "quality": { "name": "Bluray-1080p" } },
"languages": [{"name": "English"}], "language": { "name": "English" },
"date": "2024-02-10T07:28:45Z", "date": "2024-02-10T07:28:45Z",
"eventType": "grabbed", "eventType": "grabbed",
"data": { "data": {
@@ -974,7 +974,7 @@ mod test {
"sourceTitle": "A Episode", "sourceTitle": "A Episode",
"episodeId": 2001, "episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } }, "quality": { "quality": { "name": "Bluray-1080p" } },
"languages": [{"name": "English"}], "language": { "name": "English" },
"date": "2024-02-10T07:28:45Z", "date": "2024-02-10T07:28:45Z",
"eventType": "grabbed", "eventType": "grabbed",
"data": { "data": {
@@ -990,7 +990,7 @@ mod test {
None, None,
SonarrEvent::GetHistory(None), SonarrEvent::GetHistory(None),
None, None,
Some("pageSize=500&sortDirection=descending&sortKey=time"), Some("pageSize=500&sortDirection=descending&sortKey=date"),
) )
.await; .await;
app_arc.lock().await.data.sonarr_data.history.sort_asc = true; app_arc.lock().await.data.sonarr_data.history.sort_asc = true;
@@ -2225,7 +2225,7 @@ mod test {
"sourceTitle": "z episode", "sourceTitle": "z episode",
"episodeId": 1007, "episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } }, "quality": { "quality": { "name": "Bluray-1080p" } },
"languages": [{"name": "English"}], "language": { "name": "English" },
"date": "2024-02-10T07:28:45Z", "date": "2024-02-10T07:28:45Z",
"eventType": "grabbed", "eventType": "grabbed",
"data": { "data": {
@@ -2238,7 +2238,7 @@ mod test {
"sourceTitle": "A Episode", "sourceTitle": "A Episode",
"episodeId": 2001, "episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } }, "quality": { "quality": { "name": "Bluray-1080p" } },
"languages": [{"name": "English"}], "language": { "name": "English" },
"date": "2024-02-10T07:28:45Z", "date": "2024-02-10T07:28:45Z",
"eventType": "grabbed", "eventType": "grabbed",
"data": { "data": {
@@ -2347,7 +2347,7 @@ mod test {
"sourceTitle": "z episode", "sourceTitle": "z episode",
"episodeId": 1007, "episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } }, "quality": { "quality": { "name": "Bluray-1080p" } },
"languages": [{"name": "English"}], "language": { "name": "English" },
"date": "2024-02-10T07:28:45Z", "date": "2024-02-10T07:28:45Z",
"eventType": "grabbed", "eventType": "grabbed",
"data": { "data": {
@@ -2360,7 +2360,7 @@ mod test {
"sourceTitle": "A Episode", "sourceTitle": "A Episode",
"episodeId": 2001, "episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } }, "quality": { "quality": { "name": "Bluray-1080p" } },
"languages": [{"name": "English"}], "language": { "name": "English" },
"date": "2024-02-10T07:28:45Z", "date": "2024-02-10T07:28:45Z",
"eventType": "grabbed", "eventType": "grabbed",
"data": { "data": {
@@ -2453,7 +2453,7 @@ mod test {
"sourceTitle": "z episode", "sourceTitle": "z episode",
"episodeId": 1007, "episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } }, "quality": { "quality": { "name": "Bluray-1080p" } },
"languages": [{"name": "English"}], "language": { "name": "English" },
"date": "2024-02-10T07:28:45Z", "date": "2024-02-10T07:28:45Z",
"eventType": "grabbed", "eventType": "grabbed",
"data": { "data": {
@@ -2466,7 +2466,7 @@ mod test {
"sourceTitle": "A Episode", "sourceTitle": "A Episode",
"episodeId": 2001, "episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } }, "quality": { "quality": { "name": "Bluray-1080p" } },
"languages": [{"name": "English"}], "language": { "name": "English" },
"date": "2024-02-10T07:28:45Z", "date": "2024-02-10T07:28:45Z",
"eventType": "grabbed", "eventType": "grabbed",
"data": { "data": {
@@ -2555,7 +2555,7 @@ mod test {
"sourceTitle": "z episode", "sourceTitle": "z episode",
"episodeId": 1007, "episodeId": 1007,
"quality": { "quality": { "name": "Bluray-1080p" } }, "quality": { "quality": { "name": "Bluray-1080p" } },
"languages": [{"name": "English"}], "language": { "name": "English" },
"date": "2024-02-10T07:28:45Z", "date": "2024-02-10T07:28:45Z",
"eventType": "grabbed", "eventType": "grabbed",
"data": { "data": {
@@ -2568,7 +2568,7 @@ mod test {
"sourceTitle": "A Episode", "sourceTitle": "A Episode",
"episodeId": 2001, "episodeId": 2001,
"quality": { "quality": { "name": "Bluray-1080p" } }, "quality": { "quality": { "name": "Bluray-1080p" } },
"languages": [{"name": "English"}], "language": { "name": "English" },
"date": "2024-02-10T07:28:45Z", "date": "2024-02-10T07:28:45Z",
"eventType": "grabbed", "eventType": "grabbed",
"data": { "data": {
@@ -3037,8 +3037,8 @@ mod test {
status: "downloading".to_owned(), status: "downloading".to_owned(),
id: 1, id: 1,
episode_id: 1, episode_id: 1,
size: 3543348019, size: 3543348019f64,
sizeleft: 1771674009, sizeleft: 1771674009f64,
output_path: Some(HorizontallyScrollableText::from( output_path: Some(HorizontallyScrollableText::from(
"/nfs/tv/Test show/season 1/", "/nfs/tv/Test show/season 1/",
)), )),
@@ -3085,9 +3085,11 @@ mod test {
fn history_data() -> SonarrHistoryData { fn history_data() -> SonarrHistoryData {
SonarrHistoryData { SonarrHistoryData {
dropped_path: "/nfs/nzbget/completed/series/Coolness/something.cool.mkv".to_owned(), dropped_path: Some("/nfs/nzbget/completed/series/Coolness/something.cool.mkv".to_owned()),
imported_path: imported_path: Some(
"/nfs/tv/Coolness/Season 1/Coolness - S01E01 - Something Cool Bluray-1080p.mkv".to_owned(), "/nfs/tv/Coolness/Season 1/Coolness - S01E01 - Something Cool Bluray-1080p.mkv".to_owned(),
),
..SonarrHistoryData::default()
} }
} }
@@ -3097,7 +3099,7 @@ mod test {
source_title: "Test source".into(), source_title: "Test source".into(),
episode_id: 1, episode_id: 1,
quality: quality_wrapper(), quality: quality_wrapper(),
languages: vec![language()], language: language(),
date: DateTime::from(DateTime::parse_from_rfc3339("2024-02-10T07:28:45Z").unwrap()), date: DateTime::from(DateTime::parse_from_rfc3339("2024-02-10T07:28:45Z").unwrap()),
event_type: "grabbed".into(), event_type: "grabbed".into(),
data: history_data(), data: history_data(),
@@ -11,7 +11,7 @@ use crate::models::radarr_models::CollectionMovie;
use crate::models::servarr_data::radarr::radarr_data::{ use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS,
}; };
use crate::models::Route; use crate::models::{EnumDisplayStyle, Route};
use crate::ui::radarr_ui::collections::draw_collections; use crate::ui::radarr_ui::collections::draw_collections;
use crate::ui::styles::ManagarrStyle; use crate::ui::styles::ManagarrStyle;
use crate::ui::utils::{ use crate::ui::utils::{
@@ -12,7 +12,7 @@ use crate::models::servarr_data::radarr::modals::EditCollectionModal;
use crate::models::servarr_data::radarr::radarr_data::{ use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, EDIT_COLLECTION_BLOCKS, ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, EDIT_COLLECTION_BLOCKS,
}; };
use crate::models::Route; use crate::models::{EnumDisplayStyle, Route};
use crate::render_selectable_input_box; use crate::render_selectable_input_box;
use crate::ui::radarr_ui::collections::collection_details_ui::CollectionDetailsUi; use crate::ui::radarr_ui::collections::collection_details_ui::CollectionDetailsUi;
use crate::ui::radarr_ui::collections::draw_collections; use crate::ui::radarr_ui::collections::draw_collections;
+1 -1
View File
@@ -12,7 +12,7 @@ use crate::app::radarr::radarr_context_clues::{
use crate::models::radarr_models::AddMovieSearchResult; use crate::models::radarr_models::AddMovieSearchResult;
use crate::models::servarr_data::radarr::modals::AddMovieModal; use crate::models::servarr_data::radarr::modals::AddMovieModal;
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ADD_MOVIE_BLOCKS}; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ADD_MOVIE_BLOCKS};
use crate::models::Route; use crate::models::{EnumDisplayStyle, Route};
use crate::ui::radarr_ui::collections::{draw_collection_details, draw_collections}; use crate::ui::radarr_ui::collections::{draw_collection_details, draw_collections};
use crate::ui::radarr_ui::library::draw_library; use crate::ui::radarr_ui::library::draw_library;
use crate::ui::styles::ManagarrStyle; use crate::ui::styles::ManagarrStyle;
+1 -1
View File
@@ -13,7 +13,7 @@ use crate::models::servarr_data::radarr::modals::EditMovieModal;
use crate::models::servarr_data::radarr::radarr_data::{ use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, EDIT_MOVIE_BLOCKS, MOVIE_DETAILS_BLOCKS, ActiveRadarrBlock, EDIT_MOVIE_BLOCKS, MOVIE_DETAILS_BLOCKS,
}; };
use crate::models::Route; use crate::models::{EnumDisplayStyle, Route};
use crate::render_selectable_input_box; use crate::render_selectable_input_box;
use crate::ui::radarr_ui::library::draw_library; use crate::ui::radarr_ui::library::draw_library;
use crate::ui::radarr_ui::library::movie_details_ui::MovieDetailsUi; use crate::ui::radarr_ui::library::movie_details_ui::MovieDetailsUi;