3 namespace wcf\system\worker
;
5 use wcf\data\conversation\message\ConversationMessage
;
6 use wcf\data\conversation\message\ConversationMessageList
;
7 use wcf\data\
object\type\ObjectTypeCache
;
8 use wcf\system\bbcode\BBCodeHandler
;
9 use wcf\system\html\input\HtmlInputProcessor
;
10 use wcf\system\message\embedded\
object\MessageEmbeddedObjectManager
;
11 use wcf\system\search\SearchIndexManager
;
15 * Worker implementation for updating conversation messages.
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
22 * @method ConversationMessageList getObjectList()
24 class ConversationMessageRebuildDataWorker
extends AbstractRebuildDataWorker
29 protected $limit = 500;
32 * @var HtmlInputProcessor
34 protected $htmlInputProcessor;
39 public function countObjects()
41 if ($this->count
=== null) {
43 $sql = "SELECT MAX(messageID) AS messageID
44 FROM wcf" . WCF_N
. "_conversation_message";
45 $statement = WCF
::getDB()->prepareStatement($sql);
46 $statement->execute();
47 $row = $statement->fetchArray();
49 $this->count
= $row['messageID'];
57 protected function initObjectList()
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';
67 public function execute()
69 $this->objectList
->getConditionBuilder()->add(
70 'conversation_message.messageID BETWEEN ? AND ?',
71 [$this->limit
* $this->loopCount +
1, $this->limit
* $this->loopCount +
$this->limit
]
76 if (!$this->loopCount
) {
78 SearchIndexManager
::getInstance()->reset('com.woltlab.wcf.conversation.message');
81 if (!\
count($this->objectList
)) {
86 $attachmentObjectType = ObjectTypeCache
::getInstance()
87 ->getObjectTypeByName('com.woltlab.wcf.attachment.objectType', 'com.woltlab.wcf.conversation.message');
88 $sql = "SELECT COUNT(*) AS attachments
89 FROM wcf" . WCF_N
. "_attachment
90 WHERE objectTypeID = ?
92 $attachmentStatement = WCF
::getDB()->prepareStatement($sql);
94 // retrieve permissions
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);
100 $userPermissions = $this->getBulkUserPermissions($userIDs, ['user.message.disallowedBBCodes']);
103 /** @var ConversationMessage $message */
104 foreach ($this->objectList
as $message) {
105 SearchIndexManager
::getInstance()->set(
106 'com.woltlab.wcf.conversation.message',
109 $message->subject ?
: '',
118 $attachmentStatement->execute([$attachmentObjectType->objectTypeID
, $message->messageID
]);
119 $data['attachments'] = $attachmentStatement->fetchSingleColumn();
121 BBCodeHandler
::getInstance()->setDisallowedBBCodes(\
explode(
123 $this->getBulkUserPermissionValue($userPermissions, $message->userID
, 'user.message.disallowedBBCodes')
127 $data['enableHtml'] = 1;
128 if (!$message->enableHtml
) {
129 $this->getHtmlInputProcessor()->process(
131 'com.woltlab.wcf.conversation.message',
135 $data['message'] = $this->getHtmlInputProcessor()->getHtml();
137 $this->getHtmlInputProcessor()->reprocess(
139 'com.woltlab.wcf.conversation.message',
142 $data['message'] = $this->getHtmlInputProcessor()->getHtml();
145 if (MessageEmbeddedObjectManager
::getInstance()->registerObjects($this->getHtmlInputProcessor(), true)) {
146 $data['hasEmbeddedObjects'] = 1;
148 $data['hasEmbeddedObjects'] = 0;
151 $updateData[$message->messageID
] = $data;
154 $sql = "UPDATE wcf" . WCF_N
. "_conversation_message
158 hasEmbeddedObjects = ?
159 WHERE messageID = ?";
160 $statement = WCF
::getDB()->prepareStatement($sql);
162 WCF
::getDB()->beginTransaction();
163 foreach ($updateData as $messageID => $data) {
164 $statement->execute([
165 $data['attachments'],
168 $data['hasEmbeddedObjects'],
172 WCF
::getDB()->commitTransaction();
174 MessageEmbeddedObjectManager
::getInstance()->commitBulkOperation();
178 * @return HtmlInputProcessor
180 protected function getHtmlInputProcessor()
182 if ($this->htmlInputProcessor
=== null) {
183 $this->htmlInputProcessor
= new HtmlInputProcessor();
186 return $this->htmlInputProcessor
;