1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
CompleteDeletionStrategy.php
См. документацию.
1<?php
2
4
19
21{
22 protected ?array $chatLastMessage = null;
23 protected ?array $chatPrevMessage = null;
24 protected ?array $previousMessageIds = null;
25
29 protected function onBeforeDelete(): void
30 {
31 if ($this->chat instanceof Chat\NullChat)
32 {
34 (new Result())->addError(new ChatError(ChatError::NOT_FOUND))
35 );
36 }
37
38 $this->messages->fillFiles();
39
41 if ($this->messages->count() !== 0)
42 {
43 $this->deleteLinks();
44 $this->recountChat();
45 }
46 }
47
51 protected function execute(): void
52 {
53 $result = $this->messages->delete();
54 $this->checkResult($result);
55 }
56
57 protected function fillChatPreviousMessages(): void
58 {
59 $lastChatMessageId = $this->chat->getLastMessageId();
60 $prevChatMessageId = $this->chat->getPrevMessageId();
61
62 $intersection = array_intersect(
63 [
64 0,
65 $prevChatMessageId,
66 $lastChatMessageId,
67 ],
68 $this->messages->getIds(),
69 );
70
71 if (empty($intersection))
72 {
73 return;
74 }
75
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'])
81 ->setLimit(2)
82 ->fetchAll();
83
84 $nullMessage = ['ID' => 0, 'DATE_CREATE' => (new DateTime()), 'MESSAGE' => ''];
85
86 if (isset($intersection[2]))
87 {
88 $this->chatLastMessage = $lastMessages[0] ?? $nullMessage;
89 $this->chatPrevMessage = $lastMessages[1] ?? $nullMessage;
90 }
91 elseif (isset($intersection[1]))
92 {
93 $this->chatPrevMessage = $lastMessages[1] ?? $nullMessage;
94 }
95 }
96
97 protected function deleteLinks()
98 {
99 $connection = Application::getConnection();
100
101 (new \Bitrix\Im\V2\Link\Favorite\FavoriteService())->unmarkMessagesAsFavoriteForAll($this->messages);
102 (new \Bitrix\Im\V2\Message\ReadService())->deleteByMessages(
103 $this->messages,
104 $this->chat->getRelations()->getUserIds()
105 );
106
107 $this->messages->unpin(clearParams: false);
108
109 if (Loader::includeModule('tasks'))
110 {
111 $taskCollection = TaskCollection::getByMessages($this->messages);
112
113 foreach ($taskCollection as $taskItem)
114 {
115 $taskItem->setMessageId(0);
116 }
117
118 (new TaskService())->updateTaskLinks($taskCollection);
119 }
120
121 if (Loader::includeModule('calendar'))
122 {
123 $calendarCollection = CalendarCollection::getByMessages($this->messages);
124
125 foreach ($calendarCollection as $calendarItem)
126 {
127 $calendarItem->setMessageId(0);
128 }
129
130 (new CalendarService())->updateCalendarLinks($calendarCollection);
131 }
132
133 $this->messages->deleteParams();
134
135 // delete unused rows in db
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',
143 ];
144
145 foreach ($tablesToDeleteRow as $table => $module)
146 {
147 if ($module !== 'im' && !Loader::includeModule($module))
148 {
149 continue;
150 }
151 $connection->query(
152 "DELETE FROM " . $table . " WHERE MESSAGE_ID IN ( "
153 . implode(', ', $this->messages->getIds())
154 . " ) "
155 );
156 }
157
158 $resultGetComments = CommentChat::getChatsByMessages($this->messages);
159 if (!$resultGetComments->isSuccess())
160 {
161 return;
162 }
163
164 foreach ($resultGetComments->getResult() as $chat)
165 {
166 $chat?->deleteChat();
167 }
168 }
169
170 protected function recountChat()
171 {
172 $this->updateRecent();
173
174 if (isset($this->chatLastMessage) && $this->chatLastMessage)
175 {
176 $this->chat->setLastMessageId((int)($this->chatLastMessage['ID'] ?? 0));
177 }
178
179 if (isset($this->chatPrevMessage) && $this->chatPrevMessage)
180 {
181 $this->chat->setPrevMessageId((int)($this->chatPrevMessage['ID'] ?? 0));
182 }
183
184 $this->chat->setMessageCount($this->chat->getMessageCount() - $this->messages->count());
185 $this->chat->save();
186 $this->updateRelation();
187 }
188
189 protected function updateRecent(): void
190 {
191 if (isset($this->chatLastMessage) && !in_array((int)$this->chatLastMessage['ID'], $this->messages->getIds(), true))
192 {
193 $update = [
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,
198 ];
199
200 if ($this->chat instanceof Chat\PrivateChat || $this->chat->getType() === Chat::IM_TYPE_PRIVATE)
201 {
202 $userIds = array_values($this->chat?->getRelations()->getUserIds());
203 $userId = $userIds[0];
204 $opponentId = $this->chat?->getCompanion($userId)->getId();
205 RecentTable::updateByFilter(
206 [
207 '=USER_ID' => $userId,
208 '=ITEM_TYPE' => Chat::IM_TYPE_PRIVATE,
209 '=ITEM_ID' => $opponentId
210 ],
211 $update
212 );
213 RecentTable::updateByFilter(
214 [
215 '=USER_ID' => $opponentId,
216 '=ITEM_TYPE' => Chat::IM_TYPE_PRIVATE,
217 '=ITEM_ID' => $userId
218 ],
219 $update
220 );
221 }
222 else
223 {
224 RecentTable::updateByFilter(
225 ['=ITEM_TYPE' => $this->chat->getType(), '=ITEM_ID' => $this->chat->getId()],
226 $update
227 );
228 }
229 }
230 }
231
232 private function updateRelation(): void
233 {
234 $prevMessageIds = $this->getPreviousMessageIds();
235 $conditionString = '';
236 foreach ($prevMessageIds as $newLastId => $oldLastIds)
237 {
238 if (empty($oldLastIds) || !isset($newLastId))
239 {
240 continue;
241 }
242
243 $conditionString .= "WHEN LAST_ID IN (" . implode(',', $oldLastIds) .") THEN {$newLastId}\n";
244 }
245
246 Application::getConnection()->query("
247 UPDATE b_im_relation
248 SET LAST_ID = CASE
249 {$conditionString}
250 ELSE LAST_ID
251 END
252 WHERE CHAT_ID = {$this->chat->getChatId()}
253 ");
254 }
255
256 protected function getPreviousMessageIds(): ?array
257 {
258 if (isset($this->previousMessageIds))
259 {
261 }
262
264 $ids = $this->messages->getIds();
265
266 foreach ($this->messages as $message)
267 {
268 $result = MessageTable::query()
269 ->setSelect(['ID'])
270 ->where('CHAT_ID', $message->getChatId())
271 ->where('ID', '<', $message->getMessageId())
272 ->where('DATE_CREATE', '<=', $message->getDateCreate())
273 ->setOrder(['DATE_CREATE' => 'DESC', 'ID' => 'DESC'])
274 ->setLimit(1)
275 ->fetch()
276 ;
277
278 $previousMessageId = (int)($result['ID'] ?? 0);
279 $previousMessageIds[$message->getId()] = $previousMessageId;
280 }
281
282 $getPreviousId = static function (int $currentId) use (&$getPreviousId, &$previousMessageIds, &$ids): int {
283 if (in_array($previousMessageIds[$currentId], $ids, true))
284 {
285 $prevId = $getPreviousId($previousMessageIds[$currentId]);
286 $previousMessageIds[$currentId] = $prevId;
287
288 return $prevId;
289 }
290
291 return $previousMessageIds[$currentId];
292 };
293
294 $result = [];
295
296 foreach ($previousMessageIds as $currentMessageId => $previousMessageId)
297 {
298 $prevId = $getPreviousId($currentMessageId);
299 $result[$prevId][] = $currentMessageId;
300 }
301
302 $this->previousMessageIds = $result;
303
304 return $result;
305 }
306
307 protected function onAfterDelete(): void
308 {
309 $this->logToSync(Event::COMPLETE_DELETE_EVENT);
310 $this->deleteFiles();
311 }
312}
$connection
Определения actionsdefinitions.php:38
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static getType($chatData, bool $camelCase=true)
Определения chat.php:45
const NOT_FOUND
Определения ChatError.php:20
static getChatsByMessages(MessageCollection $messages)
Определения CommentChat.php:64
Определения result.php:20
Определения loader.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$table
Определения mysql_to_pgsql.php:36
$message
Определения payment.php:8
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393