3 namespace wcf\system\moderation\queue
;
5 use wcf\data\moderation\queue\ModerationQueue
;
6 use wcf\data\moderation\queue\ModerationQueueAction
;
7 use wcf\data\moderation\queue\ViewableModerationQueue
;
8 use wcf\data\
object\type\ObjectTypeCache
;
9 use wcf\system\cache\builder\UserGroupOptionCacheBuilder
;
10 use wcf\system\cache\runtime\UserProfileRuntimeCache
;
11 use wcf\system\exception\InvalidObjectTypeException
;
12 use wcf\system\request\LinkHandler
;
13 use wcf\system\user\notification\
object\ModerationQueueUserNotificationObject
;
14 use wcf\system\user\notification\
object\type\TMultiRecipientModerationQueueCommentUserNotificationObjectType
;
15 use wcf\system\user\notification\UserNotificationHandler
;
19 * Moderation queue implementation for reports.
21 * @author Alexander Ebert
22 * @copyright 2001-2019 WoltLab GmbH
23 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
25 class ModerationQueueReportManager
extends AbstractModerationQueueManager
30 protected $definitionName = 'com.woltlab.wcf.moderation.report';
33 * Returns true if given item was already reported.
35 * @param string $objectType
36 * @param int $objectID
39 public function isAlreadyReported($objectType, $objectID)
41 $objectTypeID = $this->getObjectTypeID($objectType);
43 $sql = "SELECT COUNT(*)
44 FROM wcf" . WCF_N
. "_moderation_queue
45 WHERE objectTypeID = ?
47 $statement = WCF
::getDB()->prepareStatement($sql);
53 return $statement->fetchSingleColumn() > 0;
57 * Returns true if the object with the given data has a pending report.
58 * A pending report has a status other than done.
60 * @param string $objectType
61 * @param int $objectID
64 public function hasPendingReport($objectType, $objectID)
66 $objectTypeID = $this->getObjectTypeID($objectType);
68 $sql = "SELECT COUNT(*)
69 FROM wcf" . WCF_N
. "_moderation_queue
70 WHERE objectTypeID = ?
72 AND status IN (?, ?)";
73 $statement = WCF
::getDB()->prepareStatement($sql);
77 ModerationQueue
::STATUS_OUTSTANDING
,
78 ModerationQueue
::STATUS_PROCESSING
,
81 return $statement->fetchSingleColumn() > 0;
85 * Returns true if current user can report given content.
87 * @param string $objectType
88 * @param int $objectID
91 public function canReport($objectType, $objectID)
93 return $this->getProcessor($objectType)->canReport($objectID);
99 public function getLink($queueID)
101 return LinkHandler
::getInstance()->getLink('ModerationReport', [
103 'forceFrontend' => true,
108 * Returns rendered template for reported content.
110 * @param ViewableModerationQueue $queue
113 public function getReportedContent(ViewableModerationQueue
$queue)
115 return $this->getProcessor(null, $queue->objectTypeID
)->getReportedContent($queue);
119 * Returns the reported object.
121 * @param string $objectType
122 * @param int $objectID
123 * @return \wcf\data\IUserContent
125 public function getReportedObject($objectType, $objectID)
127 return $this->getProcessor($objectType)->getReportedObject($objectID);
131 * Adds a report for specified content.
133 * @param string $objectType
134 * @param int $objectID
135 * @param string $message
136 * @param array $additionalData
137 * @throws InvalidObjectTypeException
139 public function addReport($objectType, $objectID, $message, array $additionalData = [])
141 if (!$this->isValid($objectType)) {
142 throw new InvalidObjectTypeException($objectType, 'com.woltlab.wcf.moderation.report');
145 $additionalData['message'] = $message;
147 $this->getObjectTypeID($objectType),
149 $this->getProcessor($objectType)->getContainerID($objectID),
157 protected function addEntry($objectTypeID, $objectID, $containerID = 0, array $additionalData = [])
159 $sql = "SELECT queueID
160 FROM wcf" . WCF_N
. "_moderation_queue
161 WHERE objectTypeID = ?
164 $statement = WCF
::getDB()->prepareStatement($sql);
165 $statement->execute([
168 ModerationQueue
::STATUS_DONE
,
170 $row = $statement->fetchArray();
172 if ($row === false) {
173 $objectAction = new ModerationQueueAction([], 'create', [
175 'objectTypeID' => $objectTypeID,
176 'objectID' => $objectID,
177 'containerID' => $containerID,
178 'userID' => WCF
::getUser()->userID ?
: null,
180 'additionalData' => \
serialize($additionalData),
183 $objectAction->executeAction();
184 $queue = $objectAction->getReturnValues()['returnValues'];
186 $objectAction = new ModerationQueueAction([$row['queueID']], 'update', [
188 'status' => ModerationQueue
::STATUS_OUTSTANDING
,
189 'containerID' => $containerID,
190 'userID' => WCF
::getUser()->userID ?
: null,
192 'additionalData' => \
serialize($additionalData),
195 $objectAction->executeAction();
196 $queue = new ModerationQueue($row['queueID']);
199 ModerationQueueManager
::getInstance()->resetModerationCount();
201 $this->notifyModerators($queue);
204 private function notifyModerators(ModerationQueue
$queue): void
206 /** @see TMultiRecipientModerationQueueCommentUserNotificationObjectType::loadModerators() */
207 $userGroupOptionCache = UserGroupOptionCacheBuilder
::getInstance()->getData();
208 $canUseModerationOption = $userGroupOptionCache['options']['mod.general.canUseModeration'];
210 $sql = "SELECT DISTINCT userID
213 FROM wcf1_user_to_group
216 FROM wcf1_user_group_option_value
220 ) users_in_groups_with_access
221 WHERE userID NOT IN (
223 FROM wcf1_user_to_group
226 FROM wcf1_user_group_option_value
233 FROM wcf1_moderation_queue_to_user
236 $statement = WCF
::getDB()->prepare($sql);
237 $statement->execute([
238 $canUseModerationOption->optionID
,
240 $canUseModerationOption->optionID
,
244 $userIDs = $statement->fetchAll(\PDO
::FETCH_COLUMN
);
248 UserProfileRuntimeCache
::getInstance()->cacheObjectIDs($userIDs);
249 $objectType = ObjectTypeCache
::getInstance()->getObjectType($queue->objectTypeID
);
250 $processor = $objectType->getProcessor();
251 \assert
($processor instanceof IModerationQueueHandler
);
253 $userIDs = \array_filter
($userIDs, function ($userID) use ($processor, $queue) {
254 return $processor->isAffectedUser($queue, $userID);
256 if ($userIDs === []) {
259 foreach ($userIDs as $userID) {
260 $user = UserProfileRuntimeCache
::getInstance()->getObject($userID);
261 ModerationQueueManager
::getInstance()->setAssignment([$queue->queueID
=> 1], $user->getDecoratedObject());
264 UserNotificationHandler
::getInstance()->fireEvent(
266 'com.woltlab.wcf.moderation.queue',
267 new ModerationQueueUserNotificationObject($queue),