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