use crate::client::Client;
use crate::error::Result;
use serde::{Deserialize, Serialize};
pub struct BlockApi {
client: Client,
}
impl BlockApi {
pub(crate) fn new(client: Client) -> Self {
Self { client }
}
pub async fn block_user(&self, user_phone_number: &str) -> Result<BlockResponse> {
let body = BlockUserRequest {
messaging_product: "whatsapp".to_string(),
block: vec![UserToBlock {
user: user_phone_number.to_string(),
}],
};
let url = format!("{}/block", self.client.base_url());
self.client.post(&url, &body).await
}
pub async fn block_users(&self, user_phone_numbers: Vec<&str>) -> Result<BlockResponse> {
let body = BlockUserRequest {
messaging_product: "whatsapp".to_string(),
block: user_phone_numbers
.into_iter()
.map(|u| UserToBlock {
user: u.to_string(),
})
.collect(),
};
let url = format!("{}/block", self.client.base_url());
self.client.post(&url, &body).await
}
pub async fn unblock_user(&self, user_phone_number: &str) -> Result<BlockResponse> {
let body = UnblockUserRequest {
messaging_product: "whatsapp".to_string(),
unblock: vec![UserToBlock {
user: user_phone_number.to_string(),
}],
};
let url = format!("{}/block", self.client.base_url());
self.client.post(&url, &body).await
}
pub async fn unblock_users(&self, user_phone_numbers: Vec<&str>) -> Result<BlockResponse> {
let body = UnblockUserRequest {
messaging_product: "whatsapp".to_string(),
unblock: user_phone_numbers
.into_iter()
.map(|u| UserToBlock {
user: u.to_string(),
})
.collect(),
};
let url = format!("{}/block", self.client.base_url());
self.client.post(&url, &body).await
}
pub async fn get_blocked_users(&self) -> Result<BlockedUsersResponse> {
let url = format!("{}/block", self.client.base_url());
self.client.get(&url).await
}
}
#[derive(Debug, Serialize)]
struct BlockUserRequest {
messaging_product: String,
block: Vec<UserToBlock>,
}
#[derive(Debug, Serialize)]
struct UnblockUserRequest {
messaging_product: String,
unblock: Vec<UserToBlock>,
}
#[derive(Debug, Serialize)]
struct UserToBlock {
user: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BlockResponse {
#[serde(default)]
pub data: Vec<BlockResult>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BlockResult {
pub input: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub wa_id: Option<String>,
pub success: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BlockedUsersResponse {
#[serde(default)]
pub data: Vec<BlockedUser>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BlockedUser {
pub wa_id: String,
}