Reformat SQL queries using spaces
[GitHub/WoltLab/com.woltlab.wcf.conversation.git] / files / lib / system / worker / ConversationMessageRebuildDataWorker.class.php
CommitLineData
336dfb29 1<?php
fea86294 2
336dfb29 3namespace wcf\system\worker;
fea86294 4
b3a3f633 5use wcf\data\conversation\message\ConversationMessage;
ab23892e 6use wcf\data\conversation\message\ConversationMessageList;
92caef17 7use wcf\data\object\type\ObjectTypeCache;
0b99ca23 8use wcf\system\bbcode\BBCodeHandler;
cad98036 9use wcf\system\html\input\HtmlInputProcessor;
28bd6cbd 10use wcf\system\message\embedded\object\MessageEmbeddedObjectManager;
336dfb29 11use wcf\system\search\SearchIndexManager;
92caef17 12use wcf\system\WCF;
336dfb29
MW
13
14/**
15 * Worker implementation for updating conversation messages.
fea86294
TD
16 *
17 * @author Marcel Werk
18 * @copyright 2001-2019 WoltLab GmbH
19 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
20 * @package WoltLabSuite\Core\System\Worker
21 *
22 * @method ConversationMessageList getObjectList()
336dfb29 23 */
fea86294
TD
24class ConversationMessageRebuildDataWorker extends AbstractRebuildDataWorker
25{
26 /**
27 * @inheritDoc
28 */
29 protected $limit = 500;
30
31 /**
32 * @var HtmlInputProcessor
33 */
34 protected $htmlInputProcessor;
35
fea86294
TD
36 /**
37 * @inheritDoc
38 */
39 public function countObjects()
40 {
41 if ($this->count === null) {
42 $this->count = 0;
8fbd8b01
MS
43 $sql = "SELECT MAX(messageID) AS messageID
44 FROM wcf" . WCF_N . "_conversation_message";
fea86294
TD
45 $statement = WCF::getDB()->prepareStatement($sql);
46 $statement->execute();
47 $row = $statement->fetchArray();
48 if ($row !== false) {
49 $this->count = $row['messageID'];
50 }
51 }
52 }
53
fea86294
TD
54 /**
55 * @inheritDoc
56 */
57 protected function initObjectList()
58 {
59 $this->objectList = new ConversationMessageList();
60 $this->objectList->sqlOrderBy = 'conversation_message.messageID';
61 $this->objectList->sqlSelects = '(SELECT subject FROM wcf' . WCF_N . '_conversation WHERE conversationID = conversation_message.conversationID) AS subject';
62 }
63
64 /**
65 * @inheritDoc
66 */
67 public function execute()
68 {
69 $this->objectList->getConditionBuilder()->add(
70 'conversation_message.messageID BETWEEN ? AND ?',
71 [$this->limit * $this->loopCount + 1, $this->limit * $this->loopCount + $this->limit]
72 );
73
74 parent::execute();
75
76 if (!$this->loopCount) {
77 // reset search index
78 SearchIndexManager::getInstance()->reset('com.woltlab.wcf.conversation.message');
79 }
80
81 if (!\count($this->objectList)) {
82 return;
83 }
84
85 // prepare statements
86 $attachmentObjectType = ObjectTypeCache::getInstance()
87 ->getObjectTypeByName('com.woltlab.wcf.attachment.objectType', 'com.woltlab.wcf.conversation.message');
8fbd8b01
MS
88 $sql = "SELECT COUNT(*) AS attachments
89 FROM wcf" . WCF_N . "_attachment
90 WHERE objectTypeID = ?
91 AND objectID = ?";
fea86294
TD
92 $attachmentStatement = WCF::getDB()->prepareStatement($sql);
93
94 // retrieve permissions
95 $userIDs = [];
96 foreach ($this->objectList as $object) {
97 // passing `0` is actually valid, because it won't yield any results when querying the group membership
98 $userIDs[] = ($object->userID ?: 0);
99 }
100 $userPermissions = $this->getBulkUserPermissions($userIDs, ['user.message.disallowedBBCodes']);
101
102 $updateData = [];
103 /** @var ConversationMessage $message */
104 foreach ($this->objectList as $message) {
105 SearchIndexManager::getInstance()->set(
106 'com.woltlab.wcf.conversation.message',
107 $message->messageID,
108 $message->message,
109 $message->subject ?: '',
110 $message->time,
111 $message->userID,
112 $message->username
113 );
114
115 $data = [];
116
117 // count attachments
118 $attachmentStatement->execute([$attachmentObjectType->objectTypeID, $message->messageID]);
119 $data['attachments'] = $attachmentStatement->fetchSingleColumn();
120
121 BBCodeHandler::getInstance()->setDisallowedBBCodes(\explode(
122 ',',
123 $this->getBulkUserPermissionValue($userPermissions, $message->userID, 'user.message.disallowedBBCodes')
124 ));
125
126 // update message
127 $data['enableHtml'] = 1;
128 if (!$message->enableHtml) {
129 $this->getHtmlInputProcessor()->process(
130 $message->message,
131 'com.woltlab.wcf.conversation.message',
132 $message->messageID,
133 true
134 );
135 $data['message'] = $this->getHtmlInputProcessor()->getHtml();
136 } else {
137 $this->getHtmlInputProcessor()->reprocess(
138 $message->message,
139 'com.woltlab.wcf.conversation.message',
140 $message->messageID
141 );
142 $data['message'] = $this->getHtmlInputProcessor()->getHtml();
143 }
144
145 if (MessageEmbeddedObjectManager::getInstance()->registerObjects($this->getHtmlInputProcessor(), true)) {
146 $data['hasEmbeddedObjects'] = 1;
147 } else {
148 $data['hasEmbeddedObjects'] = 0;
149 }
150
151 $updateData[$message->messageID] = $data;
152 }
153
154 $sql = "UPDATE wcf" . WCF_N . "_conversation_message
8fbd8b01
MS
155 SET attachments = ?,
156 message = ?,
157 enableHtml = ?,
158 hasEmbeddedObjects = ?
159 WHERE messageID = ?";
fea86294
TD
160 $statement = WCF::getDB()->prepareStatement($sql);
161
162 WCF::getDB()->beginTransaction();
163 foreach ($updateData as $messageID => $data) {
164 $statement->execute([
165 $data['attachments'],
166 $data['message'],
167 $data['enableHtml'],
168 $data['hasEmbeddedObjects'],
169 $messageID,
170 ]);
171 }
172 WCF::getDB()->commitTransaction();
173
174 MessageEmbeddedObjectManager::getInstance()->commitBulkOperation();
175 }
176
177 /**
178 * @return HtmlInputProcessor
179 */
180 protected function getHtmlInputProcessor()
181 {
182 if ($this->htmlInputProcessor === null) {
183 $this->htmlInputProcessor = new HtmlInputProcessor();
184 }
185
186 return $this->htmlInputProcessor;
187 }
336dfb29 188}