use crate::client::Client;
use crate::error::Result;
use serde::{Deserialize, Serialize};
pub struct WebhookSubscriptionsApi {
client: Client,
app_id: String,
}
impl WebhookSubscriptionsApi {
pub(crate) fn new(client: Client, app_id: String) -> Self {
Self { client, app_id }
}
pub async fn get(&self) -> Result<WebhookSubscriptionsResponse> {
let url = self.client.endpoint_url(&format!("{}/subscriptions", self.app_id));
self.client.get(&url).await
}
pub async fn subscribe(
&self,
callback_url: &str,
verify_token: &str,
fields: Vec<SubscriptionField>,
) -> Result<crate::types::SuccessResponse> {
let body = SubscribeWebhookRequest {
object: "whatsapp_business_account".to_string(),
callback_url: callback_url.to_string(),
verify_token: verify_token.to_string(),
fields: fields.iter().map(|f| f.as_str().to_string()).collect(),
};
let url = self.client.endpoint_url(&format!("{}/subscriptions", self.app_id));
self.client.post(&url, &body).await
}
pub async fn unsubscribe(&self, object: &str) -> Result<crate::types::SuccessResponse> {
let url = self.client.endpoint_url(&format!(
"{}/subscriptions?object={}",
self.app_id, object
));
self.client.delete(&url).await
}
pub async fn unsubscribe_all(&self) -> Result<crate::types::SuccessResponse> {
let url = self.client.endpoint_url(&format!("{}/subscriptions", self.app_id));
self.client.delete(&url).await
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SubscriptionField {
Messages,
MessageTemplateStatusUpdate,
MessageTemplateQualityUpdate,
AccountAlerts,
AccountReviewUpdate,
AccountUpdate,
BusinessCapabilityUpdate,
PhoneNumberNameUpdate,
PhoneNumberQualityUpdate,
Security,
Flows,
}
impl SubscriptionField {
fn as_str(&self) -> &'static str {
match self {
SubscriptionField::Messages => "messages",
SubscriptionField::MessageTemplateStatusUpdate => "message_template_status_update",
SubscriptionField::MessageTemplateQualityUpdate => "message_template_quality_update",
SubscriptionField::AccountAlerts => "account_alerts",
SubscriptionField::AccountReviewUpdate => "account_review_update",
SubscriptionField::AccountUpdate => "account_update",
SubscriptionField::BusinessCapabilityUpdate => "business_capability_update",
SubscriptionField::PhoneNumberNameUpdate => "phone_number_name_update",
SubscriptionField::PhoneNumberQualityUpdate => "phone_number_quality_update",
SubscriptionField::Security => "security",
SubscriptionField::Flows => "flows",
}
}
}
#[derive(Debug, Serialize)]
struct SubscribeWebhookRequest {
object: String,
callback_url: String,
verify_token: String,
fields: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebhookSubscriptionsResponse {
pub data: Vec<WebhookSubscription>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebhookSubscription {
pub object: String,
pub callback_url: String,
pub active: bool,
#[serde(default)]
pub fields: Vec<SubscribedField>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SubscribedField {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}