59 $lastChatMessageId = $this->chat->getLastMessageId();
60 $prevChatMessageId = $this->chat->getPrevMessageId();
62 $intersection = array_intersect(
68 $this->messages->getIds(),
71 if (empty($intersection))
76 $lastMessages = MessageTable::query()
77 ->setSelect([
'ID',
'DATE_CREATE',
'MESSAGE'])
78 ->where(
'CHAT_ID', $this->chat->getChatId())
79 ->whereNotIn(
'ID', $this->messages->getIds())
80 ->setOrder([
'DATE_CREATE' =>
'DESC',
'ID' =>
'DESC'])
84 $nullMessage = [
'ID' => 0,
'DATE_CREATE' => (
new DateTime()),
'MESSAGE' =>
''];
86 if (isset($intersection[2]))
88 $this->chatLastMessage = $lastMessages[0] ?? $nullMessage;
89 $this->chatPrevMessage = $lastMessages[1] ?? $nullMessage;
91 elseif (isset($intersection[1]))
93 $this->chatPrevMessage = $lastMessages[1] ?? $nullMessage;
101 (new \Bitrix\Im\V2\Link\Favorite\FavoriteService())->unmarkMessagesAsFavoriteForAll($this->messages);
102 (new \Bitrix\Im\V2\Message\ReadService())->deleteByMessages(
104 $this->chat->getRelations()->getUserIds()
107 $this->messages->unpin(clearParams:
false);
109 if (Loader::includeModule(
'tasks'))
113 foreach ($taskCollection as $taskItem)
115 $taskItem->setMessageId(0);
118 (
new TaskService())->updateTaskLinks($taskCollection);
121 if (Loader::includeModule(
'calendar'))
123 $calendarCollection = CalendarCollection::getByMessages($this->messages);
125 foreach ($calendarCollection as $calendarItem)
127 $calendarItem->setMessageId(0);
133 $this->messages->deleteParams();
136 $tablesToDeleteRow = [
137 'b_im_message_uuid' =>
'im',
138 'b_im_message_favorite' =>
'im',
139 'b_im_message_disappearing' =>
'im',
140 'b_im_message_index' =>
'im',
141 'b_im_link_reminder' =>
'im',
142 'b_imconnectors_delivery_mark' =>
'imconnector',
145 foreach ($tablesToDeleteRow as
$table => $module)
147 if ($module !==
'im' && !Loader::includeModule($module))
152 "DELETE FROM " .
$table .
" WHERE MESSAGE_ID IN ( "
153 . implode(
', ', $this->messages->getIds())
159 if (!$resultGetComments->isSuccess())
164 foreach ($resultGetComments->getResult() as
$chat)
166 $chat?->deleteChat();
174 if (isset($this->chatLastMessage) && $this->chatLastMessage)
176 $this->chat->setLastMessageId((
int)($this->chatLastMessage[
'ID'] ?? 0));
179 if (isset($this->chatPrevMessage) && $this->chatPrevMessage)
181 $this->chat->setPrevMessageId((
int)($this->chatPrevMessage[
'ID'] ?? 0));
184 $this->chat->setMessageCount($this->chat->getMessageCount() - $this->messages->count());
186 $this->updateRelation();
191 if (isset($this->chatLastMessage) && !in_array((
int)$this->chatLastMessage[
'ID'], $this->messages->getIds(),
true))
194 'DATE_MESSAGE' => $this->chatLastMessage[
'DATE_CREATE'],
195 'DATE_LAST_ACTIVITY' => $this->chatLastMessage[
'DATE_CREATE'],
196 'DATE_UPDATE' => $this->chatLastMessage[
'DATE_CREATE'],
197 'ITEM_MID' => $this->chatLastMessage[
'ID'] ?? 0,
202 $userIds = array_values($this->chat?->getRelations()->getUserIds());
204 $opponentId = $this->chat?->getCompanion(
$userId)->getId();
205 RecentTable::updateByFilter(
208 '=ITEM_TYPE' => Chat::IM_TYPE_PRIVATE,
209 '=ITEM_ID' => $opponentId
213 RecentTable::updateByFilter(
215 '=USER_ID' => $opponentId,
216 '=ITEM_TYPE' => Chat::IM_TYPE_PRIVATE,
224 RecentTable::updateByFilter(
225 [
'=ITEM_TYPE' => $this->chat->getType(),
'=ITEM_ID' => $this->chat->getId()],
258 if (isset($this->previousMessageIds))
264 $ids = $this->messages->getIds();
266 foreach ($this->messages as
$message)
268 $result = MessageTable::query()
270 ->where(
'CHAT_ID',
$message->getChatId())
271 ->where(
'ID',
'<',
$message->getMessageId())
272 ->where(
'DATE_CREATE',
'<=',
$message->getDateCreate())
273 ->setOrder([
'DATE_CREATE' =>
'DESC',
'ID' =>
'DESC'])
278 $previousMessageId = (int)(
$result[
'ID'] ?? 0);
282 $getPreviousId =
static function (
int $currentId) use (&$getPreviousId, &
$previousMessageIds, &$ids):
int {
298 $prevId = $getPreviousId($currentMessageId);
299 $result[$prevId][] = $currentMessageId;
302 $this->previousMessageIds =
$result;