From: Alexander Ebert Date: Mon, 23 Sep 2013 22:15:48 +0000 (+0200) Subject: Added automatic removal of orphaned moderation queues X-Git-Tag: 2.0.0_Beta_10~45 X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=9bf4ce631e626a7b99d96115da81becb5b87457e;p=GitHub%2FWoltLab%2FWCF.git Added automatic removal of orphaned moderation queues --- diff --git a/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueAction.class.php b/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueAction.class.php index c2596554c9..9c3252b726 100644 --- a/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueAction.class.php +++ b/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueAction.class.php @@ -97,9 +97,16 @@ class ModerationQueueAction extends AbstractDatabaseObjectAction { 'queues' => $queueList )); + // check if user storage is outdated $totalCount = ModerationQueueManager::getInstance()->getOutstandingModerationCount(); if (count($queueList) < $totalCount) { UserStorageHandler::getInstance()->reset(array(WCF::getUser()->userID), 'outstandingModerationCount'); + + // check for orphaned queues + $queueCount = ModerationQueueManager::getInstance()->getOutstandingModerationCount(); + if (count($queueList) < $queueCount) { + ModerationQueueManager::getInstance()->identifyOrphans(); + } } return array( diff --git a/wcfsetup/install/files/lib/system/moderation/queue/AbstractModerationQueueHandler.class.php b/wcfsetup/install/files/lib/system/moderation/queue/AbstractModerationQueueHandler.class.php index 39ce6a984c..a501a7193f 100644 --- a/wcfsetup/install/files/lib/system/moderation/queue/AbstractModerationQueueHandler.class.php +++ b/wcfsetup/install/files/lib/system/moderation/queue/AbstractModerationQueueHandler.class.php @@ -1,6 +1,7 @@ className) || !class_exists($this->className) || !($this->className instanceof DatabaseObject)) { + throw new SystemException("DatabaseObject class name '" . $this->className . "' is missing or invalid"); + } + + $indexName = call_user_func(array($this->className, 'getDatabaseTableIndexName')); + $tableName = call_user_func(array($this->className, 'getDatabaseTableName')); + + $conditions = new PreparedStatementConditionBuilder(); + $conditions->add($indexName . " IN (?)", array(array_keys($queues))); + + $sql = "SELECT " . $indexName . " + FROM " . $tableName . " + ".$conditions; + $statement = WCF::getDB()->prepareStatement($sql); + $statement->execute($conditions->getParameters()); + while ($row = $statement->fetchArray()) { + unset($queues[$row[$indexName]]); + } + + return array_values($queues); + } + /** * @see wcf\system\moderation\queue\IModerationQueueHandler::removeQueues() */ diff --git a/wcfsetup/install/files/lib/system/moderation/queue/IModerationQueueHandler.class.php b/wcfsetup/install/files/lib/system/moderation/queue/IModerationQueueHandler.class.php index 2b6b4e7a82..71fb83f39b 100644 --- a/wcfsetup/install/files/lib/system/moderation/queue/IModerationQueueHandler.class.php +++ b/wcfsetup/install/files/lib/system/moderation/queue/IModerationQueueHandler.class.php @@ -28,6 +28,14 @@ interface IModerationQueueHandler { */ public function getContainerID($objectID); + /** + * Validates object ids and returns orphaned queue ids. + * + * @param array $queues + * @return array + */ + public function identifyOrphans(array $queues); + /** * Returns true if given object id is valid. * diff --git a/wcfsetup/install/files/lib/system/moderation/queue/ModerationQueueManager.class.php b/wcfsetup/install/files/lib/system/moderation/queue/ModerationQueueManager.class.php index d61dd5020e..f3c8881092 100644 --- a/wcfsetup/install/files/lib/system/moderation/queue/ModerationQueueManager.class.php +++ b/wcfsetup/install/files/lib/system/moderation/queue/ModerationQueueManager.class.php @@ -289,6 +289,44 @@ class ModerationQueueManager extends SingletonFactory { WCF::getDB()->commitTransaction(); } + /** + * Identifies and removes orphaned queues. + */ + public function identifyOrphans() { + $sql = "SELECT moderation_queue.queueID, moderation_queue.objectTypeID, moderation_queue.objectID + FROM wcf".WCF_N."_moderation_queue_to_user moderation_queue_to_user + LEFT JOIN wcf".WCF_N."_moderation_queue moderation_queue + ON (moderation_queue.queueID = moderation_queue_to_user.queueID) + WHERE moderation_queue_to_user.userID = ? + AND moderation_queue_to_user.isAffected = ? + AND moderation_queue.status <> ?"; + $statement = WCF::getDB()->prepareStatement($sql); + $statement->execute(array( + WCF::getUser()->userID, + 1, + ModerationQueue::STATUS_DONE + )); + + $queues = array(); + while ($row = $statement->fetchArray()) { + $objectTypeID = $row['objectTypeID']; + if (!isset($queues[$objectTypeID])) { + $queues[$objectTypeID] = array(); + } + + $queues[$objectTypeID][$row['queueID']] = $row['objectID']; + } + + if (!empty($queues)) { + $queueIDs = array(); + foreach ($queues as $objectTypeID => $objectQueues) { + $queueID = array_merge($queueIDs, $this->getProcessor($this->definitions[$this->objectTypes[$objectTypeID]->definitionID], null, $objectTypeID)->identifyOrphans()); + } + + $this->removeOrphans($queueIDs); + } + } + /** * Removes a list of orphaned queue ids. * diff --git a/wcfsetup/install/files/lib/system/moderation/queue/report/CommentCommentModerationQueueReportHandler.class.php b/wcfsetup/install/files/lib/system/moderation/queue/report/CommentCommentModerationQueueReportHandler.class.php index c1a61b68be..04f243dc62 100644 --- a/wcfsetup/install/files/lib/system/moderation/queue/report/CommentCommentModerationQueueReportHandler.class.php +++ b/wcfsetup/install/files/lib/system/moderation/queue/report/CommentCommentModerationQueueReportHandler.class.php @@ -23,6 +23,11 @@ use wcf\system\WCF; * @category Community Framework */ class CommentCommentModerationQueueReportHandler extends AbstractModerationQueueHandler implements IModerationQueueReportHandler { + /** + * @see wcf\system\moderation\queue\AbstractModerationQueueHandler::$className + */ + protected $className = 'wcf\data\comment\Comment'; + /** * @see wcf\system\moderation\queue\AbstractModerationQueueHandler::$definitionName */ diff --git a/wcfsetup/install/files/lib/system/moderation/queue/report/CommentResponseModerationQueueReportHandler.class.php b/wcfsetup/install/files/lib/system/moderation/queue/report/CommentResponseModerationQueueReportHandler.class.php index 81e6d624c5..9450617ede 100644 --- a/wcfsetup/install/files/lib/system/moderation/queue/report/CommentResponseModerationQueueReportHandler.class.php +++ b/wcfsetup/install/files/lib/system/moderation/queue/report/CommentResponseModerationQueueReportHandler.class.php @@ -23,6 +23,11 @@ use wcf\system\WCF; * @category Community Framework */ class CommentResponseModerationQueueReportHandler extends CommentCommentModerationQueueReportHandler { + /** + * @see wcf\system\moderation\queue\AbstractModerationQueueHandler::$className + */ + protected $className = 'wcf\data\comment\response\CommentResponse'; + /** * @see wcf\system\moderation\queue\AbstractModerationQueueHandler::$objectType */