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
;
13 * Worker implementation for updating conversation messages.
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
20 * @method ConversationMessageList getObjectList()
22 class ConversationMessageRebuildDataWorker
extends AbstractRebuildDataWorker
{
26 protected $limit = 500;
29 * @var HtmlInputProcessor
31 protected $htmlInputProcessor;
33 /** @noinspection PhpMissingParentCallCommonInspection */
37 public function countObjects() {
38 if ($this->count
=== null) {
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'];
49 /** @noinspection PhpMissingParentCallCommonInspection */
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';
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
]);
67 if (!$this->loopCount
) {
69 SearchIndexManager
::getInstance()->reset('com.woltlab.wcf.conversation.message');
72 if (!count($this->objectList
)) {
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 = ?
82 $attachmentStatement = WCF
::getDB()->prepareStatement($sql);
84 // retrieve permissions
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);
90 $userPermissions = $this->getBulkUserPermissions($userIDs, ['user.message.disallowedBBCodes']);
93 /** @var ConversationMessage $message */
94 foreach ($this->objectList
as $message) {
95 SearchIndexManager
::getInstance()->set(
96 'com.woltlab.wcf.conversation.message',
99 $message->subject ?
: '',
108 $attachmentStatement->execute([$attachmentObjectType->objectTypeID
, $message->messageID
]);
109 $data['attachments'] = $attachmentStatement->fetchSingleColumn();
111 BBCodeHandler
::getInstance()->setDisallowedBBCodes(explode(',', $this->getBulkUserPermissionValue($userPermissions, $message->userID
, 'user.message.disallowedBBCodes')));
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();
120 $this->getHtmlInputProcessor()->reprocess($message->message
, 'com.woltlab.wcf.conversation.message', $message->messageID
);
121 $data['message'] = $this->getHtmlInputProcessor()->getHtml();
124 if (MessageEmbeddedObjectManager
::getInstance()->registerObjects($this->getHtmlInputProcessor(), true)) {
125 $data['hasEmbeddedObjects'] = 1;
128 $data['hasEmbeddedObjects'] = 0;
131 $updateData[$message->messageID
] = $data;
134 $sql = "UPDATE wcf".WCF_N
."_conversation_message
138 hasEmbeddedObjects = ?
139 WHERE messageID = ?";
140 $statement = WCF
::getDB()->prepareStatement($sql);
142 WCF
::getDB()->beginTransaction();
143 foreach ($updateData as $messageID => $data) {
144 $statement->execute([
145 $data['attachments'],
148 $data['hasEmbeddedObjects'],
152 WCF
::getDB()->commitTransaction();
154 MessageEmbeddedObjectManager
::getInstance()->commitBulkOperation();
158 * @return HtmlInputProcessor
160 protected function getHtmlInputProcessor() {
161 if ($this->htmlInputProcessor
=== null) {
162 $this->htmlInputProcessor
= new HtmlInputProcessor();
165 return $this->htmlInputProcessor
;