mirror of
				https://gitlab.com/comunic/comunicapiv3
				synced 2025-11-04 01:24:04 +00:00 
			
		
		
		
	Add new field in conversation members table to ease database access
This commit is contained in:
		@@ -98,6 +98,7 @@ CREATE TABLE `comunic_conversations_members` (
 | 
			
		||||
  `following` int DEFAULT '0',
 | 
			
		||||
  `is_admin` int DEFAULT '1',
 | 
			
		||||
  `last_message_seen` int DEFAULT '0',
 | 
			
		||||
  `last_access` int DEFAULT '0',
 | 
			
		||||
  PRIMARY KEY (`id`)
 | 
			
		||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,8 @@ ALTER TABLE comunic_conversations_members rename column time_add to added_on;
 | 
			
		||||
alter table comunic_conversations_members drop column saw_last_message;
 | 
			
		||||
alter table comunic_conversations_members
 | 
			
		||||
	add column is_admin int default 1,
 | 
			
		||||
    add column last_message_seen int default 0;
 | 
			
		||||
    add column last_message_seen int default 0,
 | 
			
		||||
    add column last_access int default 0;
 | 
			
		||||
 | 
			
		||||
-- Conversations list table
 | 
			
		||||
alter table comunic_conversations_list drop column user_id;
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ use crate::helpers::calls_helper;
 | 
			
		||||
struct ConversationMembersAPI {
 | 
			
		||||
    user_id: u64,
 | 
			
		||||
    last_message_seen: u64,
 | 
			
		||||
    last_access: u64,
 | 
			
		||||
    following: bool,
 | 
			
		||||
    is_admin: bool,
 | 
			
		||||
}
 | 
			
		||||
@@ -37,6 +38,7 @@ impl ConversationMembersAPI {
 | 
			
		||||
            last_message_seen: m.last_message_seen,
 | 
			
		||||
            following: m.following,
 | 
			
		||||
            is_admin: m.is_admin,
 | 
			
		||||
            last_access: m.last_access,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -206,7 +206,7 @@ pub fn refresh_single(r: &mut HttpRequestHandler) -> RequestResult {
 | 
			
		||||
    let conv = r.post_conv("conversationID")?;
 | 
			
		||||
    let last_message_id = r.post_u64("last_message_id")?;
 | 
			
		||||
 | 
			
		||||
    let messages = match last_message_id {
 | 
			
		||||
    let mut messages = match last_message_id {
 | 
			
		||||
        // Get latest messages of the conversation
 | 
			
		||||
        0 => conversations_helper::get_last_messages(conv.conv_id, 10)?,
 | 
			
		||||
 | 
			
		||||
@@ -214,11 +214,13 @@ pub fn refresh_single(r: &mut HttpRequestHandler) -> RequestResult {
 | 
			
		||||
        _ => conversations_helper::get_new_messages(conv.conv_id, last_message_id)?,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    messages.sort_by(|one, two| one.id.cmp(&two.id));
 | 
			
		||||
 | 
			
		||||
    if messages.len() > 0 {
 | 
			
		||||
        conversations_helper::mark_user_seen(
 | 
			
		||||
            conv.conv_id,
 | 
			
		||||
            r.user_id_ref()?,
 | 
			
		||||
            messages.iter().map(|m| m.id).max().unwrap(),
 | 
			
		||||
            &messages[messages.len() - 1],
 | 
			
		||||
        )?;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -374,7 +376,7 @@ pub fn handle_event(e: &events_helper::Event) -> Res {
 | 
			
		||||
            user_ws_controller::send_message_to_specific_connections(
 | 
			
		||||
                |f| f.conversations.contains(&msg.conv_id),
 | 
			
		||||
                |_| UserWsMessage::no_id_message("new_conv_message", ConversationMessageAPI::new(msg)),
 | 
			
		||||
                Some(|conn: &UserWsConnection| conversations_helper::mark_user_seen(msg.conv_id, conn.user_id(), msg.id)),
 | 
			
		||||
                Some(|conn: &UserWsConnection| conversations_helper::mark_user_seen(msg.conv_id, conn.user_id(), msg)),
 | 
			
		||||
            )?;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ pub struct ConversationMember {
 | 
			
		||||
    pub following: bool,
 | 
			
		||||
    pub is_admin: bool,
 | 
			
		||||
    pub last_message_seen: u64,
 | 
			
		||||
    pub last_access: u64,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
 
 | 
			
		||||
@@ -352,16 +352,18 @@ pub fn send_message(msg: &NewConversationMessage) -> ResultBoxError<()> {
 | 
			
		||||
        .add_custom_where_argument_user_id(msg.user_id.as_ref().unwrap_or(&UserID::invalid()))
 | 
			
		||||
        .exec(|r| r.get_user_id("user_id"))?;
 | 
			
		||||
 | 
			
		||||
    let new_message = get_single_message(msg_id)?;
 | 
			
		||||
 | 
			
		||||
    // Mark the user has seen his message
 | 
			
		||||
    if let Some(user_id) = &msg.user_id {
 | 
			
		||||
        mark_user_seen(msg.conv_id, user_id, msg_id)?;
 | 
			
		||||
        mark_user_seen(msg.conv_id, user_id, &new_message)?;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Send an event (updated_number_unread_conversations)
 | 
			
		||||
    events_helper::propagate_event(&Event::UpdatedNumberUnreadConversations(&list_to_notify))?;
 | 
			
		||||
 | 
			
		||||
    // Send an event (sent_conversation_message)
 | 
			
		||||
    events_helper::propagate_event(&Event::NewConversationMessage(&get_single_message(msg_id)?))?;
 | 
			
		||||
    events_helper::propagate_event(&Event::NewConversationMessage(&new_message))?;
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
@@ -429,11 +431,12 @@ pub fn get_list_unread(user_id: &UserID) -> ResultBoxError<Vec<ConvID>> {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Indicate that a user has seen the last messages of a conversation
 | 
			
		||||
pub fn mark_user_seen(conv_id: ConvID, user_id: &UserID, last_msg: u64) -> ResultBoxError<()> {
 | 
			
		||||
pub fn mark_user_seen(conv_id: ConvID, user_id: &UserID, last_msg: &ConversationMessage) -> ResultBoxError<()> {
 | 
			
		||||
    database::UpdateInfo::new(CONV_MEMBERS_TABLE)
 | 
			
		||||
        .cond_conv_id("conv_id", conv_id)
 | 
			
		||||
        .cond_user_id("user_id", user_id)
 | 
			
		||||
        .set_u64("last_message_seen", last_msg)
 | 
			
		||||
        .set_u64("last_message_seen", last_msg.id)
 | 
			
		||||
        .set_u64("last_access", last_msg.time_sent)
 | 
			
		||||
        .exec()?;
 | 
			
		||||
 | 
			
		||||
    // Push an event (updated_number_unread_conversations)
 | 
			
		||||
@@ -523,6 +526,7 @@ fn db_to_conversation_member(row: &database::RowResult) -> Res<ConversationMembe
 | 
			
		||||
        following: row.get_legacy_bool("following")?,
 | 
			
		||||
        is_admin: row.get_legacy_bool("is_admin")?,
 | 
			
		||||
        last_message_seen: row.get_u64("last_message_seen")?,
 | 
			
		||||
        last_access: row.get_optional_u64("last_access")?.unwrap_or(0),
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user