1
0
mirror of https://gitlab.com/comunic/comunicapiv3 synced 2025-03-23 14:10:44 +00:00
comunicapiv3/src/api_data/conversation_message_api.rs
2021-03-05 13:58:15 +01:00

97 lines
3.4 KiB
Rust

//! # Conversation message API
//!
//! API representation of a conversation message
//!
//! @author Pierre HUBERT
use serde::Serialize;
use serde_json::Value;
use crate::data::conversation_message::{ConversationMessage, ConversationServerMessageType};
use crate::utils::user_data_utils::user_data_url;
#[derive(Serialize)]
struct ConversationMessageFileAPI {
url: String,
size: u64,
name: String,
thumbnail: Option<String>,
r#type: String,
}
#[derive(Serialize)]
pub struct ConversationMessageAPI {
id: u64,
conv_id: u64,
user_id: Option<u64>,
time_sent: u64,
message: Option<String>,
file: Option<ConversationMessageFileAPI>,
server_message: Option<serde_json::Value>,
}
impl ConversationMessageAPI {
/// Turn a conversation message into an API entry
pub fn new(msg: &ConversationMessage) -> ConversationMessageAPI {
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(),
thumbnail: file.thumbnail.as_ref().map(|u|user_data_url(u)),
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))
}
};
ConversationMessageAPI {
id: msg.id,
conv_id: msg.conv_id.id(),
user_id: msg.user_id.clone().map(|u| u.id()),
time_sent: msg.time_sent,
message: msg.message.clone(),
file,
server_message,
}
}
/// 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()
}
}