Merge branch '3.1' into 5.2
[GitHub/WoltLab/com.woltlab.wcf.conversation.git] / files / lib / system / moderation / queue / report / ConversationMessageModerationQueueReportHandler.class.php
CommitLineData
60d1935c 1<?php
db07cb2d 2namespace wcf\system\moderation\queue\report;
60d1935c 3use wcf\data\conversation\message\ConversationMessage;
db07cb2d 4use wcf\data\conversation\message\ConversationMessageAction;
60d1935c
AE
5use wcf\data\conversation\message\ConversationMessageList;
6use wcf\data\conversation\message\ViewableConversationMessage;
232cdc4b
MS
7use wcf\data\conversation\Conversation;
8use wcf\data\conversation\ConversationList;
60d1935c 9use wcf\data\moderation\queue\ModerationQueue;
db07cb2d 10use wcf\data\moderation\queue\ViewableModerationQueue;
58ad6e1c 11use wcf\system\moderation\queue\AbstractModerationQueueHandler;
60d1935c
AE
12use wcf\system\moderation\queue\ModerationQueueManager;
13use wcf\system\WCF;
14
15/**
16 * An implementation of IModerationQueueReportHandler for conversation messages.
17 *
f14df6e0 18 * @author Alexander Ebert
4ddaa70e 19 * @copyright 2001-2019 WoltLab GmbH
60d1935c 20 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
c032049e 21 * @package WoltLabSuite\Core\System\Moderation\Queue
60d1935c 22 */
58ad6e1c 23class ConversationMessageModerationQueueReportHandler extends AbstractModerationQueueHandler implements IModerationQueueReportHandler {
6ee7d629 24 /**
9c3943b0 25 * @inheritDoc
6ee7d629 26 */
f586b354 27 protected $className = ConversationMessage::class;
6ee7d629 28
58ad6e1c 29 /**
9c3943b0 30 * @inheritDoc
58ad6e1c
AE
31 */
32 protected $definitionName = 'com.woltlab.wcf.moderation.report';
33
34 /**
9c3943b0 35 * @inheritDoc
58ad6e1c 36 */
b8be4e8d 37 protected $objectType = 'com.woltlab.wcf.conversation.message';
58ad6e1c 38
60d1935c
AE
39 /**
40 * list of conversation message
03043c3c 41 * @var ConversationMessage[]
60d1935c 42 */
eaf1c8eb 43 protected static $messages = [];
60d1935c 44
48e5a9da 45 /**
9c3943b0 46 * @inheritDoc
48e5a9da
MW
47 */
48 protected $requiredPermission = 'mod.conversation.canModerateConversation';
49
60d1935c 50 /**
9c3943b0 51 * @inheritDoc
60d1935c
AE
52 */
53 public function assignQueues(array $queues) {
eaf1c8eb 54 $assignments = [];
60d1935c
AE
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 }
db864366 63
60d1935c
AE
64 ModerationQueueManager::getInstance()->setAssignment($assignments);
65 }
66
67 /**
9c3943b0 68 * @inheritDoc
60d1935c
AE
69 */
70 public function canReport($objectID) {
71 if (!$this->isValid($objectID)) {
72 return false;
73 }
74
eaf1c8eb 75 if (!Conversation::isParticipant([$this->getMessage($objectID)->conversationID])) {
60d1935c
AE
76 return false;
77 }
78
79 return true;
80 }
81
82 /**
9c3943b0 83 * @inheritDoc
60d1935c
AE
84 */
85 public function getContainerID($objectID) {
86 return 0;
87 }
88
89 /**
9c3943b0 90 * @inheritDoc
60d1935c
AE
91 */
92 public function getReportedContent(ViewableModerationQueue $queue) {
5acf7f80 93 /** @noinspection PhpParamsInspection */
eaf1c8eb 94 WCF::getTPL()->assign([
60d1935c 95 'message' => new ViewableConversationMessage($queue->getAffectedObject())
eaf1c8eb 96 ]);
db864366 97
60d1935c
AE
98 return WCF::getTPL()->fetch('moderationConversationMessage');
99 }
100
101 /**
9c3943b0 102 * @inheritDoc
60d1935c
AE
103 */
104 public function getReportedObject($objectID) {
105 if ($this->isValid($objectID)) {
106 return $this->getMessage($objectID);
107 }
db864366 108
60d1935c
AE
109 return null;
110 }
111
112 /**
9c3943b0 113 * @inheritDoc
60d1935c
AE
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
3dfd396a 127 * @return ConversationMessage
60d1935c
AE
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 /**
9c3943b0 141 * @inheritDoc
60d1935c
AE
142 */
143 public function populate(array $queues) {
eaf1c8eb 144 $objectIDs = [];
60d1935c
AE
145 foreach ($queues as $object) {
146 $objectIDs[] = $object->objectID;
147 }
148
149 // fetch messages
150 $messageList = new ConversationMessageList();
cb682f36 151 $messageList->setObjectIDs($objectIDs);
60d1935c
AE
152 $messageList->readObjects();
153 $messages = $messageList->getObjects();
154
cb682f36
MS
155 // set orphaned queues
156 foreach ($queues as $queue) {
157 if (!isset($messages[$queue->objectID])) {
158 $queue->setIsOrphaned();
159 }
160 }
161
60d1935c 162 // fetch conversations
eaf1c8eb 163 $conversationIDs = [];
60d1935c
AE
164 foreach ($messages as $message) {
165 $conversationIDs[] = $message->conversationID;
166 }
167
cb682f36
MS
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 }
60d1935c
AE
181 }
182 }
183 }
184
185 /**
9c3943b0 186 * @inheritDoc
60d1935c
AE
187 */
188 public function removeContent(ModerationQueue $queue, $message) {
db07cb2d 189 if ($this->isValid($queue->objectID)) {
eaf1c8eb 190 $messageAction = new ConversationMessageAction([$this->getMessage($queue->objectID)], 'delete');
db07cb2d
AE
191 $messageAction->executeAction();
192 }
60d1935c
AE
193 }
194}