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}