redis_cloud/models/
database.rs

1//! Database-related data models
2//!
3//! Contains data structures for Redis Cloud database operations including database
4//! configuration, status information, and request/response models for database management.
5
6use serde::{Deserialize, Serialize};
7use serde_json::Value;
8
9/// Represents a Redis Cloud database instance
10///
11/// Contains all the configuration, status, and operational information for a database
12/// deployed in Redis Cloud. This includes memory settings, persistence configuration,
13/// replication status, and connection endpoints.
14///
15/// # Examples
16///
17/// ```rust,no_run
18/// # use redis_cloud::{CloudClient, CloudDatabaseHandler};
19/// # #[tokio::main]
20/// # async fn main() -> Result<(), Box<dyn std::error::Error>> {
21/// # let client = CloudClient::builder().api_key("key").api_secret("secret").build()?;
22/// let db_handler = CloudDatabaseHandler::new(client);
23/// let database = db_handler.get(123, 456).await?;
24///
25/// println!("Database: {}", database.name);
26/// println!("Status: {}", database.status);
27/// println!("Memory: {:.1} GB", database.memory_limit_in_gb);
28///
29/// if let Some(endpoint) = &database.public_endpoint {
30///     println!("Connect to: {}", endpoint);
31/// }
32/// # Ok(())
33/// # }
34/// ```
35#[derive(Debug, Clone, Serialize, Deserialize)]
36pub struct CloudDatabase {
37    /// Unique database identifier within the subscription
38    pub db_id: u32,
39    /// Human-readable database name
40    pub name: String,
41    /// Redis protocol version (e.g., "redis")
42    pub protocol: String,
43    /// Cloud provider hosting the database (AWS, GCP, Azure)
44    pub provider: String,
45    /// Cloud region where the database is deployed
46    pub region: String,
47    /// Current database status (active, pending, error, etc.)
48    pub status: String,
49    /// Maximum memory allocation in gigabytes
50    pub memory_limit_in_gb: f64,
51    /// Current memory usage in megabytes
52    pub memory_used_in_mb: Option<f64>,
53    /// Memory usage as a percentage (0-100)
54    pub memory_usage: Option<f64>,
55    /// Data persistence configuration (none, aof-every-1-sec, etc.)
56    pub data_persistence: String,
57    /// Whether replication is enabled for high availability
58    pub replication: bool,
59    /// Data eviction policy when memory limit is reached
60    pub data_eviction: Option<String>,
61    /// Throughput measurement configuration
62    pub throughput_measurement: Option<ThroughputMeasurement>,
63    /// ISO 8601 timestamp when database was activated
64    pub activated_on: Option<String>,
65    /// ISO 8601 timestamp of last modification
66    pub last_modified: Option<String>,
67    /// Public internet connection endpoint
68    pub public_endpoint: Option<String>,
69    /// VPC-private connection endpoint
70    pub private_endpoint: Option<String>,
71
72    /// Additional fields not explicitly modeled
73    #[serde(flatten)]
74    pub extra: Value,
75}
76
77/// Throughput measurement configuration for database performance monitoring
78#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct ThroughputMeasurement {
80    /// Measurement method (e.g., "operations-per-second")
81    pub by: String,
82    /// Throughput limit value
83    pub value: u32,
84}
85
86/// Request payload for creating a new database
87///
88/// Defines the configuration for a new Redis database including memory limits,
89/// persistence settings, and optional features like cluster API support.
90///
91/// # Examples
92///
93/// ```rust,no_run
94/// use redis_cloud::CreateDatabaseRequest;
95/// use serde_json::json;
96///
97/// let request = json!({
98///     "name": "production-cache",
99///     "memory_limit_in_gb": 5.0,
100///     "data_persistence": "aof-every-1-sec",
101///     "replication": true,
102///     "password": "secure-password-123",
103///     "support_oss_cluster_api": false
104/// });
105/// ```
106#[derive(Debug, Serialize)]
107pub struct CreateDatabaseRequest {
108    pub name: String,
109    pub memory_limit_in_gb: f64,
110    pub data_persistence: String,
111    pub replication: bool,
112    #[serde(skip_serializing_if = "Option::is_none")]
113    pub data_eviction: Option<String>,
114    #[serde(skip_serializing_if = "Option::is_none")]
115    pub password: Option<String>,
116    #[serde(skip_serializing_if = "Option::is_none")]
117    pub support_oss_cluster_api: Option<bool>,
118    #[serde(skip_serializing_if = "Option::is_none")]
119    pub use_external_endpoint_for_oss_cluster_api: Option<bool>,
120}
121
122/// Update database request
123#[derive(Debug, Serialize)]
124pub struct UpdateDatabaseRequest {
125    #[serde(skip_serializing_if = "Option::is_none")]
126    pub name: Option<String>,
127    #[serde(skip_serializing_if = "Option::is_none")]
128    pub memory_limit_in_gb: Option<f64>,
129    #[serde(skip_serializing_if = "Option::is_none")]
130    pub data_persistence: Option<String>,
131    #[serde(skip_serializing_if = "Option::is_none")]
132    pub replication: Option<bool>,
133    #[serde(skip_serializing_if = "Option::is_none")]
134    pub data_eviction: Option<String>,
135    #[serde(skip_serializing_if = "Option::is_none")]
136    pub password: Option<String>,
137}