redis_cloud/fixed/
subscriptions.rs

1//! Subscription management for Essentials (Fixed) plans
2//!
3//! This module manages Redis Cloud Essentials subscriptions, which provide
4//! simplified, fixed-capacity Redis deployments with predictable pricing.
5//! Essentials subscriptions are ideal for smaller, stable workloads.
6//!
7//! # Overview
8//!
9//! Essentials subscriptions offer a streamlined experience with pre-defined
10//! plans that include specific memory allocations, regions, and feature sets.
11//! Unlike Pro subscriptions, they don't support auto-scaling or multi-region
12//! deployments.
13//!
14//! # Key Features
15//!
16//! - **Fixed Plans**: Pre-defined subscription plans with set resources
17//! - **Simple Management**: Create, update, and delete subscriptions
18//! - **Plan Discovery**: Browse available plans by region and size
19//! - **Redis Versions**: Access supported Redis versions for the subscription
20//! - **Cost Predictability**: Fixed monthly pricing based on plan selection
21//!
22//! # Plan Structure
23//!
24//! Essentials plans are defined by:
25//! - Memory size (250MB to 12GB)
26//! - Cloud provider and region
27//! - Included features and modules
28//! - Fixed monthly price
29//!
30//! # Example Usage
31//!
32//! ```no_run
33//! use redis_cloud::{CloudClient, FixedSubscriptionHandler};
34//!
35//! # async fn example() -> Result<(), Box<dyn std::error::Error>> {
36//! let client = CloudClient::builder()
37//!     .api_key("your-api-key")
38//!     .api_secret("your-api-secret")
39//!     .build()?;
40//!
41//! let handler = FixedSubscriptionHandler::new(client);
42//!
43//! // List available plans
44//! let plans = handler.list_plans(None, None).await?;
45//!
46//! // Get all fixed subscriptions
47//! let subscriptions = handler.list().await?;
48//! # Ok(())
49//! # }
50//! ```
51
52use crate::{CloudClient, Result};
53use serde::{Deserialize, Serialize};
54use serde_json::Value;
55use std::collections::HashMap;
56
57// ============================================================================
58// Models
59// ============================================================================
60
61/// RedisVersions
62#[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    /// Additional fields from the API
69    #[serde(flatten)]
70    pub extra: Value,
71}
72
73/// Redis list of Essentials subscriptions plans
74#[derive(Debug, Clone, Serialize, Deserialize)]
75pub struct FixedSubscriptionsPlans {
76    /// HATEOAS links
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub links: Option<Vec<HashMap<String, Value>>>,
79
80    /// Additional fields from the API
81    #[serde(flatten)]
82    pub extra: Value,
83}
84
85/// ProcessorResponse
86#[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    /// Additional fields from the API
105    #[serde(flatten)]
106    pub extra: Value,
107}
108
109/// Essentials subscription update request
110#[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    /// Optional. Updated subscription name.
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub name: Option<String>,
119
120    /// Optional. An Essentials plan ID. The plan describes the dataset size, cloud provider and region, and available database configuration options. Use GET /fixed/plans/subscriptions/{subscriptionId} to get a list of compatible options for the specified subscription.
121    #[serde(skip_serializing_if = "Option::is_none")]
122    pub plan_id: Option<i32>,
123
124    /// Optional. The payment method for the subscription. If set to ‘credit-card’ , ‘paymentMethodId’ must be defined.
125    #[serde(skip_serializing_if = "Option::is_none")]
126    pub payment_method: Option<String>,
127
128    /// Optional. The payment method ID you'd like to use for this subscription. Must be a valid payment method ID for this account. Use GET /payment-methods to get a list of payment methods for your account. This value is optional if ‘paymentMethod’ is ‘marketplace’, but required if 'paymentMethod' is 'credit-card'.
129    #[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    /// Additional fields from the API
136    #[serde(flatten)]
137    pub extra: Value,
138}
139
140/// Redis Essentials subscription plan information
141#[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    /// HATEOAS links
217    #[serde(skip_serializing_if = "Option::is_none")]
218    pub links: Option<Vec<HashMap<String, Value>>>,
219
220    /// Additional fields from the API
221    #[serde(flatten)]
222    pub extra: Value,
223}
224
225/// Essentials subscription create request
226#[derive(Debug, Clone, Serialize, Deserialize)]
227#[serde(rename_all = "camelCase")]
228pub struct FixedSubscriptionCreateRequest {
229    /// New Essentials subscription name.
230    pub name: String,
231
232    /// An Essentials plan ID. The plan describes the dataset size, cloud provider and region, and available database configuration options. Use GET /fixed/plans to get a list of available options.
233    pub plan_id: i32,
234
235    /// Optional. The payment method for the subscription. If set to ‘credit-card’, ‘paymentMethodId’ must be defined. Default: 'credit-card'
236    #[serde(skip_serializing_if = "Option::is_none")]
237    pub payment_method: Option<String>,
238
239    /// Optional. A valid payment method ID for this account. Use GET /payment-methods to get a list of all payment methods for your account. This value is optional if ‘paymentMethod’ is ‘marketplace’, but required for all other account types.
240    #[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    /// Additional fields from the API
247    #[serde(flatten)]
248    pub extra: Value,
249}
250
251/// Redis list of Essentials subscriptions in current account
252#[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    /// HATEOAS links
259    #[serde(skip_serializing_if = "Option::is_none")]
260    pub links: Option<Vec<HashMap<String, Value>>>,
261
262    /// Additional fields from the API
263    #[serde(flatten)]
264    pub extra: Value,
265}
266
267/// RedisVersion
268#[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    /// Additional fields from the API
284    #[serde(flatten)]
285    pub extra: Value,
286}
287
288/// Redis Essentials Subscription information
289#[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    /// HATEOAS links
371    #[serde(skip_serializing_if = "Option::is_none")]
372    pub links: Option<Vec<HashMap<String, Value>>>,
373
374    /// Additional fields from the API
375    #[serde(flatten)]
376    pub extra: Value,
377}
378
379/// TaskStateUpdate
380#[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    /// HATEOAS links
402    #[serde(skip_serializing_if = "Option::is_none")]
403    pub links: Option<Vec<HashMap<String, Value>>>,
404
405    /// Additional fields from the API
406    #[serde(flatten)]
407    pub extra: Value,
408}
409
410// ============================================================================
411// Handler
412// ============================================================================
413
414/// Handler for Essentials subscription operations
415///
416/// Manages fixed-capacity subscriptions with pre-defined plans,
417/// simplified pricing, and streamlined configuration options.
418pub struct FixedSubscriptionHandler {
419    client: CloudClient,
420}
421
422impl FixedSubscriptionHandler {
423    /// Create a new handler
424    pub fn new(client: CloudClient) -> Self {
425        Self { client }
426    }
427
428    /// Get Essentials plans
429    /// Gets a list of Essentials plans. The plan describes the dataset size, cloud provider and region, and available database configuration options for an Essentials database.
430    ///
431    /// GET /fixed/plans
432    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    /// Get Essentials plans for a subscription
455    /// Gets a list of compatible Essentials plans for the specified Essentials subscription.
456    ///
457    /// GET /fixed/plans/subscriptions/{subscriptionId}
458    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    /// Get a single Essentials plan
468    /// Gets information on the specified Essentials plan.
469    ///
470    /// GET /fixed/plans/{planId}
471    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    /// Get available Redis database versions for specific Essentials subscription
476    /// Gets a list of all available Redis database versions for a specific Essentials subscription.
477    ///
478    /// GET /fixed/redis-versions
479    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    /// Get Essentials subscriptions
493    /// Gets a list of all Essentials subscriptions in the current account.
494    ///
495    /// GET /fixed/subscriptions
496    pub async fn list(&self) -> Result<FixedSubscriptions> {
497        self.client.get("/fixed/subscriptions").await
498    }
499
500    /// Create Essentials subscription
501    /// Creates a new Essentials subscription.
502    ///
503    /// POST /fixed/subscriptions
504    pub async fn create(
505        &self,
506        request: &FixedSubscriptionCreateRequest,
507    ) -> Result<TaskStateUpdate> {
508        self.client.post("/fixed/subscriptions", request).await
509    }
510
511    /// Delete Essentials subscription
512    /// Deletes the specified Essentials subscription. All databases in the subscription must be deleted before deleting it.
513    ///
514    /// DELETE /fixed/subscriptions/{subscriptionId}
515    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    /// Get a single Essentials subscription
524    /// Gets information on the specified Essentials subscription.
525    ///
526    /// GET /fixed/subscriptions/{subscriptionId}
527    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    /// Update Essentials subscription
534    /// Updates the specified Essentials subscription.
535    ///
536    /// PUT /fixed/subscriptions/{subscriptionId}
537    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    // ========================================================================
551    // Backward compatibility wrapper methods
552    // ========================================================================
553    // NOTE: These methods are deprecated in favor of the shorter, more idiomatic names.
554    // They will be removed in a future version.
555
556    /// Create fixed subscription (backward compatibility)
557    ///
558    /// **Deprecated**: Use [`create`](Self::create) instead
559    #[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    /// Get fixed subscription (backward compatibility)
568    ///
569    /// **Deprecated**: Use [`get_by_id`](Self::get_by_id) instead
570    #[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    /// Update fixed subscription (backward compatibility)
578    ///
579    /// **Deprecated**: Use [`update`](Self::update) instead
580    #[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    /// Delete fixed subscription (backward compatibility)
590    ///
591    /// **Deprecated**: Use [`delete_by_id`](Self::delete_by_id) instead
592    #[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    /// Get all fixed subscriptions plans (backward compatibility)
598    ///
599    /// **Deprecated**: Use [`list_plans`](Self::list_plans) instead
600    #[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    /// Get fixed subscriptions plans by subscription id (backward compatibility)
606    ///
607    /// **Deprecated**: Use [`get_plans_by_subscription_id`](Self::get_plans_by_subscription_id) instead
608    #[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    /// Get fixed subscriptions plan by id (backward compatibility)
617    ///
618    /// **Deprecated**: Use [`get_plan_by_id`](Self::get_plan_by_id) instead
619    #[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    /// Get fixed redis versions (backward compatibility)
628    ///
629    /// **Deprecated**: Use [`get_redis_versions`](Self::get_redis_versions) instead
630    #[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    /// Get all fixed subscriptions (backward compatibility)
636    ///
637    /// **Deprecated**: Use [`list`](Self::list) instead
638    #[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    /// Delete fixed subscription by id (backward compatibility)
644    ///
645    /// **Deprecated**: Use [`delete_by_id`](Self::delete_by_id) instead
646    #[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    /// Get fixed subscription by id (backward compatibility)
655    ///
656    /// **Deprecated**: Use [`get_by_id`](Self::get_by_id) instead
657    #[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}