use crate::types::{Link, ProcessorResponse};
use crate::{CloudClient, Result};
use serde::{Deserialize, Serialize};
use typed_builder::TypedBuilder;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RedisVersions {
#[serde(skip_serializing_if = "Option::is_none")]
pub redis_versions: Option<Vec<RedisVersion>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FixedSubscriptionsPlans {
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TypedBuilder)]
#[serde(rename_all = "camelCase")]
pub struct FixedSubscriptionUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub subscription_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub plan_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub payment_method: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub payment_method_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FixedSubscriptionsPlan {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dataset_size: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size_measurement_unit: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub provider: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub price: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub price_currency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub price_period: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub maximum_databases: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub maximum_throughput: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub maximum_bandwidth_gb: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub availability: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub connections: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cidr_allow_rules: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub support_data_persistence: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub redis_flex: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub support_instant_and_daily_backups: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub support_replication: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub support_clustering: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub support_ssl: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub supported_alerts: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub customer_support: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TypedBuilder)]
#[serde(rename_all = "camelCase")]
pub struct FixedSubscriptionCreateRequest {
#[builder(setter(into))]
pub name: String,
pub plan_id: i32,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub payment_method: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub payment_method_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FixedSubscriptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub account_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subscriptions: Option<Vec<FixedSubscription>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RedisVersion {
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub eol_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_preview: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_default: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FixedSubscription {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payment_method_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payment_method_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub plan_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub plan_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub plan_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size_measurement_unit: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub provider: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub price: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub price_period: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub price_currency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub maximum_databases: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub availability: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub connections: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cidr_allow_rules: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub support_data_persistence: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub support_instant_and_daily_backups: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub support_replication: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub support_clustering: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub customer_support: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub creation_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub database_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TaskStateUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
pub task_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timestamp: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response: Option<ProcessorResponse>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
pub struct FixedSubscriptionHandler {
client: CloudClient,
}
impl FixedSubscriptionHandler {
#[must_use]
pub fn new(client: CloudClient) -> Self {
Self { client }
}
pub async fn list_plans(
&self,
provider: Option<String>,
redis_flex: Option<bool>,
) -> Result<FixedSubscriptionsPlans> {
let mut query = Vec::new();
if let Some(v) = provider {
query.push(format!("provider={v}"));
}
if let Some(v) = redis_flex {
query.push(format!("redisFlex={v}"));
}
let query_string = if query.is_empty() {
String::new()
} else {
format!("?{}", query.join("&"))
};
self.client
.get(&format!("/fixed/plans{query_string}"))
.await
}
pub async fn get_plans_by_subscription_id(
&self,
subscription_id: i32,
) -> Result<FixedSubscriptionsPlans> {
self.client
.get(&format!("/fixed/plans/subscriptions/{subscription_id}"))
.await
}
pub async fn get_plan_by_id(&self, plan_id: i32) -> Result<FixedSubscriptionsPlan> {
self.client.get(&format!("/fixed/plans/{plan_id}")).await
}
pub async fn get_redis_versions(&self, subscription_id: i32) -> Result<RedisVersions> {
let mut query = Vec::new();
query.push(format!("subscriptionId={subscription_id}"));
let query_string = if query.is_empty() {
String::new()
} else {
format!("?{}", query.join("&"))
};
self.client
.get(&format!("/fixed/redis-versions{query_string}"))
.await
}
pub async fn list(&self) -> Result<FixedSubscriptions> {
self.client.get("/fixed/subscriptions").await
}
pub async fn create(
&self,
request: &FixedSubscriptionCreateRequest,
) -> Result<TaskStateUpdate> {
self.client.post("/fixed/subscriptions", request).await
}
pub async fn delete_by_id(&self, subscription_id: i32) -> Result<TaskStateUpdate> {
let response = self
.client
.delete_raw(&format!("/fixed/subscriptions/{subscription_id}"))
.await?;
serde_json::from_value(response).map_err(Into::into)
}
pub async fn get_by_id(&self, subscription_id: i32) -> Result<FixedSubscription> {
self.client
.get(&format!("/fixed/subscriptions/{subscription_id}"))
.await
}
pub async fn update(
&self,
subscription_id: i32,
request: &FixedSubscriptionUpdateRequest,
) -> Result<TaskStateUpdate> {
self.client
.put(&format!("/fixed/subscriptions/{subscription_id}"), request)
.await
}
}