1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
messageviewedflag.php
См. документацию.
1<?php
2
3namespace Bitrix\Im\Update;
4
5use Bitrix\Im\Model\EO_Message_Collection;
6use Bitrix\Im\Model\MessageTable;
7use Bitrix\Im\Model\MessageViewedTable;
8use Bitrix\Main\Config\Option;
9use Bitrix\Main\Entity\BooleanField;
10use Bitrix\Main\Loader;
11use Bitrix\Main\ORM\Fields\ExpressionField;
12use Bitrix\Main\Update\Stepper;
13
14final class MessageViewedFlag extends Stepper
15{
16 protected static $moduleId = 'im';
17 public const OPTION_NAME_LIMIT = 'message_viewed_flag_migration_limit';
18 public const OPTION_NAME_ITERATION_COUNT = 'message_viewed_flag_migration_iteration';
19 public const LIMIT_DEFAULT = 200;
20 public const ITERATION_COUNT_DEFAULT = 2;
21
23 {
24 if (!Loader::includeModule(self::$moduleId))
25 {
26 return self::CONTINUE_EXECUTION;
27 }
28
29 $numOfIterations = (int)Option::get(self::$moduleId, self::OPTION_NAME_ITERATION_COUNT, self::ITERATION_COUNT_DEFAULT);
30
31 $result = self::CONTINUE_EXECUTION;
32 for ($i = 0; $i < $numOfIterations; ++$i)
33 {
34 $result = $this->makeMigrationIteration($option);
35
36 if ($result === self::FINISH_EXECUTION)
37 {
38 return $result;
39 }
40 }
41
42 if (!$this->hasMoreViewedMessages($option['lastId'] ?? 0))
43 {
44 return self::FINISH_EXECUTION;
45 }
46
47 return $result;
48 }
49
50 private function makeMigrationIteration(array &$option): bool
51 {
52 $lastId = $option['lastId'] ?? 0;
53 $messages = $this->getMessages($lastId);
54
55 if ($messages->isEmpty())
56 {
57 return self::FINISH_EXECUTION;
58 }
59
60 $option['lastId'] = min($messages->getIdList());
61 $viewedMessageIds = $this->getViewedMessageIds($messages);
62 $this->setViewedFlag($viewedMessageIds);
63
64 return self::CONTINUE_EXECUTION;
65 }
66
67 private function getViewedMessageIds(EO_Message_Collection $messages): array
68 {
69 $result = [];
70
71 foreach ($messages as $message)
72 {
73 if ($message->get('IS_VIEWED'))
74 {
75 $result[] = $message->getId();
76 }
77 }
78
79 return $result;
80 }
81
82 private function getMessages(int $lastId): EO_Message_Collection
83 {
84 $subQuery = MessageViewedTable::query()
85 ->setSelect(['ID'])
86 ->where('MESSAGE_ID', new \Bitrix\Main\DB\SqlExpression('%s'))
87 ;
88 $expression = new ExpressionField('IS_VIEWED', "EXISTS({$subQuery->getQuery()})", ['ID']);
89 $expression->configureValueType(BooleanField::class);
90 $query = MessageTable::query()
91 ->setSelect(['ID', 'IS_VIEWED'])
92 ->registerRuntimeField('IS_VIEWED', $expression)
93 ->setOrder(['ID' => 'DESC'])
94 ->setLimit((int)Option::get(self::$moduleId, self::OPTION_NAME_LIMIT, self::LIMIT_DEFAULT))
95 ;
96
97 if ($lastId !== 0)
98 {
99 $query->where('ID', '<', $lastId);
100 }
101
102 return $query->fetchCollection();
103 }
104
105 private function hasMoreViewedMessages(int $lastId): bool
106 {
107 if ($lastId === 0)
108 {
109 return true;
110 }
111
112 $result = MessageViewedTable::query()
113 ->setSelect(['MESSAGE_ID'])
114 ->setOrder(['MESSAGE_ID' => 'DESC'])
115 ->where('MESSAGE_ID', '<', $lastId)
116 ->setLimit(1)
117 ->fetch()
118 ;
119
120 return $result !== false;
121 }
122
123 private function setViewedFlag(array $messageIds): void
124 {
125 if (empty($messageIds))
126 {
127 return;
128 }
129
130 MessageTable::updateMulti($messageIds, ['NOTIFY_READ' => 'Y'], true);
131 }
132}
execute(array &$option)
Определения messageviewedflag.php:22
if(!\Bitrix\Main\Loader::includeModule('clouds')) $lastId
Определения sync.php:68
</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
$query
Определения get_search.php:11
$message
Определения payment.php:8
$i
Определения factura.php:643
$messages
Определения template.php:8
$option
Определения options.php:1711