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 #[deprecated(since = "0.8.0", note = "Use `create` instead")]
560 pub async fn create_fixed_subscription(
561 &self,
562 request: &FixedSubscriptionCreateRequest,
563 ) -> Result<TaskStateUpdate> {
564 self.create(request).await
565 }
566
567 #[deprecated(since = "0.8.0", note = "Use `get_by_id` instead")]
571 pub async fn get_fixed_subscription(&self, subscription_id: i32) -> Result<TaskStateUpdate> {
572 self.get_by_id(subscription_id)
573 .await
574 .map(|sub| serde_json::from_value(serde_json::json!(sub)).unwrap())
575 }
576
577 #[deprecated(since = "0.8.0", note = "Use `update` instead")]
581 pub async fn update_fixed_subscription(
582 &self,
583 subscription_id: i32,
584 request: &FixedSubscriptionUpdateRequest,
585 ) -> Result<TaskStateUpdate> {
586 self.update(subscription_id, request).await
587 }
588
589 #[deprecated(since = "0.8.0", note = "Use `delete_by_id` instead")]
593 pub async fn delete_fixed_subscription(&self, subscription_id: i32) -> Result<TaskStateUpdate> {
594 self.delete_by_id(subscription_id).await
595 }
596
597 #[deprecated(since = "0.8.0", note = "Use `list_plans` instead")]
601 pub async fn get_all_fixed_subscriptions_plans(&self) -> Result<FixedSubscriptionsPlans> {
602 self.list_plans(None, None).await
603 }
604
605 #[deprecated(since = "0.8.0", note = "Use `get_plans_by_subscription_id` instead")]
609 pub async fn get_fixed_subscriptions_plans_by_subscription_id(
610 &self,
611 subscription_id: i32,
612 ) -> Result<FixedSubscriptionsPlans> {
613 self.get_plans_by_subscription_id(subscription_id).await
614 }
615
616 #[deprecated(since = "0.8.0", note = "Use `get_plan_by_id` instead")]
620 pub async fn get_fixed_subscriptions_plan_by_id(
621 &self,
622 plan_id: i32,
623 ) -> Result<FixedSubscriptionsPlan> {
624 self.get_plan_by_id(plan_id).await
625 }
626
627 #[deprecated(since = "0.8.0", note = "Use `get_redis_versions` instead")]
631 pub async fn get_fixed_redis_versions(&self, subscription_id: i32) -> Result<RedisVersions> {
632 self.get_redis_versions(subscription_id).await
633 }
634
635 #[deprecated(since = "0.8.0", note = "Use `list` instead")]
639 pub async fn get_all_fixed_subscriptions(&self) -> Result<FixedSubscriptions> {
640 self.list().await
641 }
642
643 #[deprecated(since = "0.8.0", note = "Use `delete_by_id` instead")]
647 pub async fn delete_fixed_subscription_by_id(
648 &self,
649 subscription_id: i32,
650 ) -> Result<TaskStateUpdate> {
651 self.delete_by_id(subscription_id).await
652 }
653
654 #[deprecated(since = "0.8.0", note = "Use `get_by_id` instead")]
658 pub async fn get_fixed_subscription_by_id(
659 &self,
660 subscription_id: i32,
661 ) -> Result<FixedSubscription> {
662 self.get_by_id(subscription_id).await
663 }
664}