use super::link::LinkType;
use crate::api::MailchimpApi;
use crate::internal::request::MailchimpResult;
use crate::iter::{BuildIter, MailchimpCollection, ResourceFilter, MalchimpIter};
use std::collections::HashMap;
use super::conversation_messages::{ConversationMessage, MessagesFilter, CollectionConversationMessages, MessagesBuider};
use log::error;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Conversation {
#[serde(default)]
pub id: String,
#[serde(default)]
pub message_count: u64,
#[serde(default)]
pub campaign_id: String,
#[serde(default)]
pub list_id: String,
#[serde(default)]
pub unread_messages: u64,
#[serde(default)]
pub from_label: String,
#[serde(default)]
pub from_email: String,
#[serde(default)]
pub subject: String,
#[serde(default)]
pub last_message: ConversationMessage,
#[serde(default)]
pub _links: Vec<LinkType>,
#[serde(skip)]
_api: MailchimpApi,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ParamMessage {
#[serde(default)]
pub from_email: String,
#[serde(default)]
pub subject: String,
#[serde(default)]
pub message: String,
#[serde(default)]
pub read: bool,
}
impl Conversation {
pub fn create_message(&self, message: ParamMessage) -> MailchimpResult<ConversationMessage> {
let mut endpoint = self.get_base_endpoint();
endpoint.push_str("/messages");
self._api.post::<ConversationMessage, ParamMessage>(&endpoint, message)
}
pub fn get_conversation_messages(
&self,
filter: Option<MessagesFilter>,
) -> MalchimpIter<MessagesBuider> {
let mut endpoint = self.get_base_endpoint();
endpoint.push_str("/messages");
let mut filter_params = MessagesFilter::default();
if let Some(f) = filter {
filter_params = f;
}
match self
._api
.get::<CollectionConversationMessages>(&endpoint, filter_params.build_payload())
{
Ok(collection) => MalchimpIter {
builder: MessagesBuider {},
data: collection.conversation_messages,
cur_filters: filter_params.clone(),
cur_it: 0,
total_items: collection.total_items,
api: self._api.clone(),
endpoint: endpoint.to_string(),
},
Err(e) => {
error!( target: "mailchimp", "Get Activities: Response Error details: {:?}", e);
MalchimpIter {
builder: MessagesBuider {},
data: Vec::new(),
cur_filters: filter_params.clone(),
cur_it: 0,
total_items: 0,
api: self._api.clone(),
endpoint: endpoint.to_string(),
}
}
}
}
pub fn get_conversation_message<'a>(&self, message_id: &'a str) -> MailchimpResult<ConversationMessage> {
let mut endpoint = self.get_base_endpoint();
endpoint.push_str("/messages/");
endpoint.push_str(message_id);
let mut payload = HashMap::new();
payload.insert("message_id".to_string(), message_id.to_string());
self._api.get::<ConversationMessage>(&endpoint, payload)
}
pub fn set_api(&mut self, n_api: &MailchimpApi) {
self._api = n_api.clone();
}
fn get_base_endpoint(&self) -> String {
let mut endpoint = "conversations/".to_string();
endpoint.push_str(&self.id);
endpoint
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct CollectionConversations {
#[serde(default)]
pub conversations: Vec<Conversation>,
#[serde(default)]
pub total_items: u64,
#[serde(default)]
pub _links: Vec<LinkType>,
}
impl MailchimpCollection<Conversation> for CollectionConversations {
fn get_total_items(&self) -> u64 {
self.total_items
}
fn get_values(&self) -> Vec<Conversation> {
self.conversations.clone()
}
}
impl Default for CollectionConversations {
fn default() -> Self {
CollectionConversations {
conversations: Vec::new(),
total_items: 0,
_links: Vec::new(),
}
}
}
#[derive(Debug, Clone)]
pub struct ConversationsFilter {
pub fields: Option<String>,
pub exclude_fields: Option<String>,
pub count: Option<u64>,
pub offset: Option<u64>,
pub has_unread_messages: Option<String>,
pub list_id: Option<String>,
pub campaign_id: Option<u64>,
}
impl Default for ConversationsFilter {
fn default() -> Self {
ConversationsFilter {
fields: None,
exclude_fields: None,
count: Some(50),
offset: Some(0),
has_unread_messages: None,
list_id: None,
campaign_id: None,
}
}
}
impl ResourceFilter for ConversationsFilter {
fn build_payload(&self) -> HashMap<String, String> {
let mut payload = HashMap::new();
if self.fields.is_some() {
payload.insert("fields".to_string(), self.fields.as_ref().unwrap().clone());
}
if self.exclude_fields.is_some() {
payload.insert(
"exclude_fields".to_string(),
self.exclude_fields.as_ref().unwrap().clone(),
);
}
if self.count.is_some() {
payload.insert(
"count".to_string(),
format!("{:}", self.count.as_ref().unwrap().clone()),
);
}
if self.offset.is_some() {
payload.insert(
"offset".to_string(),
format!("{:}", self.offset.as_ref().unwrap().clone()),
);
}
if self.has_unread_messages.is_some() {
payload.insert(
"has_unread_messages".to_string(),
format!("{:}", self.has_unread_messages.as_ref().unwrap().clone()),
);
}
if self.list_id.is_some() {
payload.insert(
"list_id".to_string(),
format!("{:}", self.list_id.as_ref().unwrap().clone()),
);
}
if self.campaign_id.is_some() {
payload.insert(
"campaign_id".to_string(),
format!("{:}", self.campaign_id.as_ref().unwrap().clone()),
);
}
payload
}
}
#[derive(Debug)]
pub struct ConversationBuilder {}
impl BuildIter for ConversationBuilder {
type Item = Conversation;
type FilterItem = ConversationsFilter;
type Collection = CollectionConversations;
fn update_item(&self, data: &Self::Item, api: &MailchimpApi) -> Self::Item {
let mut in_data = data.clone();
in_data.set_api(&api);
in_data
}
fn update_filter_offset(&self, filter: &Self::FilterItem) -> Self::FilterItem {
let mut f = filter.clone();
f.offset = Some(f.count.unwrap() + f.offset.unwrap());
f
}
}