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