use crate::types::{Link, ProcessorResponse};
use crate::{CloudClient, Result};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AclRoleCreateRequest {
pub name: String,
pub redis_rules: Vec<AclRoleRedisRuleSpec>,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AclUserUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountACLUsers {
#[serde(skip_serializing_if = "Option::is_none")]
pub account_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub users: Option<Vec<ACLUser>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountACLRedisRules {
#[serde(skip_serializing_if = "Option::is_none")]
pub account_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub redis_rules: Option<Vec<ACLRedisRule>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ACLRedisRule {
#[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 acl: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_default: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AclRedisRuleCreateRequest {
pub name: String,
pub redis_rule: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountACLRoles {
#[serde(skip_serializing_if = "Option::is_none")]
pub account_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub roles: Option<Vec<ACLRole>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ACLRole {
#[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 redis_rules: Option<Vec<ACLRoleRedisRule>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub users: Option<Vec<ACLRoleUser>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ACLRoleUser {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ACLRoleRedisRule {
#[serde(skip_serializing_if = "Option::is_none")]
pub rule_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rule_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub databases: Option<Vec<ACLRoleDatabase>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ACLRoleDatabase {
#[serde(skip_serializing_if = "Option::is_none")]
pub subscription_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub database_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub database_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub regions: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AclRedisRuleUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub redis_rule_id: Option<i32>,
pub name: String,
pub redis_rule: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AclRoleDatabaseSpec {
pub subscription_id: i32,
pub database_id: i32,
#[serde(skip_serializing_if = "Option::is_none")]
pub regions: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AclUserCreateRequest {
pub name: String,
pub role: String,
pub password: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ACLUser {
#[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 role: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub 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 AclRoleUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub redis_rules: Option<Vec<AclRoleRedisRuleSpec>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub role_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AclRoleRedisRuleSpec {
pub rule_name: String,
pub databases: Vec<AclRoleDatabaseSpec>,
}
#[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 AclHandler {
client: CloudClient,
}
impl AclHandler {
#[must_use]
pub fn new(client: CloudClient) -> Self {
Self { client }
}
pub async fn get_all_redis_rules(&self) -> Result<AccountACLRedisRules> {
self.client.get("/acl/redisRules").await
}
pub async fn create_redis_rule(
&self,
request: &AclRedisRuleCreateRequest,
) -> Result<TaskStateUpdate> {
self.client.post("/acl/redisRules", request).await
}
pub async fn delete_redis_rule(&self, acl_redis_rule_id: i32) -> Result<TaskStateUpdate> {
let response = self
.client
.delete_raw(&format!("/acl/redisRules/{acl_redis_rule_id}"))
.await?;
serde_json::from_value(response).map_err(Into::into)
}
pub async fn update_redis_rule(
&self,
acl_redis_rule_id: i32,
request: &AclRedisRuleUpdateRequest,
) -> Result<TaskStateUpdate> {
self.client
.put(&format!("/acl/redisRules/{acl_redis_rule_id}"), request)
.await
}
pub async fn get_roles(&self) -> Result<AccountACLRoles> {
self.client.get("/acl/roles").await
}
pub async fn create_role(&self, request: &AclRoleCreateRequest) -> Result<TaskStateUpdate> {
self.client.post("/acl/roles", request).await
}
pub async fn delete_acl_role(&self, acl_role_id: i32) -> Result<TaskStateUpdate> {
let response = self
.client
.delete_raw(&format!("/acl/roles/{acl_role_id}"))
.await?;
serde_json::from_value(response).map_err(Into::into)
}
pub async fn update_role(
&self,
acl_role_id: i32,
request: &AclRoleUpdateRequest,
) -> Result<TaskStateUpdate> {
self.client
.put(&format!("/acl/roles/{acl_role_id}"), request)
.await
}
pub async fn get_all_acl_users(&self) -> Result<AccountACLUsers> {
self.client.get("/acl/users").await
}
pub async fn create_user(&self, request: &AclUserCreateRequest) -> Result<TaskStateUpdate> {
self.client.post("/acl/users", request).await
}
pub async fn delete_user(&self, acl_user_id: i32) -> Result<TaskStateUpdate> {
let response = self
.client
.delete_raw(&format!("/acl/users/{acl_user_id}"))
.await?;
serde_json::from_value(response).map_err(Into::into)
}
pub async fn get_user_by_id(&self, acl_user_id: i32) -> Result<ACLUser> {
self.client.get(&format!("/acl/users/{acl_user_id}")).await
}
pub async fn update_acl_user(
&self,
acl_user_id: i32,
request: &AclUserUpdateRequest,
) -> Result<TaskStateUpdate> {
self.client
.put(&format!("/acl/users/{acl_user_id}"), request)
.await
}
}