diff --git a/kordophone/src/api/http_client.rs b/kordophone/src/api/http_client.rs index 46bf197..ec1c186 100644 --- a/kordophone/src/api/http_client.rs +++ b/kordophone/src/api/http_client.rs @@ -10,7 +10,7 @@ use async_trait::async_trait; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use crate::{ - model::{Conversation, ConversationID, JwtToken, Message}, + model::{Conversation, ConversationID, JwtToken, Message, MessageID}, APIInterface }; @@ -118,8 +118,27 @@ impl APIInterface for HTTPAPIClient { Ok(token) } - async fn get_messages(&mut self, conversation_id: &ConversationID) -> Result, Self::Error> { - let endpoint = format!("messages?guid={}", conversation_id); + async fn get_messages( + &mut self, + conversation_id: &ConversationID, + limit: Option, + before: Option, + after: Option, + ) -> Result, Self::Error> { + let mut endpoint = format!("messages?guid={}", conversation_id); + + if let Some(limit_val) = limit { + endpoint.push_str(&format!("&limit={}", limit_val)); + } + + if let Some(before_id) = before { + endpoint.push_str(&format!("&beforeMessageGUID={}", before_id)); + } + + if let Some(after_id) = after { + endpoint.push_str(&format!("&afterMessageGUID={}", after_id)); + } + let messages: Vec = self.request(&endpoint, Method::GET).await?; Ok(messages) } @@ -288,7 +307,7 @@ mod test { let mut client = local_mock_client(); let conversations = client.get_conversations().await.unwrap(); let conversation = conversations.first().unwrap(); - let messages = client.get_messages(&conversation.guid).await.unwrap(); + let messages = client.get_messages(&conversation.guid, None, None, None).await.unwrap(); assert!(!messages.is_empty()); } } diff --git a/kordophone/src/api/mod.rs b/kordophone/src/api/mod.rs index de7a8cd..6ae0243 100644 --- a/kordophone/src/api/mod.rs +++ b/kordophone/src/api/mod.rs @@ -1,6 +1,6 @@ use async_trait::async_trait; pub use crate::model::{ - Conversation, Message, ConversationID + Conversation, Message, ConversationID, MessageID, }; use crate::model::JwtToken; @@ -20,7 +20,13 @@ pub trait APIInterface { async fn get_conversations(&mut self) -> Result, Self::Error>; // (GET) /messages - async fn get_messages(&mut self, conversation_id: &ConversationID) -> Result, Self::Error>; + async fn get_messages( + &mut self, + conversation_id: &ConversationID, + limit: Option, + before: Option, + after: Option, + ) -> Result, Self::Error>; // (POST) /authenticate async fn authenticate(&mut self, credentials: Credentials) -> Result; diff --git a/kordophone/src/model/message.rs b/kordophone/src/model/message.rs index 1420536..d226604 100644 --- a/kordophone/src/model/message.rs +++ b/kordophone/src/model/message.rs @@ -2,6 +2,10 @@ use serde::Deserialize; use time::OffsetDateTime; use uuid::Uuid; +use super::Identifiable; + +pub type MessageID = ::ID; + #[derive(Debug, Clone, Deserialize)] pub struct Message { pub guid: String, @@ -22,6 +26,14 @@ impl Message { } } +impl Identifiable for Message { + type ID = String; + + fn id(&self) -> &Self::ID { + &self.guid + } +} + #[derive(Default)] pub struct MessageBuilder { guid: Option, diff --git a/kordophone/src/model/mod.rs b/kordophone/src/model/mod.rs index d1c848e..f07d6f6 100644 --- a/kordophone/src/model/mod.rs +++ b/kordophone/src/model/mod.rs @@ -5,6 +5,7 @@ pub use conversation::Conversation; pub use conversation::ConversationID; pub use message::Message; +pub use message::MessageID; pub mod jwt; pub use jwt::JwtToken; diff --git a/kordophone/src/tests/test_client.rs b/kordophone/src/tests/test_client.rs index a67612b..1ddfd35 100644 --- a/kordophone/src/tests/test_client.rs +++ b/kordophone/src/tests/test_client.rs @@ -4,7 +4,7 @@ use std::collections::HashMap; pub use crate::APIInterface; use crate::{ api::http_client::Credentials, - model::{Conversation, ConversationID, JwtToken, Message} + model::{Conversation, ConversationID, JwtToken, Message, MessageID} }; pub struct TestClient { @@ -44,7 +44,13 @@ impl APIInterface for TestClient { Ok(self.conversations.clone()) } - async fn get_messages(&mut self, conversation_id: &ConversationID) -> Result, Self::Error> { + async fn get_messages( + &mut self, + conversation_id: &ConversationID, + limit: Option, + before: Option, + after: Option + ) -> Result, Self::Error> { if let Some(messages) = self.messages.get(conversation_id) { return Ok(messages.clone()) } diff --git a/kordophoned/src/daemon/mod.rs b/kordophoned/src/daemon/mod.rs index ee36af9..71932b2 100644 --- a/kordophoned/src/daemon/mod.rs +++ b/kordophoned/src/daemon/mod.rs @@ -181,7 +181,7 @@ impl Daemon { // Fetch and sync messages for this conversation log::debug!(target: target::SYNC, "Fetching messages for conversation {}", conversation_id); - let messages = client.get_messages(&conversation_id).await?; + let messages = client.get_messages(&conversation_id, None, None, None).await?; let db_messages: Vec = messages.into_iter() .map(|m| kordophone_db::models::Message::from(m)) .collect(); diff --git a/kpcli/src/client/mod.rs b/kpcli/src/client/mod.rs index a0c146e..8283c1d 100644 --- a/kpcli/src/client/mod.rs +++ b/kpcli/src/client/mod.rs @@ -77,7 +77,7 @@ impl ClientCli { } pub async fn print_messages(&mut self, conversation_id: String) -> Result<()> { - let messages = self.api.get_messages(&conversation_id).await?; + let messages = self.api.get_messages(&conversation_id, None, None, None).await?; for message in messages { println!("{}", MessagePrinter::new(&message.into())); } diff --git a/kpcli/src/db/mod.rs b/kpcli/src/db/mod.rs index 829ca74..f5198b1 100644 --- a/kpcli/src/db/mod.rs +++ b/kpcli/src/db/mod.rs @@ -151,7 +151,7 @@ impl DbClient { }).await?; // Fetch and sync messages for this conversation - let messages = client.get_messages(&conversation_id).await?; + let messages = client.get_messages(&conversation_id, None, None, None).await?; let db_messages: Vec = messages.into_iter() .map(|m| kordophone_db::models::Message::from(m)) .collect();