1
0
mirror of https://gitlab.com/comunic/comunicapiv3 synced 2024-11-24 06:19:21 +00:00
comunicapiv3/src/controllers/conversations_controller.rs

186 lines
6.3 KiB
Rust
Raw Normal View History

//! # Conversations controller
//!
//! @author Pierre Hubert
2020-06-18 12:15:17 +00:00
use std::collections::HashMap;
2020-06-15 12:42:02 +00:00
use crate::api_data::conversation_api::ConversationAPI;
2020-06-18 12:15:17 +00:00
use crate::api_data::conversations_refresh_api::ConversationRefreshResultAPI;
2020-06-15 12:42:02 +00:00
use crate::api_data::res_create_conversation::ResCreateConversation;
use crate::api_data::res_find_private_conversations::ResFindPrivateConversations;
use crate::controllers::routes::RequestResult;
2020-06-15 12:42:02 +00:00
use crate::data::http_request_handler::HttpRequestHandler;
use crate::data::new_conversation::NewConversation;
2020-06-15 12:42:02 +00:00
use crate::helpers::{conversations_helper, user_helper};
use crate::utils::string_utils::remove_html_nodes;
/// Create a new conversation
pub fn create(r: &mut HttpRequestHandler) -> RequestResult {
let name = r.post_string("name")?;
let mut members = r.post_numbers_list("users", 1)?;
// Adapt name
let name = match name.as_str() {
"false" => None,
s => Some(s.to_string())
};
// Check if members exists
for user in &members {
if !user_helper::exists(user.clone())? {
r.not_found(format!("User {} not found!", user))?;
}
}
// Add current user ID if required
let curr_user_id = r.user_id()? as i64;
if !members.contains(&curr_user_id) {
members.push(curr_user_id);
}
let conv = NewConversation {
owner_id: r.user_id()?,
name,
owner_following: r.post_bool("follow")?,
members,
can_everyone_add_members: r.post_bool_opt("canEveryoneAddMembers", true),
};
// Create the conversation
2020-06-04 11:36:57 +00:00
let conv_id = conversations_helper::create(&conv)?;
r.set_response(ResCreateConversation::new(conv_id))
2020-06-04 15:51:22 +00:00
}
/// Get the list of conversations of a user
pub fn get_list(r: &mut HttpRequestHandler) -> RequestResult {
let list = conversations_helper::get_list_user(r.user_id()?)?;
r.set_response(list.iter().map(|c| ConversationAPI::new(c)).collect::<Vec<ConversationAPI>>())
2020-06-12 06:50:09 +00:00
}
/// Get information about a single conversation
pub fn get_single(r: &mut HttpRequestHandler) -> RequestResult {
let conversation_id = r.post_conv_id("conversationID")?;
let conv = conversations_helper::get_single(conversation_id, r.user_id()?)?;
r.set_response(ConversationAPI::new(&conv))
2020-06-12 07:23:02 +00:00
}
/// Update the settings of a conversation
pub fn update_settings(r: &mut HttpRequestHandler) -> RequestResult {
let conv_id = r.post_conv_id("conversationID")?;
let is_moderator = conversations_helper::is_user_moderator(r.user_id()?, conv_id)?;
// Update following state, if required
if r.has_post_parameter("following") {
conversations_helper::set_following(
r.user_id()?,
conv_id,
r.post_bool("following")?,
)?;
}
// Update members list
if r.has_post_parameter("members") {
let mut members = r.post_numbers_list("members", 1)?;
let can_everyone_add_members = conversations_helper::can_everyone_add_members(conv_id)?;
if !is_moderator && !can_everyone_add_members {
r.forbidden("You can not update the list of members of this conversation!".to_string())?;
}
// Check if the members of the conversation really exists
for member in &members {
if !user_helper::exists(member.clone())? {
r.not_found(format!("User {} not found!", member))?;
}
}
if !members.contains(&r.user_id()?) {
members.push(r.user_id()?);
}
2020-06-15 08:53:50 +00:00
conversations_helper::set_members(conv_id, &members, is_moderator)?;
}
2020-06-15 12:30:01 +00:00
// Change moderator settings
if r.has_post_parameter("name") || r.has_post_parameter("canEveryoneAddMembers") {
if !is_moderator {
r.forbidden("You are not allowed to perform changes on this conversation!".to_string())?;
}
// Change conversation name
if r.has_post_parameter("name") {
let name = r.post_string_opt("name", 0, true)?;
let name = if name.eq("false") || name.is_empty() {
None
} else {
2020-06-15 12:42:02 +00:00
Some(remove_html_nodes(&name))
2020-06-15 12:30:01 +00:00
};
conversations_helper::set_name(conv_id, name)?;
}
// Change "canEveryoneAddMembers" parameter
if r.has_post_parameter("canEveryoneAddMembers") {
conversations_helper::set_can_everyone_add_members(
conv_id, r.post_bool("canEveryoneAddMembers")?)?;
}
2020-06-15 12:30:01 +00:00
}
r.success("Conversation information successfully updated!")
}
/// Find a private conversation
pub fn find_private(r: &mut HttpRequestHandler) -> RequestResult {
let other_user = r.post_user_id("otherUser")?;
let allow_create = r.post_bool_opt("allowCreate", false);
// Query the database
2020-06-18 07:44:34 +00:00
let mut list = conversations_helper::find_private(r.user_id()?, other_user)?;
if list.is_empty() {
if !allow_create {
return r.not_found(format!("Not any private conversation was found. The server was not allowed to create a new one..."));
}
2020-06-18 07:44:34 +00:00
let new_conv = NewConversation {
owner_id: r.user_id()?,
name: None,
owner_following: true,
members: vec![r.user_id()?, other_user],
can_everyone_add_members: true,
};
let conv_id = conversations_helper::create(&new_conv)?;
list.push(conv_id);
}
r.set_response(ResFindPrivateConversations::new(list))
2020-06-18 07:55:02 +00:00
}
/// DEPRECATED : refresh current user conversations
///
/// This method was used only by ComunicWeb before the introduction of WebSockets
pub fn refresh_list(r: &mut HttpRequestHandler) -> RequestResult {
2020-06-18 12:15:17 +00:00
let mut list = HashMap::new();
// Check for new conversations
if r.has_post_parameter("newConversations") {
for conv_id in r.post_numbers_list("newConversations", 0)? {
if !conversations_helper::does_user_belongs_to(r.user_id()?, conv_id as u64)? {
r.forbidden(format!("Your do not belongs to conversation {} !", conv_id))?;
}
let msgs_conv = conversations_helper::get_last_messages(conv_id as u64, 10)?;
list.insert(conv_id as u64, msgs_conv);
//TODO : mark user seen
}
// TODO : Check for refresh of already initialized conversations
}
r.set_response(ConversationRefreshResultAPI::new(list))
}