1use crate::{CloudClient, Result};
53use serde::{Deserialize, Serialize};
54use serde_json::Value;
55use std::collections::HashMap;
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 #[serde(flatten)]
70 pub extra: Value,
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
75pub struct FixedSubscriptionsPlans {
76 #[serde(skip_serializing_if = "Option::is_none")]
78 pub links: Option<Vec<HashMap<String, Value>>>,
79
80 #[serde(flatten)]
82 pub extra: Value,
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize)]
87#[serde(rename_all = "camelCase")]
88pub struct ProcessorResponse {
89 #[serde(skip_serializing_if = "Option::is_none")]
90 pub resource_id: Option<i32>,
91
92 #[serde(skip_serializing_if = "Option::is_none")]
93 pub additional_resource_id: Option<i32>,
94
95 #[serde(skip_serializing_if = "Option::is_none")]
96 pub resource: Option<HashMap<String, Value>>,
97
98 #[serde(skip_serializing_if = "Option::is_none")]
99 pub error: Option<String>,
100
101 #[serde(skip_serializing_if = "Option::is_none")]
102 pub additional_info: Option<String>,
103
104 #[serde(flatten)]
106 pub extra: Value,
107}
108
109#[derive(Debug, Clone, Serialize, Deserialize)]
111#[serde(rename_all = "camelCase")]
112pub struct FixedSubscriptionUpdateRequest {
113 #[serde(skip_serializing_if = "Option::is_none")]
114 pub subscription_id: Option<i32>,
115
116 #[serde(skip_serializing_if = "Option::is_none")]
118 pub name: Option<String>,
119
120 #[serde(skip_serializing_if = "Option::is_none")]
122 pub plan_id: Option<i32>,
123
124 #[serde(skip_serializing_if = "Option::is_none")]
126 pub payment_method: Option<String>,
127
128 #[serde(skip_serializing_if = "Option::is_none")]
130 pub payment_method_id: Option<i32>,
131
132 #[serde(skip_serializing_if = "Option::is_none")]
133 pub command_type: Option<String>,
134
135 #[serde(flatten)]
137 pub extra: Value,
138}
139
140#[derive(Debug, Clone, Serialize, Deserialize)]
142#[serde(rename_all = "camelCase")]
143pub struct FixedSubscriptionsPlan {
144 #[serde(skip_serializing_if = "Option::is_none")]
145 pub id: Option<i32>,
146
147 #[serde(skip_serializing_if = "Option::is_none")]
148 pub name: Option<String>,
149
150 #[serde(skip_serializing_if = "Option::is_none")]
151 pub size: Option<f64>,
152
153 #[serde(skip_serializing_if = "Option::is_none")]
154 pub dataset_size: Option<f64>,
155
156 #[serde(skip_serializing_if = "Option::is_none")]
157 pub size_measurement_unit: Option<String>,
158
159 #[serde(skip_serializing_if = "Option::is_none")]
160 pub provider: Option<String>,
161
162 #[serde(skip_serializing_if = "Option::is_none")]
163 pub region: Option<String>,
164
165 #[serde(skip_serializing_if = "Option::is_none")]
166 pub region_id: Option<i32>,
167
168 #[serde(skip_serializing_if = "Option::is_none")]
169 pub price: Option<i32>,
170
171 #[serde(skip_serializing_if = "Option::is_none")]
172 pub price_currency: Option<String>,
173
174 #[serde(skip_serializing_if = "Option::is_none")]
175 pub price_period: Option<String>,
176
177 #[serde(skip_serializing_if = "Option::is_none")]
178 pub maximum_databases: Option<i32>,
179
180 #[serde(skip_serializing_if = "Option::is_none")]
181 pub maximum_throughput: Option<i32>,
182
183 #[serde(skip_serializing_if = "Option::is_none")]
184 pub maximum_bandwidth_gb: Option<i32>,
185
186 #[serde(skip_serializing_if = "Option::is_none")]
187 pub availability: Option<String>,
188
189 #[serde(skip_serializing_if = "Option::is_none")]
190 pub connections: Option<String>,
191
192 #[serde(skip_serializing_if = "Option::is_none")]
193 pub cidr_allow_rules: Option<i32>,
194
195 #[serde(skip_serializing_if = "Option::is_none")]
196 pub support_data_persistence: Option<bool>,
197
198 #[serde(skip_serializing_if = "Option::is_none")]
199 pub redis_flex: Option<bool>,
200
201 #[serde(skip_serializing_if = "Option::is_none")]
202 pub support_instant_and_daily_backups: Option<bool>,
203
204 #[serde(skip_serializing_if = "Option::is_none")]
205 pub support_replication: Option<bool>,
206
207 #[serde(skip_serializing_if = "Option::is_none")]
208 pub support_clustering: Option<bool>,
209
210 #[serde(skip_serializing_if = "Option::is_none")]
211 pub support_ssl: Option<bool>,
212
213 #[serde(skip_serializing_if = "Option::is_none")]
214 pub customer_support: Option<String>,
215
216 #[serde(skip_serializing_if = "Option::is_none")]
218 pub links: Option<Vec<HashMap<String, Value>>>,
219
220 #[serde(flatten)]
222 pub extra: Value,
223}
224
225#[derive(Debug, Clone, Serialize, Deserialize)]
227#[serde(rename_all = "camelCase")]
228pub struct FixedSubscriptionCreateRequest {
229 pub name: String,
231
232 pub plan_id: i32,
234
235 #[serde(skip_serializing_if = "Option::is_none")]
237 pub payment_method: Option<String>,
238
239 #[serde(skip_serializing_if = "Option::is_none")]
241 pub payment_method_id: Option<i32>,
242
243 #[serde(skip_serializing_if = "Option::is_none")]
244 pub command_type: Option<String>,
245
246 #[serde(flatten)]
248 pub extra: Value,
249}
250
251#[derive(Debug, Clone, Serialize, Deserialize)]
253#[serde(rename_all = "camelCase")]
254pub struct FixedSubscriptions {
255 #[serde(skip_serializing_if = "Option::is_none")]
256 pub account_id: Option<i32>,
257
258 #[serde(skip_serializing_if = "Option::is_none")]
260 pub links: Option<Vec<HashMap<String, Value>>>,
261
262 #[serde(flatten)]
264 pub extra: Value,
265}
266
267#[derive(Debug, Clone, Serialize, Deserialize)]
269#[serde(rename_all = "camelCase")]
270pub struct RedisVersion {
271 #[serde(skip_serializing_if = "Option::is_none")]
272 pub version: Option<String>,
273
274 #[serde(skip_serializing_if = "Option::is_none")]
275 pub eol_date: Option<String>,
276
277 #[serde(skip_serializing_if = "Option::is_none")]
278 pub is_preview: Option<bool>,
279
280 #[serde(skip_serializing_if = "Option::is_none")]
281 pub is_default: Option<bool>,
282
283 #[serde(flatten)]
285 pub extra: Value,
286}
287
288#[derive(Debug, Clone, Serialize, Deserialize)]
290#[serde(rename_all = "camelCase")]
291pub struct FixedSubscription {
292 #[serde(skip_serializing_if = "Option::is_none")]
293 pub id: Option<i32>,
294
295 #[serde(skip_serializing_if = "Option::is_none")]
296 pub name: Option<String>,
297
298 #[serde(skip_serializing_if = "Option::is_none")]
299 pub status: Option<String>,
300
301 #[serde(skip_serializing_if = "Option::is_none")]
302 pub payment_method_id: Option<i32>,
303
304 #[serde(skip_serializing_if = "Option::is_none")]
305 pub payment_method_type: Option<String>,
306
307 #[serde(skip_serializing_if = "Option::is_none")]
308 pub plan_id: Option<i32>,
309
310 #[serde(skip_serializing_if = "Option::is_none")]
311 pub plan_name: Option<String>,
312
313 #[serde(skip_serializing_if = "Option::is_none")]
314 pub plan_type: Option<String>,
315
316 #[serde(skip_serializing_if = "Option::is_none")]
317 pub size: Option<f64>,
318
319 #[serde(skip_serializing_if = "Option::is_none")]
320 pub size_measurement_unit: Option<String>,
321
322 #[serde(skip_serializing_if = "Option::is_none")]
323 pub provider: Option<String>,
324
325 #[serde(skip_serializing_if = "Option::is_none")]
326 pub region: Option<String>,
327
328 #[serde(skip_serializing_if = "Option::is_none")]
329 pub price: Option<i32>,
330
331 #[serde(skip_serializing_if = "Option::is_none")]
332 pub price_period: Option<String>,
333
334 #[serde(skip_serializing_if = "Option::is_none")]
335 pub price_currency: Option<String>,
336
337 #[serde(skip_serializing_if = "Option::is_none")]
338 pub maximum_databases: Option<i32>,
339
340 #[serde(skip_serializing_if = "Option::is_none")]
341 pub availability: Option<String>,
342
343 #[serde(skip_serializing_if = "Option::is_none")]
344 pub connections: Option<String>,
345
346 #[serde(skip_serializing_if = "Option::is_none")]
347 pub cidr_allow_rules: Option<i32>,
348
349 #[serde(skip_serializing_if = "Option::is_none")]
350 pub support_data_persistence: Option<bool>,
351
352 #[serde(skip_serializing_if = "Option::is_none")]
353 pub support_instant_and_daily_backups: Option<bool>,
354
355 #[serde(skip_serializing_if = "Option::is_none")]
356 pub support_replication: Option<bool>,
357
358 #[serde(skip_serializing_if = "Option::is_none")]
359 pub support_clustering: Option<bool>,
360
361 #[serde(skip_serializing_if = "Option::is_none")]
362 pub customer_support: Option<String>,
363
364 #[serde(skip_serializing_if = "Option::is_none")]
365 pub creation_date: Option<String>,
366
367 #[serde(skip_serializing_if = "Option::is_none")]
368 pub database_status: Option<String>,
369
370 #[serde(skip_serializing_if = "Option::is_none")]
372 pub links: Option<Vec<HashMap<String, Value>>>,
373
374 #[serde(flatten)]
376 pub extra: Value,
377}
378
379#[derive(Debug, Clone, Serialize, Deserialize)]
381#[serde(rename_all = "camelCase")]
382pub struct TaskStateUpdate {
383 #[serde(skip_serializing_if = "Option::is_none")]
384 pub task_id: Option<String>,
385
386 #[serde(skip_serializing_if = "Option::is_none")]
387 pub command_type: Option<String>,
388
389 #[serde(skip_serializing_if = "Option::is_none")]
390 pub status: Option<String>,
391
392 #[serde(skip_serializing_if = "Option::is_none")]
393 pub description: Option<String>,
394
395 #[serde(skip_serializing_if = "Option::is_none")]
396 pub timestamp: Option<String>,
397
398 #[serde(skip_serializing_if = "Option::is_none")]
399 pub response: Option<ProcessorResponse>,
400
401 #[serde(skip_serializing_if = "Option::is_none")]
403 pub links: Option<Vec<HashMap<String, Value>>>,
404
405 #[serde(flatten)]
407 pub extra: Value,
408}
409
410pub struct FixedSubscriptionHandler {
419 client: CloudClient,
420}
421
422impl FixedSubscriptionHandler {
423 pub fn new(client: CloudClient) -> Self {
425 Self { client }
426 }
427
428 pub async fn list_plans(
433 &self,
434 provider: Option<String>,
435 redis_flex: Option<bool>,
436 ) -> Result<FixedSubscriptionsPlans> {
437 let mut query = Vec::new();
438 if let Some(v) = provider {
439 query.push(format!("provider={}", v));
440 }
441 if let Some(v) = redis_flex {
442 query.push(format!("redisFlex={}", v));
443 }
444 let query_string = if query.is_empty() {
445 String::new()
446 } else {
447 format!("?{}", query.join("&"))
448 };
449 self.client
450 .get(&format!("/fixed/plans{}", query_string))
451 .await
452 }
453
454 pub async fn get_plans_by_subscription_id(
459 &self,
460 subscription_id: i32,
461 ) -> Result<FixedSubscriptionsPlans> {
462 self.client
463 .get(&format!("/fixed/plans/subscriptions/{}", subscription_id))
464 .await
465 }
466
467 pub async fn get_plan_by_id(&self, plan_id: i32) -> Result<FixedSubscriptionsPlan> {
472 self.client.get(&format!("/fixed/plans/{}", plan_id)).await
473 }
474
475 pub async fn get_redis_versions(&self, subscription_id: i32) -> Result<RedisVersions> {
480 let mut query = Vec::new();
481 query.push(format!("subscriptionId={}", subscription_id));
482 let query_string = if query.is_empty() {
483 String::new()
484 } else {
485 format!("?{}", query.join("&"))
486 };
487 self.client
488 .get(&format!("/fixed/redis-versions{}", query_string))
489 .await
490 }
491
492 pub async fn list(&self) -> Result<FixedSubscriptions> {
497 self.client.get("/fixed/subscriptions").await
498 }
499
500 pub async fn create(
505 &self,
506 request: &FixedSubscriptionCreateRequest,
507 ) -> Result<TaskStateUpdate> {
508 self.client.post("/fixed/subscriptions", request).await
509 }
510
511 pub async fn delete_by_id(&self, subscription_id: i32) -> Result<TaskStateUpdate> {
516 let response = self
517 .client
518 .delete_raw(&format!("/fixed/subscriptions/{}", subscription_id))
519 .await?;
520 serde_json::from_value(response).map_err(Into::into)
521 }
522
523 pub async fn get_by_id(&self, subscription_id: i32) -> Result<FixedSubscription> {
528 self.client
529 .get(&format!("/fixed/subscriptions/{}", subscription_id))
530 .await
531 }
532
533 pub async fn update(
538 &self,
539 subscription_id: i32,
540 request: &FixedSubscriptionUpdateRequest,
541 ) -> Result<TaskStateUpdate> {
542 self.client
543 .put(
544 &format!("/fixed/subscriptions/{}", subscription_id),
545 request,
546 )
547 .await
548 }
549
550 pub async fn create_fixed_subscription(
556 &self,
557 request: &FixedSubscriptionCreateRequest,
558 ) -> Result<TaskStateUpdate> {
559 self.create(request).await
560 }
561
562 pub async fn get_fixed_subscription(&self, subscription_id: i32) -> Result<TaskStateUpdate> {
564 self.get_by_id(subscription_id)
565 .await
566 .map(|sub| serde_json::from_value(serde_json::json!(sub)).unwrap())
567 }
568
569 pub async fn update_fixed_subscription(
571 &self,
572 subscription_id: i32,
573 request: &FixedSubscriptionUpdateRequest,
574 ) -> Result<TaskStateUpdate> {
575 self.update(subscription_id, request).await
576 }
577
578 pub async fn delete_fixed_subscription(&self, subscription_id: i32) -> Result<TaskStateUpdate> {
580 self.delete_by_id(subscription_id).await
581 }
582
583 pub async fn get_all_fixed_subscriptions_plans(&self) -> Result<FixedSubscriptionsPlans> {
585 self.list_plans(None, None).await
586 }
587
588 pub async fn get_fixed_subscriptions_plans_by_subscription_id(
590 &self,
591 subscription_id: i32,
592 ) -> Result<FixedSubscriptionsPlans> {
593 self.get_plans_by_subscription_id(subscription_id).await
594 }
595
596 pub async fn get_fixed_subscriptions_plan_by_id(
598 &self,
599 plan_id: i32,
600 ) -> Result<FixedSubscriptionsPlan> {
601 self.get_plan_by_id(plan_id).await
602 }
603
604 pub async fn get_fixed_redis_versions(&self, subscription_id: i32) -> Result<RedisVersions> {
606 self.get_redis_versions(subscription_id).await
607 }
608
609 pub async fn get_all_fixed_subscriptions(&self) -> Result<FixedSubscriptions> {
611 self.list().await
612 }
613
614 pub async fn delete_fixed_subscription_by_id(
616 &self,
617 subscription_id: i32,
618 ) -> Result<TaskStateUpdate> {
619 self.delete_by_id(subscription_id).await
620 }
621
622 pub async fn get_fixed_subscription_by_id(
624 &self,
625 subscription_id: i32,
626 ) -> Result<FixedSubscription> {
627 self.get_by_id(subscription_id).await
628 }
629}