1use super::conversation_messages::{
5 CollectionConversationMessages, ConversationMessage, MessagesBuider, MessagesFilter,
6};
7use serde::{Deserialize, Serialize};
8use std::rc::Rc;
9
10use super::link::LinkType;
11use crate::api::MailchimpApi;
12use crate::internal::request::MailchimpResult;
13use crate::iter::{BuildIter, MailchimpCollection, MalchimpIter, ResourceFilter};
14use log::error;
15use std::collections::HashMap;
16
17#[derive(Serialize, Deserialize, Debug, Clone)]
22pub struct Conversation {
23 #[serde(default)]
25 pub id: String,
26 #[serde(default)]
28 pub message_count: u64,
29 #[serde(default)]
31 pub campaign_id: String,
32 #[serde(default)]
34 pub list_id: String,
35 #[serde(default)]
37 pub unread_messages: u64,
38 #[serde(default)]
40 pub from_label: String,
41 #[serde(default)]
43 pub from_email: String,
44 #[serde(default)]
46 pub subject: String,
47 #[serde(default)]
49 pub last_message: ConversationMessage,
50 #[serde(default)]
52 pub _links: Vec<LinkType>,
53
54 #[serde(skip)]
56 _api: Rc<MailchimpApi>,
57}
58
59#[derive(Serialize, Deserialize, Debug, Clone)]
63pub struct ParamMessage {
64 #[serde(default)]
66 pub from_email: String,
67 #[serde(default)]
69 pub subject: String,
70 #[serde(default)]
72 pub message: String,
73 #[serde(default)]
75 pub read: bool,
76}
77
78impl Conversation {
79 pub fn create_message(&self, message: ParamMessage) -> MailchimpResult<ConversationMessage> {
83 let mut endpoint = self.get_base_endpoint();
85 endpoint.push_str("/messages");
86 self._api
87 .post::<ConversationMessage, ParamMessage>(&endpoint, message)
88 }
89
90 pub fn get_conversation_messages(
94 &self,
95 filter: Option<MessagesFilter>,
96 ) -> MalchimpIter<MessagesBuider> {
97 let mut endpoint = self.get_base_endpoint();
99 endpoint.push_str("/messages");
100
101 let mut filter_params = MessagesFilter::default();
102
103 if let Some(f) = filter {
104 filter_params = f;
105 }
106
107 match self
108 ._api
109 .get::<CollectionConversationMessages>(&endpoint, filter_params.build_payload())
110 {
111 Ok(collection) => MalchimpIter {
112 builder: MessagesBuider {},
113 data: collection.conversation_messages,
114 cur_filters: filter_params.clone(),
115 cur_it: 0,
116 total_items: collection.total_items,
117 api: self._api.clone(),
118 endpoint: endpoint.to_string(),
119 },
120 Err(e) => {
121 error!( target: "mailchimp", "Get Activities: Response Error details: {:?}", e);
122 MalchimpIter {
123 builder: MessagesBuider {},
124 data: Vec::new(),
125 cur_filters: filter_params.clone(),
126 cur_it: 0,
127 total_items: 0,
128 api: self._api.clone(),
129 endpoint: endpoint.to_string(),
130 }
131 }
132 }
133 }
134
135 pub fn get_conversation_message<'a>(
139 &self,
140 message_id: &'a str,
141 ) -> MailchimpResult<ConversationMessage> {
142 let mut endpoint = self.get_base_endpoint();
143 endpoint.push_str("/messages/");
144 endpoint.push_str(message_id);
145
146 let mut payload = HashMap::new();
147 payload.insert("message_id".to_string(), message_id.to_string());
148 self._api.get::<ConversationMessage>(&endpoint, payload)
149 }
150 pub fn set_api(&mut self, n_api: Rc<MailchimpApi>) {
154 self._api = n_api;
155 }
156
157 fn get_base_endpoint(&self) -> String {
158 let mut endpoint = "conversations/".to_string();
159 endpoint.push_str(&self.id);
160 endpoint
161 }
162}
163
164#[derive(Serialize, Deserialize, Debug, Clone)]
168pub struct CollectionConversations {
169 #[serde(default)]
171 pub conversations: Vec<Conversation>,
172 #[serde(default)]
174 pub total_items: u64,
175 #[serde(default)]
177 pub _links: Vec<LinkType>,
178}
179
180impl MailchimpCollection<Conversation> for CollectionConversations {
181 fn get_total_items(&self) -> u64 {
183 self.total_items
184 }
185
186 fn get_values(&self) -> Vec<Conversation> {
188 self.conversations.clone()
189 }
190}
191
192impl Default for CollectionConversations {
193 fn default() -> Self {
194 CollectionConversations {
195 conversations: Vec::new(),
196 total_items: 0,
197 _links: Vec::new(),
198 }
199 }
200}
201
202#[derive(Debug, Clone)]
206pub struct ConversationsFilter {
207 pub fields: Option<String>,
210 pub exclude_fields: Option<String>,
213 pub count: Option<u64>,
215 pub offset: Option<u64>,
218 pub has_unread_messages: Option<String>,
220 pub list_id: Option<String>,
222 pub campaign_id: Option<u64>,
224}
225
226impl Default for ConversationsFilter {
227 fn default() -> Self {
228 ConversationsFilter {
229 fields: None,
230 exclude_fields: None,
231 count: Some(50),
232 offset: Some(0),
233 has_unread_messages: None,
234 list_id: None,
235 campaign_id: None,
236 }
237 }
238}
239
240impl ResourceFilter for ConversationsFilter {
241 fn build_payload(&self) -> HashMap<String, String> {
242 let mut payload = HashMap::new();
243
244 if self.fields.is_some() {
245 payload.insert("fields".to_string(), self.fields.as_ref().unwrap().clone());
246 }
247 if self.exclude_fields.is_some() {
248 payload.insert(
249 "exclude_fields".to_string(),
250 self.exclude_fields.as_ref().unwrap().clone(),
251 );
252 }
253 if self.count.is_some() {
254 payload.insert(
255 "count".to_string(),
256 format!("{:}", self.count.as_ref().unwrap().clone()),
257 );
258 }
259 if self.offset.is_some() {
260 payload.insert(
261 "offset".to_string(),
262 format!("{:}", self.offset.as_ref().unwrap().clone()),
263 );
264 }
265
266 if self.has_unread_messages.is_some() {
267 payload.insert(
268 "has_unread_messages".to_string(),
269 format!("{:}", self.has_unread_messages.as_ref().unwrap().clone()),
270 );
271 }
272 if self.list_id.is_some() {
273 payload.insert(
274 "list_id".to_string(),
275 format!("{:}", self.list_id.as_ref().unwrap().clone()),
276 );
277 }
278 if self.campaign_id.is_some() {
279 payload.insert(
280 "campaign_id".to_string(),
281 format!("{:}", self.campaign_id.as_ref().unwrap().clone()),
282 );
283 }
284 payload
285 }
286}
287
288#[derive(Debug)]
292pub struct ConversationBuilder {}
293
294impl BuildIter for ConversationBuilder {
295 type Item = Conversation;
296 type FilterItem = ConversationsFilter;
297 type Collection = CollectionConversations;
298
299 fn update_item(&self, data: &Self::Item, api: Rc<MailchimpApi>) -> Self::Item {
303 let mut in_data = data.clone();
304 in_data.set_api(api);
305 in_data
306 }
307 fn update_filter_offset(&self, filter: &Self::FilterItem) -> Self::FilterItem {
311 let mut f = filter.clone();
312 f.offset = Some(f.count.unwrap() + f.offset.unwrap());
313 f
314 }
315}