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