use crate::error::{CoreError, Result};
use crate::progress::{ProgressCallback, poll_task};
use redis_cloud::databases::{
Database, DatabaseBackupRequest, DatabaseCreateRequest, DatabaseImportRequest,
DatabaseUpdateRequest,
};
use redis_cloud::subscriptions::{
BaseSubscriptionUpdateRequest, Subscription, SubscriptionCreateRequest,
};
use redis_cloud::{CloudClient, DatabaseHandler, SubscriptionHandler};
use std::time::Duration;
pub async fn create_database_and_wait(
client: &CloudClient,
subscription_id: i32,
request: &DatabaseCreateRequest,
timeout: Duration,
on_progress: Option<ProgressCallback>,
) -> Result<Database> {
let handler = DatabaseHandler::new(client.clone());
let task = handler.create(subscription_id, request).await?;
let task_id = task
.task_id
.ok_or_else(|| CoreError::TaskFailed("No task ID returned".to_string()))?;
let completed = poll_task(
client,
&task_id,
timeout,
Duration::from_secs(10),
on_progress,
)
.await?;
let resource_id = completed
.response
.and_then(|r| r.resource_id)
.ok_or_else(|| CoreError::TaskFailed("No resource ID in completed task".to_string()))?;
let db = handler.get(subscription_id, resource_id as i32).await?;
Ok(db)
}
pub async fn delete_database_and_wait(
client: &CloudClient,
subscription_id: i32,
database_id: i32,
timeout: Duration,
on_progress: Option<ProgressCallback>,
) -> Result<()> {
let handler = DatabaseHandler::new(client.clone());
let task = handler.delete(subscription_id, database_id).await?;
let task_id = task
.task_id
.ok_or_else(|| CoreError::TaskFailed("No task ID returned".to_string()))?;
poll_task(
client,
&task_id,
timeout,
Duration::from_secs(10),
on_progress,
)
.await?;
Ok(())
}
pub async fn update_database_and_wait(
client: &CloudClient,
subscription_id: i32,
database_id: i32,
request: &DatabaseUpdateRequest,
timeout: Duration,
on_progress: Option<ProgressCallback>,
) -> Result<Database> {
let handler = DatabaseHandler::new(client.clone());
let task = handler
.update(subscription_id, database_id, request)
.await?;
let task_id = task
.task_id
.ok_or_else(|| CoreError::TaskFailed("No task ID returned".to_string()))?;
poll_task(
client,
&task_id,
timeout,
Duration::from_secs(10),
on_progress,
)
.await?;
let db = handler.get(subscription_id, database_id).await?;
Ok(db)
}
pub async fn backup_database_and_wait(
client: &CloudClient,
subscription_id: i32,
database_id: i32,
region_name: Option<&str>,
timeout: Duration,
on_progress: Option<ProgressCallback>,
) -> Result<()> {
let handler = DatabaseHandler::new(client.clone());
let request = if let Some(region) = region_name {
DatabaseBackupRequest::builder().region_name(region).build()
} else {
DatabaseBackupRequest::builder().build()
};
let task = handler
.backup_database(subscription_id, database_id, &request)
.await?;
let task_id = task
.task_id
.ok_or_else(|| CoreError::TaskFailed("No task ID returned".to_string()))?;
poll_task(
client,
&task_id,
timeout,
Duration::from_secs(10),
on_progress,
)
.await?;
Ok(())
}
pub async fn import_database_and_wait(
client: &CloudClient,
subscription_id: i32,
database_id: i32,
request: &DatabaseImportRequest,
timeout: Duration,
on_progress: Option<ProgressCallback>,
) -> Result<()> {
let handler = DatabaseHandler::new(client.clone());
let task = handler
.import_database(subscription_id, database_id, request)
.await?;
let task_id = task
.task_id
.ok_or_else(|| CoreError::TaskFailed("No task ID returned".to_string()))?;
poll_task(
client,
&task_id,
timeout,
Duration::from_secs(10),
on_progress,
)
.await?;
Ok(())
}
pub async fn flush_database_and_wait(
client: &CloudClient,
subscription_id: i32,
database_id: i32,
timeout: Duration,
on_progress: Option<ProgressCallback>,
) -> Result<()> {
let handler = DatabaseHandler::new(client.clone());
let task = handler.flush_database(subscription_id, database_id).await?;
let task_id = task
.task_id
.ok_or_else(|| CoreError::TaskFailed("No task ID returned".to_string()))?;
poll_task(
client,
&task_id,
timeout,
Duration::from_secs(5),
on_progress,
)
.await?;
Ok(())
}
pub async fn create_subscription_and_wait(
client: &CloudClient,
request: &SubscriptionCreateRequest,
timeout: Duration,
on_progress: Option<ProgressCallback>,
) -> Result<Subscription> {
let handler = SubscriptionHandler::new(client.clone());
let task = handler.create_subscription(request).await?;
let task_id = task
.task_id
.ok_or_else(|| CoreError::TaskFailed("No task ID returned".to_string()))?;
let completed = poll_task(
client,
&task_id,
timeout,
Duration::from_secs(15), on_progress,
)
.await?;
let resource_id = completed
.response
.and_then(|r| r.resource_id)
.ok_or_else(|| CoreError::TaskFailed("No resource ID in completed task".to_string()))?;
let subscription = handler.get_subscription_by_id(resource_id).await?;
Ok(subscription)
}
pub async fn update_subscription_and_wait(
client: &CloudClient,
subscription_id: i32,
request: &BaseSubscriptionUpdateRequest,
timeout: Duration,
on_progress: Option<ProgressCallback>,
) -> Result<Subscription> {
let handler = SubscriptionHandler::new(client.clone());
let task = handler
.update_subscription(subscription_id, request)
.await?;
let task_id = task
.task_id
.ok_or_else(|| CoreError::TaskFailed("No task ID returned".to_string()))?;
poll_task(
client,
&task_id,
timeout,
Duration::from_secs(10),
on_progress,
)
.await?;
let subscription = handler.get_subscription_by_id(subscription_id).await?;
Ok(subscription)
}
pub async fn delete_subscription_and_wait(
client: &CloudClient,
subscription_id: i32,
timeout: Duration,
on_progress: Option<ProgressCallback>,
) -> Result<()> {
let handler = SubscriptionHandler::new(client.clone());
let task = handler.delete_subscription_by_id(subscription_id).await?;
let task_id = task
.task_id
.ok_or_else(|| CoreError::TaskFailed("No task ID returned".to_string()))?;
poll_task(
client,
&task_id,
timeout,
Duration::from_secs(10),
on_progress,
)
.await?;
Ok(())
}