mirror of
				https://gitlab.com/comunic/comunicapiv3
				synced 2025-11-04 09:34:04 +00:00 
			
		
		
		
	Create the conversation
This commit is contained in:
		@@ -26,6 +26,11 @@ pub mod database_tables_names {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /// Groups list table
 | 
					    /// Groups list table
 | 
				
			||||||
    pub const GROUPS_LIST_TABLE: &str = "comunic_groups";
 | 
					    pub const GROUPS_LIST_TABLE: &str = "comunic_groups";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Conversations tables
 | 
				
			||||||
 | 
					    pub const CONV_LIST_TABLE: &str = "comunic_conversations_list";
 | 
				
			||||||
 | 
					    pub const CONV_USERS_TABLE: &str = "comunic_conversations_users";
 | 
				
			||||||
 | 
					    pub const CONV_MESSAGES_TABLE: &str = "comunic_conversations_messages";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// The account image to show for user who do not have any
 | 
					/// The account image to show for user who do not have any
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use crate::data::http_request_handler::HttpRequestHandler;
 | 
					use crate::data::http_request_handler::HttpRequestHandler;
 | 
				
			||||||
use crate::controllers::routes::RequestResult;
 | 
					use crate::controllers::routes::RequestResult;
 | 
				
			||||||
use crate::helpers::user_helper;
 | 
					use crate::helpers::{user_helper, conversations_helper};
 | 
				
			||||||
use crate::data::new_conversation::NewConversation;
 | 
					use crate::data::new_conversation::NewConversation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Create a new conversation
 | 
					/// Create a new conversation
 | 
				
			||||||
@@ -39,7 +39,10 @@ pub fn create(r: &mut HttpRequestHandler) -> RequestResult {
 | 
				
			|||||||
        can_everyone_add_members: r.post_bool_opt("canEveryoneAddMembers", true)
 | 
					        can_everyone_add_members: r.post_bool_opt("canEveryoneAddMembers", true)
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    println!("Conversation to create: {:#?}", conv);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // TODO : adapt for API
 | 
				
			||||||
 | 
					    println!("Conversation to create: {:#?}", conv);
 | 
				
			||||||
 | 
					    let conv_id = conversations_helper::create(&conv)?;
 | 
				
			||||||
 | 
					    println!("conv: {}", conv_id);
 | 
				
			||||||
    r.success("create")
 | 
					    r.success("create")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										48
									
								
								src/helpers/conversations_helper.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/helpers/conversations_helper.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					//! # Conversations helper
 | 
				
			||||||
 | 
					//!
 | 
				
			||||||
 | 
					//! @author Pierre Hubert
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use crate::data::new_conversation::NewConversation;
 | 
				
			||||||
 | 
					use crate::data::error::{ResultBoxError, ExecError};
 | 
				
			||||||
 | 
					use crate::helpers::database::InsertQuery;
 | 
				
			||||||
 | 
					use crate::constants::database_tables_names::{CONV_LIST_TABLE, CONV_USERS_TABLE};
 | 
				
			||||||
 | 
					use crate::utils::date_utils::time;
 | 
				
			||||||
 | 
					use crate::data::user::UserID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Create a new conversation. This method returns the ID of the created conversation
 | 
				
			||||||
 | 
					pub fn create(conv: &NewConversation) -> ResultBoxError<u64> {
 | 
				
			||||||
 | 
					    // Create the conversation in the main table
 | 
				
			||||||
 | 
					    let conv_id = InsertQuery::new(CONV_LIST_TABLE)
 | 
				
			||||||
 | 
					        .add_user_id("user_id", conv.owner_id)
 | 
				
			||||||
 | 
					        .add_str("name", conv.name.clone().unwrap_or(String::new()).as_str())
 | 
				
			||||||
 | 
					        .add_u64("last_active", time())
 | 
				
			||||||
 | 
					        .add_u64("creation_time", time())
 | 
				
			||||||
 | 
					        .add_legacy_bool("can_everyone_add_members", conv.can_everyone_add_members)
 | 
				
			||||||
 | 
					        .insert()?.ok_or(ExecError::new("missing result conv id!"))?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Add the members to the conversation
 | 
				
			||||||
 | 
					    for member in &conv.members {
 | 
				
			||||||
 | 
					        // Check following status of the member
 | 
				
			||||||
 | 
					        let mut follow = true;
 | 
				
			||||||
 | 
					        if member.eq(&conv.owner_id) {
 | 
				
			||||||
 | 
					            follow = conv.owner_following;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        add_member(conv_id, member.clone(), follow)?;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Ok(conv_id)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Add a member to a conversation
 | 
				
			||||||
 | 
					pub fn add_member(conv_id: u64, user_id: UserID, following: bool) -> ResultBoxError<()> {
 | 
				
			||||||
 | 
					    InsertQuery::new(CONV_USERS_TABLE)
 | 
				
			||||||
 | 
					        .add_u64("conv_id", conv_id)
 | 
				
			||||||
 | 
					        .add_user_id("user_id", user_id)
 | 
				
			||||||
 | 
					        .add_u64("time_add", time())
 | 
				
			||||||
 | 
					        .add_legacy_bool("following", following)
 | 
				
			||||||
 | 
					        .add_legacy_bool("saw_last_message", true)
 | 
				
			||||||
 | 
					        .insert()?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Ok(())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -356,14 +356,40 @@ impl InsertQuery {
 | 
				
			|||||||
        self
 | 
					        self
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn add_u64(mut self, key: &str, value: u64) -> InsertQuery {
 | 
				
			||||||
 | 
					        self.values.insert(key.to_string(), Value::from(value));
 | 
				
			||||||
 | 
					        self
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn add_u32(mut self, key: &str, value: u32) -> InsertQuery {
 | 
					    pub fn add_u32(mut self, key: &str, value: u32) -> InsertQuery {
 | 
				
			||||||
        self.values.insert(key.to_string(), Value::from(value));
 | 
					        self.values.insert(key.to_string(), Value::from(value));
 | 
				
			||||||
        self
 | 
					        self
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn add_user_id(mut self, key: &str, value: UserID) -> InsertQuery {
 | 
				
			||||||
 | 
					        self.values.insert(key.to_string(), Value::from(value));
 | 
				
			||||||
 | 
					        self
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Legacy database boolean (1 = true / 0 = false)
 | 
				
			||||||
 | 
					    pub fn add_legacy_bool(mut self, key: &str, value: bool) -> InsertQuery {
 | 
				
			||||||
 | 
					        let num = match value {
 | 
				
			||||||
 | 
					            true => 1,
 | 
				
			||||||
 | 
					            false => 0
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.values.insert(key.to_string(), Value::from(num));
 | 
				
			||||||
 | 
					        self
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Process insert
 | 
				
			||||||
 | 
					    pub fn insert(self) -> ResultBoxError<Option<u64>> {
 | 
				
			||||||
 | 
					        insert(self)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Insert a new entry into the database
 | 
					/// Insert a new entry into the database
 | 
				
			||||||
pub fn insert(query: InsertQuery) -> ResultBoxError<()> {
 | 
					pub fn insert(query: InsertQuery) -> ResultBoxError<Option<u64>> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Collect keys
 | 
					    // Collect keys
 | 
				
			||||||
    let keys = query.values
 | 
					    let keys = query.values
 | 
				
			||||||
@@ -378,12 +404,13 @@ pub fn insert(query: InsertQuery) -> ResultBoxError<()> {
 | 
				
			|||||||
        keys.iter().map(|_| "?").collect::<Vec<&str>>().join(", ")
 | 
					        keys.iter().map(|_| "?").collect::<Vec<&str>>().join(", ")
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    get_connection()?.exec_drop(
 | 
					    let mut con = get_connection()?;
 | 
				
			||||||
 | 
					    let res = con.exec_iter(
 | 
				
			||||||
        query_sql,
 | 
					        query_sql,
 | 
				
			||||||
        query.values.values().collect::<Vec<&mysql::Value>>(),
 | 
					        query.values.values().collect::<Vec<&mysql::Value>>(),
 | 
				
			||||||
    )?;
 | 
					    )?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Ok(())
 | 
					    Ok(res.last_insert_id())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,3 +8,4 @@ pub mod custom_emojies_helper;
 | 
				
			|||||||
pub mod background_image_helper;
 | 
					pub mod background_image_helper;
 | 
				
			||||||
pub mod likes_helper;
 | 
					pub mod likes_helper;
 | 
				
			||||||
pub mod groups_helper;
 | 
					pub mod groups_helper;
 | 
				
			||||||
 | 
					pub mod conversations_helper;
 | 
				
			||||||
							
								
								
									
										16
									
								
								src/utils/date_utils.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/utils/date_utils.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					//! # Date utilities
 | 
				
			||||||
 | 
					//!
 | 
				
			||||||
 | 
					//! @author Pierre Hubert
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use std::time::{SystemTime, UNIX_EPOCH};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Get the current time since epoch
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// ```
 | 
				
			||||||
 | 
					/// use comunic_server::utils::date_utils::time;
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// let time = time();
 | 
				
			||||||
 | 
					/// ```
 | 
				
			||||||
 | 
					pub fn time() -> u64 {
 | 
				
			||||||
 | 
					    SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -5,3 +5,4 @@
 | 
				
			|||||||
pub mod crypt_utils;
 | 
					pub mod crypt_utils;
 | 
				
			||||||
pub mod user_data_utils;
 | 
					pub mod user_data_utils;
 | 
				
			||||||
pub mod virtual_directories_utils;
 | 
					pub mod virtual_directories_utils;
 | 
				
			||||||
 | 
					pub mod date_utils;
 | 
				
			||||||
		Reference in New Issue
	
	Block a user