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;
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()
*/
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();
// 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')
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;
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;
}