1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
CategoryService.php
См. документацию.
1<?php
2
3namespace Bitrix\Calendar\OpenEvents\Service;
4
5use Bitrix\Calendar\Core\EventCategory\EventCategory;
6use Bitrix\Calendar\Core\Mappers\EventCategory as EventCategoryMapper;
7use Bitrix\Calendar\Core\Mappers\Factory;
8use Bitrix\Calendar\EventCategory\Event\AfterEventCategoryUpdate;
9use Bitrix\Calendar\EventOption\Helper\EventOptionHelper;
10use Bitrix\Calendar\Internals\EventTable;
11use Bitrix\Calendar\Internals\Exception\PermissionDenied;
12use Bitrix\Calendar\OpenEvents\Internals\OpenEventCategoryTable;
13use Bitrix\Calendar\OpenEvents\Internals\OpenEventOptionTable;
14use Bitrix\Main\Application;
15use Bitrix\Main\DB\Connection;
16use Bitrix\Main\DB\SqlExpression;
17use Bitrix\Main\DI\ServiceLocator;
18use Bitrix\Main\Entity\ReferenceField;
19use Bitrix\Main\ORM\Query\Join;
20use Bitrix\Main\Text\Emoji;
21use Bitrix\Calendar\OpenEvents\Controller\Request\EventCategory as RequestDto;
22use Bitrix\Calendar\Integration;
23
24final class CategoryService
25{
26 private static ?self $instance;
27
28 public static function getInstance(): self
29 {
30 self::$instance ??= new self();
31
32 return self::$instance;
33 }
34
35 public function createEventCategory(
36 int $userId,
37 RequestDto\CreateEventCategoryDto $createEventCategoryDto
39 {
40 $eventCategory = new EventCategory();
41 $eventCategory->setName(Emoji::encode($createEventCategoryDto->name));
42 $eventCategory->setDescription(Emoji::encode($createEventCategoryDto->description));
43 $eventCategory->setCreatorId($userId);
44
45 // if channelId selected, than ignore next request fields: attendees, departmentIds, closed
46 if ($createEventCategoryDto->channelId)
47 {
48 $attendeeUserIds = $this->processCategoryCreationByChannel(
49 $userId,
50 $eventCategory,
51 $createEventCategoryDto->channelId
52 );
53 }
54 else
55 {
56 $attendeeUserIds = $this->processCategoryCreationByRequest(
57 $userId,
58 $eventCategory,
59 $createEventCategoryDto
60 );
61 }
62
63 $this->getEventCategoryMapper()->create($eventCategory);
64
65 if (!empty($attendeeUserIds))
66 {
67 CategoryAttendeeService::getInstance()->addAttendeesToCategory(
68 $eventCategory->getId(),
69 $attendeeUserIds,
70 );
71 }
72
73 if(!$eventCategory->getClosed())
74 {
75 CategoryMuteService::getInstance()->setMutedByDefault($eventCategory->getId());
76 }
77
78 return $eventCategory;
79 }
80
81 public function updateEventCategory(
82 int $userId,
83 EventCategory $eventCategory,
84 RequestDto\UpdateEventCategoryDto $updateEventCategoryDto
85 ): void
86 {
87 $name = $updateEventCategoryDto->name;
88 if (!empty($name) && $eventCategory->getName() !== $name)
89 {
90 $eventCategory->setName(Emoji::encode($name));
91 }
92
93 $description = $updateEventCategoryDto->description;
94 if ($eventCategory->getDescription() !== $description)
95 {
96 $eventCategory->setDescription(Emoji::encode($description));
97 }
98
99 $closed = $updateEventCategoryDto->closed;
100 if ($closed !== null && $eventCategory->getClosed() !== $closed)
101 {
102 $eventCategory->setClosed($closed);
103 }
104
105 $attendeeEntities = $updateEventCategoryDto->attendees;
106 if ($attendeeEntities)
107 {
108 CategoryAttendeeService::getInstance()->processAttendeesForExistCategory(
109 $userId,
110 $eventCategory,
111 $attendeeEntities
112 );
113 }
114
115 $this->getEventCategoryMapper()->update($eventCategory);
116 }
117
118 public function deleteEventCategory(EventCategory $eventCategory): void
119 {
120 // TODO: need transaction?
122 $connection = Application::getInstance()->getConnection();
123 $connection->startTransaction();
124 $this->getEventCategoryMapper()->delete($eventCategory);
126 {
127 $connection->rollbackTransaction();
128
129 throw new \RuntimeException();
130 }
131
132 $connection->commitTransaction();
133 }
134
135 public function updateEventsCounter(int $eventCategoryId, bool $increment = true, int $value = 1): void
136 {
137 $incdecParts[] = $increment ? '+' : '-';
138 $incdecParts[] = $value;
139 OpenEventCategoryTable::update($eventCategoryId, [
140 'EVENTS_COUNT' => new SqlExpression('?# ' . implode('', $incdecParts), 'EVENTS_COUNT'),
141 ]);
142
143 $this->getEventCategoryMapper()->resetCacheById($eventCategoryId);
144
145 (new AfterEventCategoryUpdate($eventCategoryId))->emit();
146 }
147
148 public function updateLastActivity(int $eventCategoryId): void
149 {
150 $lastEventQuery = OpenEventOptionTable::query()
151 ->setSelect([
152 'EVENT_ID',
153 ])
154 ->registerRuntimeField(
155 new ReferenceField(
156 'EVENT',
157 EventTable::getEntity(),
158 Join::on('this.EVENT_ID', 'ref.ID'),
159 ),
160 )
161 ->where('CATEGORY_ID', $eventCategoryId)
162 ->where('EVENT.DELETED', 'N')
163 ->setOrder(['EVENT_ID' => 'DESC'])
164 ->setLimit(1)
165 ;
166
167 $lastEventId = (int)($lastEventQuery->fetch()['EVENT_ID'] ?? 0);
168
169 if ($lastEventId > 0)
170 {
171 $dateCreateQuery = EventTable::query()
172 ->setSelect(['DATE_CREATE'])
173 ->where('ID', $lastEventId)
174 ;
175 }
176 else
177 {
178 $dateCreateQuery = OpenEventCategoryTable::query()
179 ->setSelect(['DATE_CREATE'])
180 ->where('ID', $eventCategoryId)
181 ;
182 }
183
184 $dateCreate = $dateCreateQuery->fetch()['DATE_CREATE'] ?? null;
185
186 if ($dateCreate === null)
187 {
188 return;
189 }
190
191 OpenEventCategoryTable::update($eventCategoryId, [
192 'LAST_ACTIVITY' => $dateCreate,
193 ]);
194
195 $this->getEventCategoryMapper()->resetCacheById($eventCategoryId);
196
197 (new AfterEventCategoryUpdate($eventCategoryId))->emit();
198 }
199
200 private function processCategoryCreationByChannel(int $userId, EventCategory $eventCategory, int $channelId): array
201 {
203 $imIntegrationService = ServiceLocator::getInstance()->get(Integration\Im\EventCategoryServiceInterface::class);
204
205 $hasAccess = $imIntegrationService->isManagerOfChannel($userId, $channelId);
206 if (!$hasAccess)
207 {
208 throw new PermissionDenied();
209 }
210
211 $imIntegrationService->connectChannelToCategory($channelId);
212 $eventCategory->setChannelId($channelId);
213 $eventCategory->setClosed($imIntegrationService->isChannelPrivate($channelId));
214
215 $imIntegrationService->updateChannel($eventCategory);
216
217 return $eventCategory->getClosed() ? $imIntegrationService->getChannelUsers($channelId) : [];
218 }
219
220 private function processCategoryCreationByRequest(
221 int $userId,
222 EventCategory $eventCategory,
223 RequestDto\CreateEventCategoryDto $createEventCategoryDto
224 ): array
225 {
226 $eventCategory->setClosed($createEventCategoryDto->closed);
227 $attendeesEntities = $createEventCategoryDto->attendees;
228 $attendeeUserIds = [];
229 if ($attendeesEntities && $createEventCategoryDto->closed)
230 {
231 $attendeeUserIds = CategoryAttendeeService::getInstance()->processAttendeesForNewCategory(
232 $userId,
233 $eventCategory,
234 $attendeesEntities,
235 );
236 }
237
238 $departmentIds = [];
239 if ($createEventCategoryDto->closed || $createEventCategoryDto->isPrimary)
240 {
241 $departmentIds = $createEventCategoryDto->departmentIds;
242 }
243
245 $imIntegrationService = ServiceLocator::getInstance()->get(Integration\Im\EventCategoryServiceInterface::class);
246 $channelId = $imIntegrationService->createChannel($eventCategory, $attendeeUserIds, $departmentIds);
247 $eventCategory->setChannelId($channelId);
248
249 return $attendeeUserIds;
250 }
251
252 private function getEventCategoryMapper(): EventCategoryMapper
253 {
255 $mapperFactory = ServiceLocator::getInstance()->get('calendar.service.mappers.factory');
256
257 return $mapperFactory->getEventCategory();
258 }
259
260 private function __construct()
261 {
262 }
263}
$connection
Определения actionsdefinitions.php:38
if(empty( $fields)) foreach($fields as $field) $channelId
Определения push.php:23
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
setDescription(?string $description)
Определения eventcategory.php:74
static changeCategoryForEvents(int $prevCategory, int $newCategoryId=self::SYSTEM_CATEGORY_ID)
Определения EventOptionHelper.php:13
updateEventCategory(int $userId, EventCategory $eventCategory, RequestDto\UpdateEventCategoryDto $updateEventCategoryDto)
Определения CategoryService.php:81
updateLastActivity(int $eventCategoryId)
Определения CategoryService.php:148
updateEventsCounter(int $eventCategoryId, bool $increment=true, int $value=1)
Определения CategoryService.php:135
createEventCategory(int $userId, RequestDto\CreateEventCategoryDto $createEventCategoryDto)
Определения CategoryService.php:35
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
if(Loader::includeModule( 'bitrix24')) elseif(Loader::includeModule('intranet') &&CIntranetUtils::getPortalZone() !=='ru') $description
Определения .description.php:24
$name
Определения menu_edit.php:35