1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
MemberProvider.php
См. документацию.
1<?php
2
3declare(strict_types=1);
4
5namespace Bitrix\Im\V2\Chat\Member\Provider;
6
7use Bitrix\Im\Model\RelationTable;
8use Bitrix\Im\V2\Chat;
9use Bitrix\Im\V2\Chat\Member\MemberCollection;
10use Bitrix\Im\V2\Chat\Member\MemberCursor;
11use Bitrix\Im\V2\Common\ContextCustomer;
12use Bitrix\Main\ORM\Fields\ExpressionField;
13use Bitrix\Main\ORM\Fields\IntegerField;
14use Bitrix\Main\ORM\Query\Query;
15
17{
18 use ContextCustomer;
19
20 public const ROLE_PRIORITY_MAP = [
21 Chat::ROLE_OWNER => 1,
22 Chat::ROLE_MANAGER => 2,
23 Chat::ROLE_MEMBER => 3,
24 ];
25
26 protected Chat $chat;
27
28 public function __construct(int $chatId)
29 {
30 $this->chat = Chat::getInstance($chatId);
31 }
32
33 public function get(int $limit = 50, ?MemberCursor $cursor = null): MemberCollection
34 {
35 $query = RelationTable::query()
36 ->setSelect(['ID', 'USER_ID', 'ROLE'])
37 ->where('CHAT_ID', (int)$this->chat->getId())
38 ->setOrder(['ROLE_PRIORITY', 'ID'])
39 ->setLimit($limit)
40 ;
41
42 $this->prepareQuery($query, $cursor);
43 $rawResult = $query->fetchAll();
44
45 return MemberCollection::initByRawResult($rawResult);
46 }
47
48 public function getAllUserIds(): array
49 {
50 return $this->chat->getRelations()->getUserIds();
51 }
52
53 protected function prepareQuery(Query $query, ?MemberCursor $cursor): void
54 {
55 $this->defineRoles($query);
56 if ($cursor)
57 {
58 $this->applyCursor($query, $cursor);
59 }
60 }
61
62 protected function defineRoles(Query $query): void
63 {
64 $chatAuthorId = (int)$this->chat->getAuthorId();
65 $ownerRole = Chat::ROLE_OWNER;
66 $managerRole = Chat::ROLE_MANAGER;
67 $memberRole = Chat::ROLE_MEMBER;
68 $rolePriorityMap = self::ROLE_PRIORITY_MAP;
69
70 $roleField = new ExpressionField(
71 'ROLE',
72 "CASE
73 WHEN %s = {$chatAuthorId} THEN '{$ownerRole}'
74 WHEN %s = 'Y' THEN '{$managerRole}'
75 ELSE '{$memberRole}'
76 END",
77 ['USER_ID', 'MANAGER']
78 );
79 $query->registerRuntimeField('ROLE', $roleField);
80
81 $rolePriorityField = new ExpressionField(
82 'ROLE_PRIORITY',
83 "CASE
84 WHEN %s = '{$ownerRole}' THEN {$rolePriorityMap[$ownerRole]}
85 WHEN %s = '{$managerRole}' THEN {$rolePriorityMap[$managerRole]}
86 ELSE {$rolePriorityMap[$memberRole]}
87 END",
88 ['ROLE', 'ROLE']
89 );
90 $rolePriorityField->configureValueType(IntegerField::class);
91 $query->registerRuntimeField($rolePriorityField);
92 }
93
94 protected function applyCursor(Query $query, MemberCursor $cursor): void
95 {
96 $rolePriority = self::ROLE_PRIORITY_MAP[$cursor->role];
97 $filter = Query::filter()
98 ->logic('or')
99 ->where('ROLE_PRIORITY', '>', $rolePriority)
100 ->where(
101 Query::filter()
102 ->where('ROLE_PRIORITY', $rolePriority)
103 ->where('ID', '>', $cursor->relationId)
104 )
105 ;
106 $query->where($filter);
107 }
108}
static initByRawResult(array $rawResult)
Определения MemberCollection.php:20
prepareQuery(Query $query, ?MemberCursor $cursor)
Определения MemberProvider.php:53
applyCursor(Query $query, MemberCursor $cursor)
Определения MemberProvider.php:94
static getInstance()
Определения application.php:98
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$query
Определения get_search.php:11
$filter
Определения iblock_catalog_list.php:54
Определения chain.php:3