1
0
mirror of https://gitlab.com/comunic/comunicapiv3 synced 2025-03-25 07:00:44 +00:00
comunicapiv3/src/api_data/conversation_message_api.rs

97 lines
3.4 KiB
Rust
Raw Normal View History

2020-06-18 14:15:17 +02:00
//! # Conversation message API
//!
//! API representation of a conversation message
//!
//! @author Pierre HUBERT
use serde::Serialize;
2021-03-02 18:57:34 +01:00
use serde_json::Value;
2020-06-18 14:15:17 +02:00
2021-03-02 18:57:34 +01:00
use crate::data::conversation_message::{ConversationMessage, ConversationServerMessageType};
2020-06-18 14:15:17 +02:00
use crate::utils::user_data_utils::user_data_url;
#[derive(Serialize)]
2021-03-02 18:57:34 +01:00
struct ConversationMessageFileAPI {
url: String,
size: u64,
name: String,
thumbnail: Option<String>,
r#type: String,
}
#[derive(Serialize)]
2020-06-18 14:15:17 +02:00
pub struct ConversationMessageAPI {
2021-03-02 18:57:34 +01:00
id: u64,
conv_id: u64,
user_id: Option<u64>,
2021-03-05 13:54:54 +01:00
time_sent: u64,
2021-03-02 18:57:34 +01:00
message: Option<String>,
file: Option<ConversationMessageFileAPI>,
server_message: Option<serde_json::Value>,
2020-06-18 14:15:17 +02:00
}
impl ConversationMessageAPI {
/// Turn a conversation message into an API entry
pub fn new(msg: &ConversationMessage) -> ConversationMessageAPI {
2021-03-02 18:57:34 +01:00
let file = match &msg.file {
None => None,
Some(file) => Some(ConversationMessageFileAPI {
url: user_data_url(&file.path.clone()),
size: file.size,
name: file.name.clone(),
2021-03-05 13:58:15 +01:00
thumbnail: file.thumbnail.as_ref().map(|u|user_data_url(u)),
2021-03-02 18:57:34 +01:00
r#type: file.r#type.clone(),
})
};
let server_message = match &msg.server_message {
None => None,
Some(msg) => {
let mut value = serde_json::Map::new();
match msg {
ConversationServerMessageType::UserCreatedConversation(user) => {
value.insert("type".to_string(), Value::from("user_created_conv"));
value.insert("user_id".to_string(), Value::from(user.id()));
}
ConversationServerMessageType::UserAddedAnotherUserToConversation(msg) => {
value.insert("type".to_string(), Value::from("user_added_another"));
value.insert("user_who_added".to_string(), Value::from(msg.user_who_added.id()));
value.insert("user_added".to_string(), Value::from(msg.user_added.id()));
}
ConversationServerMessageType::UserLeftConversation(u) => {
value.insert("type".to_string(), Value::from("user_left"));
value.insert("user_id".to_string(), Value::from(u.id()));
}
ConversationServerMessageType::UserRemovedFromConversation(msg) => {
value.insert("type".to_string(), Value::from("user_removed_another"));
value.insert("user_who_removed".to_string(), Value::from(msg.user_who_removed.id()));
value.insert("user_removed".to_string(), Value::from(msg.user_removed.id()));
}
}
Some(serde_json::Value::Object(value))
}
};
2020-06-18 14:15:17 +02:00
ConversationMessageAPI {
2021-03-02 18:57:34 +01:00
id: msg.id,
2021-03-04 18:51:52 +01:00
conv_id: msg.conv_id.id(),
2021-03-02 18:57:34 +01:00
user_id: msg.user_id.clone().map(|u| u.id()),
2021-03-05 13:54:54 +01:00
time_sent: msg.time_sent,
2021-03-02 18:57:34 +01:00
message: msg.message.clone(),
file,
server_message,
2020-06-18 14:15:17 +02:00
}
}
/// Turn a list of conversation messages into API entries
pub fn for_list(l: &Vec<ConversationMessage>) -> Vec<ConversationMessageAPI> {
l.iter()
.map(|m| ConversationMessageAPI::new(m))
.collect()
}
}