From 9044501f8b03a18436cba443b107a705fefc3d8a Mon Sep 17 00:00:00 2001 From: Pierre Date: Sun, 31 Dec 2017 12:56:08 +0100 Subject: [PATCH] Can delete completely a conversation --- RestControllers/conversationsController.php | 36 ++++- classes/components/conversations.php | 148 ++++++++++++++++---- 2 files changed, 158 insertions(+), 26 deletions(-) diff --git a/RestControllers/conversationsController.php b/RestControllers/conversationsController.php index c5863a2..08edfc9 100644 --- a/RestControllers/conversationsController.php +++ b/RestControllers/conversationsController.php @@ -358,8 +358,7 @@ class conversationsController{ user_login_required(); //Get the ID of the conversation to refresh - if(!isset($_POST['conversationID'])) - Rest_fatal_error(400, "Please specify a conversation ID !"); + $conversationID = getPostConversationID("conversationID"); //Get the last message ID downloaded by the client if(!isset($_POST['last_message_id'])) @@ -387,4 +386,37 @@ class conversationsController{ return $messages; } + + /** + * Delete a conversation + * + * @url POST /conversations/delete + */ + public function delete(){ + + user_login_required(); + + //Get conversation ID + $conversationID = getPostConversationID("conversationID"); + + //Check if the user belongs to the conversation + if(!CS::get()->components->conversations->userBelongsTo(userID, $conversationID)) + Rest_fatal_error(401, "Specified user doesn't belongs to the conversation number ".$conversationID." !"); + + //Check if user is the owner of the conversation or not + $owner = CS::get()->components->conversations->userIsModerator(userID, $conversationID); + + if($owner){ + //Delete the conversation + if(!CS::get()->components->conversations->delete_conversation($conversationID)) + Rest_fatal_error(500, "Couldn't delete the conversation from the server !"); + } + else { + Rest_fatal_error(500, "Not implemented yet !!"); + } + + + //The operation is a success + return array("success" => "The conversation has been deleted"); + } } \ No newline at end of file diff --git a/classes/components/conversations.php b/classes/components/conversations.php index 6910a4b..19756f5 100644 --- a/classes/components/conversations.php +++ b/classes/components/conversations.php @@ -617,14 +617,127 @@ class conversations { return $messages; } + /** + * Check whether a conversation exists or not + * + * @param int $convID The ID of the conversation to check + * @return bool TRUE if it exists / false else + */ + public function exist(int $convID) : bool { + + //Perform a request on the database + $tableName = $this->conversationsListTable; + + return CS::get()->db->count($tableName, "WHERE ID = ?", array($convID)) > 0; + + } + + /** + * Delete a conversation + * + * @param int $conID The conversation to delete + * @return bool True in case of success / False else + */ + public function delete_conversation(int $convID) : bool { + + //Get all the messages of the conversation + $messages = $this->getMessages("WHERE ID_".$this->conversationsListTable." = ?", array($convID)); + + //Delete each message + foreach($messages as $message){ + if(!$this->delete_message($message['ID'], $convID)) + return false; + } + + //Delete all the members of the conversation + if(!$this->delete_all_members($convID)) + return false; + + //Delete the conversation entry itself + if(!$this->delete_conversation_entry($convID)) + return false; + + //Success + return true; + } + + /** + * Delete a single message of a conversation + * + * @param int $messageID The ID of the message to delete + * @param int $convID The target conversation + * @param array $informations Optionnal, informations about the message + * @return bool True in case of success / false else + */ + private function delete_message(int $messageID, int $convID, array $informations = null) : bool { + + //Check if we have to fetch informations about the message + if(is_null($informations)){ + $messages = $this->getMessages("WHERE ID_".$this->conversationsListTable." = ? AND ID = ?", array($convID, $messageID), false); + + if(count($messages) == 0) + return false; + + $informations = $messages[0]; + } + + //Check if we have to delete an image + if(!is_null($informations["image_path"]) AND $informations["image_path"] !== ""){ + + //Get system path of the image + $img_sys_path = path_user_data($informations["image_path"], true); + + if(file_exists($img_sys_path)){ + unlink($img_sys_path); + } + + } + + //Delete message from the database + $conditions = "ID = ?"; + $condValues = array($messageID); + return CS::get()->db->deleteEntry($this->conversationsMessagesTable, $conditions, $condValues); + + } + + /** + * Delete all the members of a conversation + * + * @param int $convID The target conversation + * @return bool TRUE in case of success / false else + */ + private function delete_all_members(int $convID) : bool { + + //Prepare request on the database + $conditions = "ID_".$this->conversationsListTable." = ?"; + $values = array( + $convID + ); + + //Try to perform request + return CS::get()->db->deleteEntry($this->conversationsUsersTable, $conditions, $values); + + } + + /** + * Delete a conversation entry in the database + * + * @param int $convID The target conversation + * @return bool True in case of success / false else + */ + private function delete_conversation_entry(int $convID) : bool { + return CS::get()->db->deleteEntry($this->conversationsListTable, "ID = ?", array($convID)); + } + /** * Get a list of conversation messages based on specified conditions * - * @param String $conditions The conditions of the request + * @param string $conditions The conditions of the request * @param Array $conditionsValues The values of the conditions (Optionnal) + * @param bool $transformPath Transform the path of the files into URLS (true by default) * @return Array The list of messages */ - private function getMessages(string $conditions, array $conditionsValues = array()) : array{ + private function getMessages(string $conditions, array $conditionsValues = array(), bool $transformPath = true) : array{ //Prepare database request $tableName = $this->conversationsMessagesTable; @@ -642,34 +755,21 @@ class conversations { $messages = CS::get()->db->select($tableName, $conditions, $conditionsValues, $requiredFields); //Process each message - array_walk($messages, function(&$item){ + if($transformPath){ + array_walk($messages, function(&$item){ - //Check if the image of the message is not null - if($item["image_path"] !== null && $item["image_path"] != ""){ - //Replace image name with full URL - $item["image_path"] = path_user_data($item["image_path"]); - } - }); + //Check if the image of the message is not null + if($item["image_path"] !== null && $item["image_path"] != ""){ + //Replace image name with full URL + $item["image_path"] = path_user_data($item["image_path"]); + } + }); + } //Return result return $messages; } - /** - * Check whether a conversation exists or not - * - * @param int $convID The ID of the conversation to check - * @return bool TRUE if it exists / false else - */ - public function exist(int $convID) : bool { - - //Perform a request on the database - $tableName = $this->conversationsListTable; - - return CS::get()->db->count($tableName, "WHERE ID = ?", array($convID)) > 0; - - } - } //Register component