1use serde::{Deserialize, Serialize};
4
5use utoipa::IntoParams;
6
7#[derive(Debug, Serialize, Deserialize, utoipa::ToSchema)]
9pub struct TriggerJobResponse {
10 pub execution_id: String,
12 pub message: String,
14}
15
16#[derive(Debug, Serialize, Deserialize, utoipa::ToSchema)]
18pub struct JobExecutionResponse {
19 pub id: String,
21 pub job_name: String,
23 pub status: String,
25 #[serde(skip_serializing_if = "Option::is_none")]
27 pub started_at: Option<String>,
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub completed_at: Option<String>,
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub exit_code: Option<i32>,
34 #[serde(skip_serializing_if = "Option::is_none")]
36 pub logs: Option<String>,
37 pub trigger: String,
39 #[serde(skip_serializing_if = "Option::is_none")]
41 pub error: Option<String>,
42 #[serde(skip_serializing_if = "Option::is_none")]
44 pub duration_ms: Option<u64>,
45}
46
47#[derive(Debug, Deserialize, IntoParams)]
49pub struct ListExecutionsQuery {
50 #[serde(default = "default_limit")]
52 pub limit: usize,
53 #[serde(default)]
55 pub status: Option<String>,
56}
57
58fn default_limit() -> usize {
59 50
60}
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65
66 #[test]
67 fn test_trigger_response_serialize() {
68 let response = TriggerJobResponse {
69 execution_id: "abc-123".to_string(),
70 message: "Job triggered".to_string(),
71 };
72 let json = serde_json::to_string(&response).unwrap();
73 assert!(json.contains("abc-123"));
74 assert!(json.contains("Job triggered"));
75 }
76
77 #[test]
78 fn test_execution_response_serialize() {
79 let response = JobExecutionResponse {
80 id: "exec-123".to_string(),
81 job_name: "backup".to_string(),
82 status: "completed".to_string(),
83 started_at: Some("2025-01-25T12:00:00Z".to_string()),
84 completed_at: Some("2025-01-25T12:01:00Z".to_string()),
85 exit_code: Some(0),
86 logs: Some("Done!".to_string()),
87 trigger: "cli".to_string(),
88 error: None,
89 duration_ms: Some(5000),
90 };
91 let json = serde_json::to_string(&response).unwrap();
92 assert!(json.contains("exec-123"));
93 assert!(json.contains("backup"));
94 assert!(json.contains("completed"));
95 }
96
97 #[test]
98 fn test_list_query_defaults() {
99 let query: ListExecutionsQuery = serde_json::from_str("{}").unwrap();
100 assert_eq!(query.limit, 50);
101 assert!(query.status.is_none());
102 }
103}