2 namespace wcf\system\clipboard\action
;
3 use wcf\data\clipboard\action\ClipboardAction
;
4 use wcf\data\conversation\Conversation
;
5 use wcf\data\conversation\ConversationAction
;
6 use wcf\system\database\util\PreparedStatementConditionBuilder
;
10 * Prepares clipboard editor items for conversations.
12 * @author Alexander Ebert
13 * @copyright 2001-2016 WoltLab GmbH
14 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
15 * @package WoltLabSuite\Core\System\Clipboard\Action
17 class ConversationClipboardAction
extends AbstractClipboardAction
{
21 protected $actionClassActions = ['close', 'markAsRead', 'open'];
24 * list of conversations
27 public $conversations = null;
32 protected $supportedActions = ['assignLabel', 'close', 'leave', 'leavePermanently', 'markAsRead', 'open', 'restore'];
37 public function execute(array $objects, ClipboardAction
$action) {
38 if ($this->conversations
=== null) {
39 // validate conversations
40 $this->validateParticipation($objects);
43 // check if no conversation was accessible
44 if (empty($this->conversations
)) {
48 $item = parent
::execute($objects, $action);
54 switch ($action->actionName
) {
56 // check if user has labels
57 $sql = "SELECT COUNT(*) AS count
58 FROM wcf".WCF_N
."_conversation_label
60 $statement = WCF
::getDB()->prepareStatement($sql);
61 $statement->execute([WCF
::getUser()->userID
]);
62 $row = $statement->fetchArray();
63 if ($row['count'] == 0) {
67 $item->addParameter('objectIDs', array_keys($this->conversations
));
71 $item->addInternalData('parameters', ['hideConversation' => 1]);
72 $item->addParameter('actionName', 'hideConversation');
73 $item->addParameter('className', $this->getClassName());
76 case 'leavePermanently':
77 $item->addParameter('objectIDs', array_keys($this->conversations
));
78 $item->addInternalData('parameters', ['hideConversation' => 2]);
79 $item->addParameter('actionName', 'hideConversation');
80 $item->addParameter('className', $this->getClassName());
84 $item->addParameter('objectIDs', array_keys($this->conversations
));
85 $item->addParameter('actionName', 'markAsRead');
86 $item->addParameter('className', $this->getClassName());
87 $item->addInternalData('confirmMessage', WCF
::getLanguage()->getDynamicVariable('wcf.clipboard.item.com.woltlab.wcf.conversation.conversation.markAsRead.confirmMessage', [
88 'count' => $item->getCount()
93 $item->addInternalData('parameters', ['hideConversation' => 0]);
94 $item->addParameter('actionName', 'hideConversation');
95 $item->addParameter('className', $this->getClassName());
105 public function getClassName() {
106 return ConversationAction
::class;
112 public function getTypeName() {
113 return 'com.woltlab.wcf.conversation.conversation';
117 * Returns a list of conversations with user participation.
119 * @param Conversation[] $conversations
120 * @return Conversation[]
122 protected function validateParticipation(array $conversations) {
123 $conversationIDs = [];
125 // validate ownership
126 foreach ($conversations as $conversation) {
127 if ($conversation->userID
!= WCF
::getUser()->userID
) {
128 $conversationIDs[] = $conversation->conversationID
;
132 // validate participation as non-owner
133 if (!empty($conversationIDs)) {
134 $conditions = new PreparedStatementConditionBuilder();
135 $conditions->add("conversationID IN (?)", [$conversationIDs]);
136 $conditions->add("participantID = ?", [WCF
::getUser()->userID
]);
138 $sql = "SELECT conversationID
139 FROM wcf".WCF_N
."_conversation_to_user
141 $statement = WCF
::getDB()->prepareStatement($sql);
142 $statement->execute($conditions->getParameters());
143 while (($row = $statement->fetchArray())) {
144 $index = array_search($row['conversationID'], $conversationIDs);
145 unset($conversationIDs[$index]);
148 // remove unaccessible conversations
149 if (!empty($conversationIDs)) {
150 foreach ($conversations as $index => $conversation) {
151 if (in_array($conversation->conversationID
, $conversationIDs)) {
152 unset($conversations[$index]);
158 foreach ($conversations as $conversation) {
159 $this->conversations
[$conversation->conversationID
] = $conversation;
164 * Validates if user may close the given conversations.
168 protected function validateClose() {
169 $conversationIDs = [];
171 foreach ($this->conversations
as $conversation) {
172 if (!$conversation->isClosed
&& $conversation->userID
== WCF
::getUser()->userID
) {
173 $conversationIDs[] = $conversation->conversationID
;
177 return $conversationIDs;
181 * Validates conversations available for leaving.
185 public function validateLeave() {
187 foreach ($this->conversations
as $conversation) {
188 $tmpIDs[] = $conversation->conversationID
;
191 $conditions = new PreparedStatementConditionBuilder();
192 $conditions->add("conversationID IN (?)", [$tmpIDs]);
193 $conditions->add("participantID = ?", [WCF
::getUser()->userID
]);
194 $conditions->add("hideConversation <> ?", [1]);
196 $sql = "SELECT conversationID
197 FROM wcf".WCF_N
."_conversation_to_user
199 $statement = WCF
::getDB()->prepareStatement($sql);
200 $statement->execute($conditions->getParameters());
202 return $statement->fetchAll(\PDO
::FETCH_COLUMN
);
206 * Validates conversations applicable for mark as read.
210 public function validateMarkAsRead() {
211 $conversationIDs = [];
213 $conditions = new PreparedStatementConditionBuilder();
214 $conditions->add("conversationID IN (?)", [array_keys($this->conversations
)]);
215 $conditions->add("participantID = ?", [WCF
::getUser()->userID
]);
217 $sql = "SELECT conversationID, lastVisitTime
218 FROM wcf".WCF_N
."_conversation_to_user
220 $statement = WCF
::getDB()->prepareStatement($sql);
221 $statement->execute($conditions->getParameters());
223 while (($row = $statement->fetchArray())) {
224 $lastVisitTime[$row['conversationID']] = $row['lastVisitTime'];
227 foreach ($this->conversations
as $conversation) {
228 if (isset($lastVisitTime[$conversation->conversationID
]) && $lastVisitTime[$conversation->conversationID
] < $conversation->lastPostTime
) {
229 $conversationIDs[] = $conversation->conversationID
;
233 return $conversationIDs;
237 * Validates if user may open the given conversations.
241 protected function validateOpen() {
242 $conversationIDs = [];
244 foreach ($this->conversations
as $conversation) {
245 if ($conversation->isClosed
&& $conversation->userID
== WCF
::getUser()->userID
) {
246 $conversationIDs[] = $conversation->conversationID
;
250 return $conversationIDs;
254 * Validates conversations available for restore.
258 public function validateRestore() {
260 foreach ($this->conversations
as $conversation) {
261 $tmpIDs[] = $conversation->conversationID
;
264 $conditions = new PreparedStatementConditionBuilder();
265 $conditions->add("conversationID IN (?)", [$tmpIDs]);
266 $conditions->add("participantID = ?", [WCF
::getUser()->userID
]);
267 $conditions->add("hideConversation <> ?", [0]);
269 $sql = "SELECT conversationID
270 FROM wcf".WCF_N
."_conversation_to_user
272 $statement = WCF
::getDB()->prepareStatement($sql);
273 $statement->execute($conditions->getParameters());
275 return $statement->fetchAll(\PDO
::FETCH_COLUMN
);