feat(readarr): trigger Readarr tasks and expose the command on the CLI
The task name is sent as the shared CommandBody, matching the Radarr, Sonarr, and Lidarr implementations. The response is returned verbatim and no app state is mutated.
This commit is contained in:
6 files changed
+182
-3
No files matched your search
@@ -2,7 +2,7 @@ use anyhow::Result;
|
||||
use log::info;
|
||||
|
||||
use super::{NetworkEvent, NetworkResource};
|
||||
use crate::models::readarr_models::ReadarrSerdeable;
|
||||
use crate::models::readarr_models::{ReadarrSerdeable, ReadarrTaskName};
|
||||
use crate::network::{Network, RequestMethod};
|
||||
|
||||
mod system;
|
||||
@@ -21,11 +21,13 @@ pub enum ReadarrEvent {
|
||||
GetTasks,
|
||||
GetUpdates,
|
||||
HealthCheck,
|
||||
StartTask(ReadarrTaskName),
|
||||
}
|
||||
|
||||
impl NetworkResource for ReadarrEvent {
|
||||
fn resource(&self) -> &'static str {
|
||||
match &self {
|
||||
ReadarrEvent::StartTask(_) => "/command",
|
||||
ReadarrEvent::GetHostConfig | ReadarrEvent::GetSecurityConfig => "/config/host",
|
||||
ReadarrEvent::GetDiskSpace => "/diskspace",
|
||||
ReadarrEvent::HealthCheck => "/health",
|
||||
@@ -72,6 +74,10 @@ impl Network<'_, '_> {
|
||||
.get_readarr_healthcheck()
|
||||
.await
|
||||
.map(ReadarrSerdeable::from),
|
||||
ReadarrEvent::StartTask(task_name) => self
|
||||
.start_readarr_task(task_name)
|
||||
.await
|
||||
.map(ReadarrSerdeable::from),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ mod tests {
|
||||
use rstest::rstest;
|
||||
|
||||
#[rstest]
|
||||
#[case(ReadarrEvent::StartTask(Default::default()), "/command")]
|
||||
#[case(ReadarrEvent::GetHostConfig, "/config/host")]
|
||||
#[case(ReadarrEvent::GetSecurityConfig, "/config/host")]
|
||||
#[case(ReadarrEvent::GetDiskSpace, "/diskspace")]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use crate::models::readarr_models::ReadarrTask;
|
||||
use crate::models::readarr_models::{ReadarrTask, ReadarrTaskName};
|
||||
use crate::models::servarr_models::{
|
||||
DiskSpace, HostConfig, LogResponse, SecurityConfig, SystemStatus, Update,
|
||||
CommandBody, DiskSpace, HostConfig, LogResponse, SecurityConfig, SystemStatus, Update,
|
||||
};
|
||||
use crate::models::{HorizontallyScrollableText, Scrollable, ScrollableText};
|
||||
use crate::network::readarr_network::ReadarrEvent;
|
||||
@@ -8,6 +8,7 @@ use crate::network::{Network, RequestMethod};
|
||||
use anyhow::Result;
|
||||
use indoc::formatdoc;
|
||||
use log::info;
|
||||
use serde_json::Value;
|
||||
|
||||
#[cfg(test)]
|
||||
#[path = "readarr_system_network_tests.rs"]
|
||||
@@ -231,4 +232,23 @@ impl Network<'_, '_> {
|
||||
})
|
||||
.await
|
||||
}
|
||||
|
||||
pub(in crate::network::readarr_network) async fn start_readarr_task(
|
||||
&mut self,
|
||||
task: ReadarrTaskName,
|
||||
) -> Result<Value> {
|
||||
let event = ReadarrEvent::StartTask(task);
|
||||
let task_name = task.to_string();
|
||||
info!("Starting Readarr task: {task_name}");
|
||||
|
||||
let body = CommandBody { name: task_name };
|
||||
|
||||
let request_props = self
|
||||
.request_props_from(event, RequestMethod::Post, Some(body), None, None)
|
||||
.await;
|
||||
|
||||
self
|
||||
.handle_request::<CommandBody, Value>(request_props, |_, _| ())
|
||||
.await
|
||||
}
|
||||
}
|
||||
@@ -514,4 +514,51 @@ mod tests {
|
||||
assert_err!(result);
|
||||
assert_is_empty!(app.lock().await.data.readarr_data.updates.get_text());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_handle_start_readarr_task_event() {
|
||||
let response = json!({ "test": "test" });
|
||||
let (mock, app, _server) = MockServarrApi::post()
|
||||
.with_request_body(json!({
|
||||
"name": "CheckHealth"
|
||||
}))
|
||||
.returns(response.clone())
|
||||
.build_for(ReadarrEvent::StartTask(ReadarrTaskName::CheckHealth))
|
||||
.await;
|
||||
app.lock().await.server_tabs.set_index(3);
|
||||
let mut network = test_network(&app);
|
||||
|
||||
let result = network
|
||||
.handle_readarr_event(ReadarrEvent::StartTask(ReadarrTaskName::CheckHealth))
|
||||
.await;
|
||||
|
||||
mock.assert_async().await;
|
||||
|
||||
let ReadarrSerdeable::Value(value) = result.unwrap() else {
|
||||
panic!("Expected Value")
|
||||
};
|
||||
|
||||
assert_eq!(value, response);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_handle_start_readarr_task_event_failure() {
|
||||
let (mock, app, _server) = MockServarrApi::post()
|
||||
.with_request_body(json!({
|
||||
"name": "CheckHealth"
|
||||
}))
|
||||
.returns(json!({}))
|
||||
.status(500)
|
||||
.build_for(ReadarrEvent::StartTask(ReadarrTaskName::CheckHealth))
|
||||
.await;
|
||||
app.lock().await.server_tabs.set_index(3);
|
||||
let mut network = test_network(&app);
|
||||
|
||||
let result = network
|
||||
.handle_readarr_event(ReadarrEvent::StartTask(ReadarrTaskName::CheckHealth))
|
||||
.await;
|
||||
|
||||
mock.assert_async().await;
|
||||
assert_err!(result);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user