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