use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize)]
pub struct StatusResponse {
pub status: String,
pub message: String,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct PaginationOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub offset: Option<u32>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct HealthResponse {
pub status: String,
pub version: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ReadinessResponse {
pub status: String,
pub version: String,
pub postgres: bool,
pub milvus: bool,
pub redis: bool,
pub embedding: Option<bool>,
pub embedding_error: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct PlatformStatsResponse {
pub collections: u32,
pub documents: DocumentStats,
pub webhooks: u32,
pub queue: QueueStats,
}
#[derive(Debug, Clone, Deserialize)]
pub struct DocumentStats {
pub total: u32,
pub ready: u32,
pub pending: u32,
pub processing: u32,
pub failed: u32,
pub total_chunks: u64,
pub total_tokens: u64,
pub total_size_bytes: u64,
}
#[derive(Debug, Clone, Deserialize)]
pub struct QueueStats {
pub queued: u32,
pub completed: u32,
pub failed: u32,
pub pending: u32,
pub processing: u32,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_deserialize_status_response() {
let json = r#"{"status":"ok","message":"Collection deleted"}"#;
let resp: StatusResponse = serde_json::from_str(json).unwrap();
assert_eq!(resp.status, "ok");
assert_eq!(resp.message, "Collection deleted");
}
#[test]
fn test_deserialize_health_response() {
let json = r#"{"status":"ok","version":"1.2.3"}"#;
let resp: HealthResponse = serde_json::from_str(json).unwrap();
assert_eq!(resp.version, "1.2.3");
}
#[test]
fn test_deserialize_readiness_response() {
let json = r#"{"status":"ok","version":"1.2.3","postgres":true,"milvus":true,"redis":true,"embedding":true}"#;
let resp: ReadinessResponse = serde_json::from_str(json).unwrap();
assert!(resp.postgres);
assert!(resp.milvus);
assert!(resp.redis);
assert_eq!(resp.embedding, Some(true));
assert_eq!(resp.embedding_error, None);
}
#[test]
fn test_deserialize_platform_stats() {
let json = r#"{
"collections": 5,
"documents": {
"total": 100, "ready": 90, "pending": 5,
"processing": 3, "failed": 2, "total_chunks": 5000,
"total_tokens": 100000, "total_size_bytes": 50000000
},
"webhooks": 2,
"queue": {
"queued": 1, "completed": 95, "failed": 2,
"pending": 1, "processing": 1
}
}"#;
let resp: PlatformStatsResponse = serde_json::from_str(json).unwrap();
assert_eq!(resp.collections, 5);
assert_eq!(resp.documents.total, 100);
assert_eq!(resp.queue.completed, 95);
}
#[test]
fn test_serialize_pagination_options() {
let opts = PaginationOptions {
limit: Some(50),
offset: None,
};
let json = serde_json::to_value(&opts).unwrap();
assert_eq!(json["limit"], 50);
assert!(json.get("offset").is_none());
}
}