1use crate::types::{Link, ProcessorResponse};
53use crate::{CloudClient, Result};
54use serde::{Deserialize, Serialize};
55use typed_builder::TypedBuilder;
56
57#[derive(Debug, Clone, Serialize, Deserialize)]
63#[serde(rename_all = "camelCase")]
64pub struct RedisVersions {
65 #[serde(skip_serializing_if = "Option::is_none")]
66 pub redis_versions: Option<Vec<RedisVersion>>,
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct FixedSubscriptionsPlans {
72 #[serde(skip_serializing_if = "Option::is_none")]
74 pub links: Option<Vec<Link>>,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize, TypedBuilder)]
89#[serde(rename_all = "camelCase")]
90pub struct FixedSubscriptionUpdateRequest {
91 #[serde(skip_serializing_if = "Option::is_none")]
92 #[builder(default, setter(strip_option))]
93 pub subscription_id: Option<i32>,
94
95 #[serde(skip_serializing_if = "Option::is_none")]
97 #[builder(default, setter(strip_option, into))]
98 pub name: Option<String>,
99
100 #[serde(skip_serializing_if = "Option::is_none")]
102 #[builder(default, setter(strip_option))]
103 pub plan_id: Option<i32>,
104
105 #[serde(skip_serializing_if = "Option::is_none")]
107 #[builder(default, setter(strip_option, into))]
108 pub payment_method: Option<String>,
109
110 #[serde(skip_serializing_if = "Option::is_none")]
112 #[builder(default, setter(strip_option))]
113 pub payment_method_id: Option<i32>,
114
115 #[serde(skip_serializing_if = "Option::is_none")]
116 #[builder(default, setter(strip_option, into))]
117 pub command_type: Option<String>,
118}
119
120#[derive(Debug, Clone, Serialize, Deserialize)]
122#[serde(rename_all = "camelCase")]
123pub struct FixedSubscriptionsPlan {
124 #[serde(skip_serializing_if = "Option::is_none")]
125 pub id: Option<i32>,
126
127 #[serde(skip_serializing_if = "Option::is_none")]
128 pub name: Option<String>,
129
130 #[serde(skip_serializing_if = "Option::is_none")]
131 pub size: Option<f64>,
132
133 #[serde(skip_serializing_if = "Option::is_none")]
134 pub dataset_size: Option<f64>,
135
136 #[serde(skip_serializing_if = "Option::is_none")]
137 pub size_measurement_unit: Option<String>,
138
139 #[serde(skip_serializing_if = "Option::is_none")]
140 pub provider: Option<String>,
141
142 #[serde(skip_serializing_if = "Option::is_none")]
143 pub region: Option<String>,
144
145 #[serde(skip_serializing_if = "Option::is_none")]
146 pub region_id: Option<i32>,
147
148 #[serde(skip_serializing_if = "Option::is_none")]
149 pub price: Option<i32>,
150
151 #[serde(skip_serializing_if = "Option::is_none")]
152 pub price_currency: Option<String>,
153
154 #[serde(skip_serializing_if = "Option::is_none")]
155 pub price_period: Option<String>,
156
157 #[serde(skip_serializing_if = "Option::is_none")]
158 pub maximum_databases: Option<i32>,
159
160 #[serde(skip_serializing_if = "Option::is_none")]
161 pub maximum_throughput: Option<i32>,
162
163 #[serde(skip_serializing_if = "Option::is_none")]
164 pub maximum_bandwidth_gb: Option<i32>,
165
166 #[serde(skip_serializing_if = "Option::is_none")]
167 pub availability: Option<String>,
168
169 #[serde(skip_serializing_if = "Option::is_none")]
170 pub connections: Option<String>,
171
172 #[serde(skip_serializing_if = "Option::is_none")]
173 pub cidr_allow_rules: Option<i32>,
174
175 #[serde(skip_serializing_if = "Option::is_none")]
176 pub support_data_persistence: Option<bool>,
177
178 #[serde(skip_serializing_if = "Option::is_none")]
179 pub redis_flex: Option<bool>,
180
181 #[serde(skip_serializing_if = "Option::is_none")]
182 pub support_instant_and_daily_backups: Option<bool>,
183
184 #[serde(skip_serializing_if = "Option::is_none")]
185 pub support_replication: Option<bool>,
186
187 #[serde(skip_serializing_if = "Option::is_none")]
188 pub support_clustering: Option<bool>,
189
190 #[serde(skip_serializing_if = "Option::is_none")]
191 pub support_ssl: Option<bool>,
192
193 #[serde(skip_serializing_if = "Option::is_none")]
195 pub supported_alerts: Option<Vec<String>>,
196
197 #[serde(skip_serializing_if = "Option::is_none")]
198 pub customer_support: Option<String>,
199
200 #[serde(skip_serializing_if = "Option::is_none")]
202 pub links: Option<Vec<Link>>,
203}
204
205#[derive(Debug, Clone, Serialize, Deserialize, TypedBuilder)]
218#[serde(rename_all = "camelCase")]
219pub struct FixedSubscriptionCreateRequest {
220 #[builder(setter(into))]
222 pub name: String,
223
224 pub plan_id: i32,
226
227 #[serde(skip_serializing_if = "Option::is_none")]
229 #[builder(default, setter(strip_option, into))]
230 pub payment_method: Option<String>,
231
232 #[serde(skip_serializing_if = "Option::is_none")]
234 #[builder(default, setter(strip_option))]
235 pub payment_method_id: Option<i32>,
236
237 #[serde(skip_serializing_if = "Option::is_none")]
238 #[builder(default, setter(strip_option, into))]
239 pub command_type: Option<String>,
240}
241
242#[derive(Debug, Clone, Serialize, Deserialize)]
244#[serde(rename_all = "camelCase")]
245pub struct FixedSubscriptions {
246 #[serde(skip_serializing_if = "Option::is_none")]
247 pub account_id: Option<i32>,
248
249 #[serde(skip_serializing_if = "Option::is_none")]
251 pub subscriptions: Option<Vec<FixedSubscription>>,
252
253 #[serde(skip_serializing_if = "Option::is_none")]
255 pub links: Option<Vec<Link>>,
256}
257
258#[derive(Debug, Clone, Serialize, Deserialize)]
260#[serde(rename_all = "camelCase")]
261pub struct RedisVersion {
262 #[serde(skip_serializing_if = "Option::is_none")]
263 pub version: Option<String>,
264
265 #[serde(skip_serializing_if = "Option::is_none")]
266 pub eol_date: Option<String>,
267
268 #[serde(skip_serializing_if = "Option::is_none")]
269 pub is_preview: Option<bool>,
270
271 #[serde(skip_serializing_if = "Option::is_none")]
272 pub is_default: Option<bool>,
273}
274
275#[derive(Debug, Clone, Serialize, Deserialize)]
277#[serde(rename_all = "camelCase")]
278pub struct FixedSubscription {
279 #[serde(skip_serializing_if = "Option::is_none")]
280 pub id: Option<i32>,
281
282 #[serde(skip_serializing_if = "Option::is_none")]
283 pub name: Option<String>,
284
285 #[serde(skip_serializing_if = "Option::is_none")]
286 pub status: Option<String>,
287
288 #[serde(skip_serializing_if = "Option::is_none")]
289 pub payment_method_id: Option<i32>,
290
291 #[serde(skip_serializing_if = "Option::is_none")]
292 pub payment_method_type: Option<String>,
293
294 #[serde(skip_serializing_if = "Option::is_none")]
295 pub plan_id: Option<i32>,
296
297 #[serde(skip_serializing_if = "Option::is_none")]
298 pub plan_name: Option<String>,
299
300 #[serde(skip_serializing_if = "Option::is_none")]
301 pub plan_type: Option<String>,
302
303 #[serde(skip_serializing_if = "Option::is_none")]
304 pub size: Option<f64>,
305
306 #[serde(skip_serializing_if = "Option::is_none")]
307 pub size_measurement_unit: Option<String>,
308
309 #[serde(skip_serializing_if = "Option::is_none")]
310 pub provider: Option<String>,
311
312 #[serde(skip_serializing_if = "Option::is_none")]
313 pub region: Option<String>,
314
315 #[serde(skip_serializing_if = "Option::is_none")]
316 pub price: Option<i32>,
317
318 #[serde(skip_serializing_if = "Option::is_none")]
319 pub price_period: Option<String>,
320
321 #[serde(skip_serializing_if = "Option::is_none")]
322 pub price_currency: Option<String>,
323
324 #[serde(skip_serializing_if = "Option::is_none")]
325 pub maximum_databases: Option<i32>,
326
327 #[serde(skip_serializing_if = "Option::is_none")]
328 pub availability: Option<String>,
329
330 #[serde(skip_serializing_if = "Option::is_none")]
331 pub connections: Option<String>,
332
333 #[serde(skip_serializing_if = "Option::is_none")]
334 pub cidr_allow_rules: Option<i32>,
335
336 #[serde(skip_serializing_if = "Option::is_none")]
337 pub support_data_persistence: Option<bool>,
338
339 #[serde(skip_serializing_if = "Option::is_none")]
340 pub support_instant_and_daily_backups: Option<bool>,
341
342 #[serde(skip_serializing_if = "Option::is_none")]
343 pub support_replication: Option<bool>,
344
345 #[serde(skip_serializing_if = "Option::is_none")]
346 pub support_clustering: Option<bool>,
347
348 #[serde(skip_serializing_if = "Option::is_none")]
349 pub customer_support: Option<String>,
350
351 #[serde(skip_serializing_if = "Option::is_none")]
352 pub creation_date: Option<String>,
353
354 #[serde(skip_serializing_if = "Option::is_none")]
355 pub database_status: Option<String>,
356
357 #[serde(skip_serializing_if = "Option::is_none")]
359 pub links: Option<Vec<Link>>,
360}
361
362#[derive(Debug, Clone, Serialize, Deserialize)]
364#[serde(rename_all = "camelCase")]
365pub struct TaskStateUpdate {
366 #[serde(skip_serializing_if = "Option::is_none")]
367 pub task_id: Option<String>,
368
369 #[serde(skip_serializing_if = "Option::is_none")]
370 pub command_type: Option<String>,
371
372 #[serde(skip_serializing_if = "Option::is_none")]
373 pub status: Option<String>,
374
375 #[serde(skip_serializing_if = "Option::is_none")]
376 pub description: Option<String>,
377
378 #[serde(skip_serializing_if = "Option::is_none")]
379 pub timestamp: Option<String>,
380
381 #[serde(skip_serializing_if = "Option::is_none")]
382 pub response: Option<ProcessorResponse>,
383
384 #[serde(skip_serializing_if = "Option::is_none")]
386 pub links: Option<Vec<Link>>,
387}
388
389pub struct FixedSubscriptionHandler {
398 client: CloudClient,
399}
400
401impl FixedSubscriptionHandler {
402 #[must_use]
404 pub fn new(client: CloudClient) -> Self {
405 Self { client }
406 }
407
408 pub async fn list_plans(
413 &self,
414 provider: Option<String>,
415 redis_flex: Option<bool>,
416 ) -> Result<FixedSubscriptionsPlans> {
417 let mut query = Vec::new();
418 if let Some(v) = provider {
419 query.push(format!("provider={v}"));
420 }
421 if let Some(v) = redis_flex {
422 query.push(format!("redisFlex={v}"));
423 }
424 let query_string = if query.is_empty() {
425 String::new()
426 } else {
427 format!("?{}", query.join("&"))
428 };
429 self.client
430 .get(&format!("/fixed/plans{query_string}"))
431 .await
432 }
433
434 pub async fn get_plans_by_subscription_id(
439 &self,
440 subscription_id: i32,
441 ) -> Result<FixedSubscriptionsPlans> {
442 self.client
443 .get(&format!("/fixed/plans/subscriptions/{subscription_id}"))
444 .await
445 }
446
447 pub async fn get_plan_by_id(&self, plan_id: i32) -> Result<FixedSubscriptionsPlan> {
452 self.client.get(&format!("/fixed/plans/{plan_id}")).await
453 }
454
455 pub async fn get_redis_versions(&self, subscription_id: i32) -> Result<RedisVersions> {
460 let mut query = Vec::new();
461 query.push(format!("subscriptionId={subscription_id}"));
462 let query_string = if query.is_empty() {
463 String::new()
464 } else {
465 format!("?{}", query.join("&"))
466 };
467 self.client
468 .get(&format!("/fixed/redis-versions{query_string}"))
469 .await
470 }
471
472 pub async fn list(&self) -> Result<FixedSubscriptions> {
477 self.client.get("/fixed/subscriptions").await
478 }
479
480 pub async fn create(
485 &self,
486 request: &FixedSubscriptionCreateRequest,
487 ) -> Result<TaskStateUpdate> {
488 self.client.post("/fixed/subscriptions", request).await
489 }
490
491 pub async fn delete_by_id(&self, subscription_id: i32) -> Result<TaskStateUpdate> {
496 let response = self
497 .client
498 .delete_raw(&format!("/fixed/subscriptions/{subscription_id}"))
499 .await?;
500 serde_json::from_value(response).map_err(Into::into)
501 }
502
503 pub async fn get_by_id(&self, subscription_id: i32) -> Result<FixedSubscription> {
508 self.client
509 .get(&format!("/fixed/subscriptions/{subscription_id}"))
510 .await
511 }
512
513 pub async fn update(
518 &self,
519 subscription_id: i32,
520 request: &FixedSubscriptionUpdateRequest,
521 ) -> Result<TaskStateUpdate> {
522 self.client
523 .put(&format!("/fixed/subscriptions/{subscription_id}"), request)
524 .await
525 }
526}