Added missing cleanup
authorMarcel Werk <burntime@woltlab.com>
Wed, 27 Mar 2013 21:40:14 +0000 (22:40 +0100)
committerMarcel Werk <burntime@woltlab.com>
Wed, 27 Mar 2013 21:40:14 +0000 (22:40 +0100)
files/lib/data/conversation/ConversationAction.class.php
files/lib/data/conversation/message/ConversationMessageAction.class.php

index dce2b028df01c98d9ec4fce6625f663afa2775b0..8de4ac19cc4cdcb405cd7ec1db4504f72ac3ef2e 100644 (file)
@@ -2,11 +2,13 @@
 namespace wcf\data\conversation;
 use wcf\data\conversation\label\ConversationLabel;
 use wcf\data\conversation\message\ConversationMessageAction;
+use wcf\data\conversation\message\ConversationMessageList;
 use wcf\data\conversation\message\ViewableConversationMessageList;
 use wcf\data\AbstractDatabaseObjectAction;
 use wcf\data\IClipboardAction;
 use wcf\data\IVisitableObjectAction;
 use wcf\system\clipboard\ClipboardHandler;
+use wcf\system\database\util\PreparedStatementConditionBuilder;
 use wcf\system\exception\PermissionDeniedException;
 use wcf\system\exception\UserInputException;
 use wcf\system\log\modification\ConversationModificationLogHandler;
@@ -111,6 +113,26 @@ class ConversationAction extends AbstractDatabaseObjectAction implements IClipbo
                return $conversation;
        }
        
+       /**
+        * @see wcf\data\AbstractDatabaseObjectAction::delete()
+        */
+       public function delete() {
+               // deletes messages
+               $messageList = new ConversationMessageList();
+               $messageList->getConditionBuilder('conversation_message.conversationID IN (?)', array($this->objectIDs));
+               $messageList->readObjectIDs();
+               $action = new ConversationMessageAction($messageList->getObjectIDs(), 'delete');
+               $action->executeAction();
+               
+               // delete conversations
+               parent::delete();
+       
+               if (!empty($this->objectIDs)) {
+                       // delete notifications
+                       UserNotificationHandler::getInstance()->deleteNotifications('conversation', 'com.woltlab.wcf.conversation.notification', array(), $this->objectIDs);
+               }
+       }
+       
        /**
         * @see wcf\data\AbstractDatabaseObjectAction::update()
         */
@@ -442,6 +464,7 @@ class ConversationAction extends AbstractDatabaseObjectAction implements IClipbo
                        UserStorageHandler::getInstance()->reset(array(WCF::getUser()->userID), 'unreadConversationCount');
                }
                
+               
                // add modification log entry
                if ($this->parameters['hideConversation'] == Conversation::STATE_LEFT) {
                        if (empty($this->objects)) $this->readObjects();
@@ -457,6 +480,28 @@ class ConversationAction extends AbstractDatabaseObjectAction implements IClipbo
                // update participant summary
                ConversationEditor::updateParticipantSummaries($this->objectIDs);
                
+               // delete conversation if all users have left it
+               if ($this->parameters['hideConversation'] == Conversation::STATE_LEFT) {
+                       $conditionBuilder = new PreparedStatementConditionBuilder();
+                       $conditionBuilder->add('conversation.conversationID IN (?)', array($this->objectIDs));
+                       $conditionBuilder->add('conversation_to_user.conversationID IS NULL');
+                       $conversationIDs = array();
+                       $sql = "SELECT          DISTINCT conversation.conversationID
+                               FROM            wcf".WCF_N."_conversation conversation
+                               LEFT JOIN       wcf".WCF_N."_conversation_to_user conversation_to_user
+                               ON              (conversation_to_user.conversationID = conversation.conversationID AND conversation_to_user.hideConversation <> ".Conversation::STATE_LEFT.")
+                               ".$conditionBuilder;
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute($conditionBuilder->getParameters());
+                       while ($row = $statement->fetchArray()) {
+                               $conversationIDs[] = $row['conversationID'];
+                       }
+                       if (!empty($conversationIDs)) {
+                               $action = new ConversationAction($conversationIDs, 'delete');
+                               $action->executeAction();
+                       }
+               }
+               
                return array(
                        'actionName' => 'hideConversation',
                        'redirectURL' => LinkHandler::getInstance()->getLink('ConversationList')
index 3df78f845aea345d6ceaee8f7a1af9751cedc3b0..79345bb54c898ac49d50dd2279ebbadd432824f3 100644 (file)
@@ -7,6 +7,7 @@ use wcf\data\DatabaseObject;
 use wcf\data\IExtendedMessageQuickReplyAction;
 use wcf\data\IMessageInlineEditorAction;
 use wcf\data\IMessageQuoteAction;
+use wcf\system\attachment\AttachmentHandler;
 use wcf\system\bbcode\BBCodeParser;
 use wcf\system\bbcode\PreParser;
 use wcf\system\exception\PermissionDeniedException;
@@ -157,38 +158,29 @@ class ConversationMessageAction extends AbstractDatabaseObjectAction implements
        public function delete() {
                $count = parent::delete();
                
-               if ($count) {
-                       $message = reset($this->objects);
-                       $conversationEditor = new ConversationEditor(new Conversation($message->conversationID));
-                       
-                       // reset user storage
-                       UserStorageHandler::getInstance()->reset($conversationEditor->getParticipantIDs(), 'unreadConversationCount');
-                       
-                       // check if last message was deleted
-                       if (($conversationEditor->replies - $count) == -1) {
-                               // remove conversation
-                               $conversationEditor->delete();
-                       }
-                       else {
-                               // check if first message was deleted
-                               $sql = "SELECT          messageID
-                                       FROM            wcf".WCF_N."_conversation_message
-                                       WHERE           conversationID = ?
-                                       ORDER BY        time DESC";
-                               $statement = WCF::getDB()->prepareStatement($sql);
-                               $statement->execute(array($conversationEditor->conversationID));
-                               $row = $statement->fetchArray();
-                               
-                               $data = array('replies' => ($conversationEditor->replies - $count));
-                               if ($conversationEditor->firstMessageID != $row['messageID']) {
-                                       $data['firstMessageID'] = $row['messageID'];
-                               }
+               $attachmentMessageIDs = array();
+               foreach ($this->objects as $message) {
+                       if ($message->attachments) {
+                               $attachmentMessageIDs[] = $message->messageID;
                                
-                               // update conversation data
-                               $conversationEditor->update($data);
                        }
                }
                
+               // @todo: modification log, reports
+               
+               if (!empty($this->objectIDs)) {
+                       // delete notifications
+                       UserNotificationHandler::getInstance()->deleteNotifications('conversationMessage', 'com.woltlab.wcf.conversation.message.notification', array(), $this->objectIDs);
+               
+                       // update search index
+                       SearchIndexManager::getInstance()->delete('com.woltlab.wcf.conversation.message', $this->objectIDs);
+               }
+               
+               // remove attachments
+               if (!empty($attachmentMessageIDs)) {
+                       AttachmentHandler::removeAttachments('com.woltlab.wcf.conversation.message', $attachmentMessageIDs);
+               }
+               
                return $count;
        }