Merge branch '2.0' into 2.1
[GitHub/WoltLab/com.woltlab.wcf.conversation.git] / files / lib / system / moderation / queue / report / ConversationMessageModerationQueueReportHandler.class.php
1 <?php
2 namespace wcf\system\moderation\queue\report;
3 use wcf\data\conversation\message\ConversationMessage;
4 use wcf\data\conversation\message\ConversationMessageAction;
5 use wcf\data\conversation\message\ConversationMessageList;
6 use wcf\data\conversation\message\ViewableConversationMessage;
7 use wcf\data\conversation\Conversation;
8 use wcf\data\conversation\ConversationList;
9 use wcf\data\moderation\queue\ModerationQueue;
10 use wcf\data\moderation\queue\ViewableModerationQueue;
11 use wcf\system\moderation\queue\AbstractModerationQueueHandler;
12 use wcf\system\moderation\queue\ModerationQueueManager;
13 use wcf\system\WCF;
14
15 /**
16 * An implementation of IModerationQueueReportHandler for conversation messages.
17 *
18 * @author Alexander Ebert
19 * @copyright 2001-2015 WoltLab GmbH
20 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
21 * @package com.woltlab.wcf.conversation
22 * @subpackage system.moderation.queue
23 * @category Community Framework
24 */
25 class ConversationMessageModerationQueueReportHandler extends AbstractModerationQueueHandler implements IModerationQueueReportHandler {
26 /**
27 * @see \wcf\system\moderation\queue\AbstractModerationQueueHandler::$className
28 */
29 protected $className = 'wcf\data\conversation\message\ConversationMessage';
30
31 /**
32 * @see \wcf\system\moderation\queue\AbstractModerationQueueHandler::$definitionName
33 */
34 protected $definitionName = 'com.woltlab.wcf.moderation.report';
35
36 /**
37 * @see \wcf\system\moderation\queue\AbstractModerationQueueHandler::$objectType
38 */
39 protected $objectType = 'com.woltlab.wcf.conversation.message';
40
41 /**
42 * list of conversation message
43 * @var array<\wcf\data\conversation\message\ConversationMessage>
44 */
45 protected static $messages = array();
46
47 /**
48 * @see \wcf\system\moderation\queue\AbstractModerationQueueHandler::$requiredPermission
49 */
50 protected $requiredPermission = 'mod.conversation.canModerateConversation';
51
52 /**
53 * @see \wcf\system\moderation\queue\IModerationQueueHandler::assignQueues()
54 */
55 public function assignQueues(array $queues) {
56 $assignments = array();
57 foreach ($queues as $queue) {
58 $assignUser = false;
59 if (WCF::getSession()->getPermission('mod.conversation.canModerateConversation')) {
60 $assignUser = true;
61 }
62
63 $assignments[$queue->queueID] = $assignUser;
64 }
65
66 ModerationQueueManager::getInstance()->setAssignment($assignments);
67 }
68
69 /**
70 * @see \wcf\system\moderation\queue\report\IModerationQueueReportHandler::canReport()
71 */
72 public function canReport($objectID) {
73 if (!$this->isValid($objectID)) {
74 return false;
75 }
76
77 if (!Conversation::isParticipant(array($this->getMessage($objectID)->conversationID))) {
78 return false;
79 }
80
81 return true;
82 }
83
84 /**
85 * @see \wcf\system\moderation\queue\IModerationQueueHandler::getContainerID()
86 */
87 public function getContainerID($objectID) {
88 return 0;
89 }
90
91 /**
92 * @see \wcf\system\moderation\queue\report\IModerationQueueReportHandler::getReportedContent()
93 */
94 public function getReportedContent(ViewableModerationQueue $queue) {
95 WCF::getTPL()->assign(array(
96 'message' => ViewableConversationMessage::getViewableConversationMessage($queue->getAffectedObject()->messageID)
97 ));
98
99 return WCF::getTPL()->fetch('moderationConversationMessage');
100 }
101
102 /**
103 * @see \wcf\system\moderation\queue\report\IModerationQueueReportHandler::getReportedObject()
104 */
105 public function getReportedObject($objectID) {
106 if ($this->isValid($objectID)) {
107 return $this->getMessage($objectID);
108 }
109
110 return null;
111 }
112
113 /**
114 * @see \wcf\system\moderation\queue\IModerationQueueHandler::isValid()
115 */
116 public function isValid($objectID) {
117 if ($this->getMessage($objectID) === null) {
118 return false;
119 }
120
121 return true;
122 }
123
124 /**
125 * Returns a conversation message object by message id or null if message id is invalid.
126 *
127 * @param integer $objectID
128 * @return \wcf\data\conversation\message\ConversationMessage
129 */
130 protected function getMessage($objectID) {
131 if (!array_key_exists($objectID, self::$messages)) {
132 self::$messages[$objectID] = new ConversationMessage($objectID);
133 if (!self::$messages[$objectID]->messageID) {
134 self::$messages[$objectID] = null;
135 }
136 }
137
138 return self::$messages[$objectID];
139 }
140
141 /**
142 * @see \wcf\system\moderation\queue\IModerationQueueHandler::populate()
143 */
144 public function populate(array $queues) {
145 $objectIDs = array();
146 foreach ($queues as $object) {
147 $objectIDs[] = $object->objectID;
148 }
149
150 // fetch messages
151 $messageList = new ConversationMessageList();
152 $messageList->setObjectIDs($objectIDs);
153 $messageList->readObjects();
154 $messages = $messageList->getObjects();
155
156 // set orphaned queues
157 foreach ($queues as $queue) {
158 if (!isset($messages[$queue->objectID])) {
159 $queue->setIsOrphaned();
160 }
161 }
162
163 // fetch conversations
164 $conversationIDs = array();
165 foreach ($messages as $message) {
166 $conversationIDs[] = $message->conversationID;
167 }
168
169 if (!empty($conversationIDs)) {
170 $conversationList = new ConversationList();
171 $conversationList->setObjectIDs($conversationIDs);
172 $conversationList->readObjects();
173 $conversations = $conversationList->getObjects();
174
175 foreach ($queues as $object) {
176 if (isset($messages[$object->objectID])) {
177 $message = $messages[$object->objectID];
178 $message->setConversation($conversations[$message->conversationID]);
179
180 $object->setAffectedObject($message);
181 }
182 }
183 }
184 }
185
186 /**
187 * @see \wcf\system\moderation\queue\IModerationQueueHandler::removeContent()
188 */
189 public function removeContent(ModerationQueue $queue, $message) {
190 if ($this->isValid($queue->objectID)) {
191 $messageAction = new ConversationMessageAction(array($this->getMessage($queue->objectID)), 'delete');
192 $messageAction->executeAction();
193 }
194 }
195 }