diff --git a/src/controllers/conversations_controller.rs b/src/controllers/conversations_controller.rs index 188d515..9a4c6fd 100644 --- a/src/controllers/conversations_controller.rs +++ b/src/controllers/conversations_controller.rs @@ -298,4 +298,18 @@ pub fn delete_conversation(r: &mut HttpRequestHandler) -> RequestResult { conversations_helper::remove_user_from_conversation(r.user_id()?, conv_id)?; r.success("The conversation has been deleted") +} + +/// Update a single conversation message +pub fn update_message(r: &mut HttpRequestHandler) -> RequestResult { + let msg_id = r.post_u64("messageID")?; + let new_content = r.post_string_opt("content", 3, true)?; + + if !conversations_helper::is_message_owner(r.user_id()?, msg_id)? { + r.forbidden("You are not the owner of this message!".to_string())?; + } + + conversations_helper::update_message_content(msg_id, &new_content)?; + + r.success("Conversation message content successfully updated") } \ No newline at end of file diff --git a/src/controllers/routes.rs b/src/controllers/routes.rs index d69f8bf..debd548 100644 --- a/src/controllers/routes.rs +++ b/src/controllers/routes.rs @@ -114,6 +114,8 @@ pub fn get_routes() -> Vec { Route::post("/conversations/delete", Box::new(conversations_controller::delete_conversation)), + Route::post("/conversations/updateMessage", Box::new(conversations_controller::update_message)), + // Virtual directory controller Route::post("/user/findbyfolder", Box::new(virtual_directory_controller::find_user)), diff --git a/src/helpers/conversations_helper.rs b/src/helpers/conversations_helper.rs index c15c288..02e1e12 100644 --- a/src/helpers/conversations_helper.rs +++ b/src/helpers/conversations_helper.rs @@ -293,6 +293,14 @@ pub fn send_message(msg: &NewConversationMessage) -> ResultBoxError<()> { Ok(()) } +/// Update message content +pub fn update_message_content(msg_id: u64, new_content: &str) -> ResultBoxError<()> { + database::UpdateInfo::new(CONV_MESSAGES_TABLE) + .cond_u64("id", msg_id) + .set_str("message", new_content) + .exec() +} + /// Remove a message from a conversation pub fn delete_message(msg: &ConversationMessage) -> ResultBoxError<()> { @@ -394,6 +402,15 @@ pub fn delete_member(user_id: UserID, conv_id: u64) -> ResultBoxError<()> { Ok(()) } +/// Check out whether a user is the owner of a message or not +pub fn is_message_owner(user_id: UserID, message_id: u64) -> ResultBoxError { + database::QueryInfo::new(CONV_MESSAGES_TABLE) + .cond_u64("id", message_id) + .cond_user_id("user_id", user_id) + .exec_count() + .map(|r| r > 0) +} + /// Turn a database entry into a ConversationInfo object fn db_to_conversation_info(row: &database::RowResult) -> ResultBoxError { let conv_id = row.get_u64("id")?; diff --git a/src/helpers/database.rs b/src/helpers/database.rs index 18241ec..022d4d6 100644 --- a/src/helpers/database.rs +++ b/src/helpers/database.rs @@ -651,6 +651,12 @@ impl UpdateInfo { self } + /// Set a new string + pub fn set_str(mut self, name: &str, val: &str) -> Self { + self.set.insert(name.to_string(), Value::from(val)); + self + } + /// Set an new optional string /// /// None => Empty string