use std::sync::Arc;
use crate::client::BaseClient;
use crate::collection::Collection;
use crate::error::Error;
use crate::types::{
CreateSubscriberParams, ListSubscribersParams, Subscriber, UpdateSubscriberParams,
};
pub struct SubscriberService {
pub(crate) client: Arc<BaseClient>,
}
impl SubscriberService {
pub async fn create(
&self,
audience_id: &str,
params: CreateSubscriberParams,
) -> Result<Subscriber, Error> {
let path = format!(
"/v2/audiences/{}/subscribers",
urlencoding::encode(audience_id)
);
self.client
.request("POST", &path, to_body(¶ms), None)
.await
}
pub async fn get(&self, audience_id: &str, id: &str) -> Result<Subscriber, Error> {
let path = format!(
"/v2/audiences/{}/subscribers/{}",
urlencoding::encode(audience_id),
urlencoding::encode(id)
);
self.client.request("GET", &path, None, None).await
}
pub async fn update(
&self,
audience_id: &str,
id: &str,
params: UpdateSubscriberParams,
) -> Result<Subscriber, Error> {
let path = format!(
"/v2/audiences/{}/subscribers/{}",
urlencoding::encode(audience_id),
urlencoding::encode(id)
);
self.client
.request("POST", &path, to_body(¶ms), None)
.await
}
pub async fn list(
&self,
audience_id: &str,
params: Option<ListSubscribersParams>,
) -> Result<Collection<Subscriber>, Error> {
let path = format!(
"/v2/audiences/{}/subscribers",
urlencoding::encode(audience_id)
);
let query = params.map(|p| {
let mut q = Vec::new();
if let Some(page) = p.page {
q.push(("page", page.to_string()));
}
if let Some(limit) = p.limit {
q.push(("limit", limit.to_string()));
}
if let Some(subscribed) = p.subscribed {
q.push(("subscribed", subscribed.to_string()));
}
q
});
self.client
.request::<Collection<Subscriber>>("GET", &path, None, query.as_deref())
.await
}
pub async fn delete(&self, audience_id: &str, id: &str) -> Result<Subscriber, Error> {
let path = format!(
"/v2/audiences/{}/subscribers/{}",
urlencoding::encode(audience_id),
urlencoding::encode(id)
);
self.client.request("DELETE", &path, None, None).await
}
}
fn to_body(v: &impl serde::Serialize) -> Option<serde_json::Value> {
serde_json::to_value(v).ok()
}