32 $this->userId = $userId ?? (int)CurrentUser::get()->getId();
39 $categoryResult = OpenEventCategoryTable::query()
40 ->setSelect([
'ID',
'CHANNEL_ID',
'NAME'])
41 ->whereIn(
'ID', $categoryIds)
45 while($category = $categoryResult->fetchObject())
48 $collection->add($category);
59 name: Loc::getMessage(
'CALENDAR_OPEN_EVENTS_ALL_EVENTS'),
60 description: Loc::getMessage(
'CALENDAR_OPEN_EVENTS_ALL_EVENTS'),
72 $category = OpenEventCategoryTable::query()
83 id: $category->getId(),
84 closed: $category->getClosed(),
85 name: $category->getName(),
86 description: $category->getDescription(),
87 creatorId: $category->getCreatorId(),
88 eventsCount: $category->getEventsCount(),
90 channelId: $category->getChannelId(),
91 updatedAt: $category->getLastActivity()->getTimestamp(),
100 $query = OpenEventCategoryAttendeeTable::query();
102 $this->prepareSelect(
$query);
103 $this->prepareFilter(
$query, $categoryQuery);
104 $this->prepareLimit(
$query, $categoryQuery);
105 $this->prepareOrder(
$query, $categoryQuery);
107 $categoryCollection =
$query->fetchCollection();
109 return $this->prepareResult($categoryCollection, $categoryQuery);
114 $query->registerRuntimeField($this->getCategoryReference());
119 'CATEGORY.DESCRIPTION',
121 'CATEGORY.CREATOR_ID',
122 'CATEGORY.EVENTS_COUNT',
123 'CATEGORY.CHANNEL_ID',
124 'CATEGORY.LAST_ACTIVITY',
128 private function prepareFilter(
Query $query, Provider\Category\
Query $categoryQuery): void
130 $query->whereIn(
'USER_ID', array_unique([Common::SYSTEM_USER_ID, $this->userId]));
132 if (isset($categoryQuery->filter->isBanned))
134 $bannedCategoryIds = (
new CategoryBanProvider($this->userId))->listIds();
135 if (!empty($bannedCategoryIds))
137 if ($categoryQuery->filter->isBanned)
139 $query->whereIn(
'CATEGORY_ID', $bannedCategoryIds);
143 $query->whereNotIn(
'CATEGORY_ID', $bannedCategoryIds);
148 if (!empty($categoryQuery->filter->channelId))
150 $query->where(
'CATEGORY.CHANNEL_ID', $categoryQuery->filter->channelId);
153 if (!empty($categoryQuery->filter->query))
155 $query->whereLike(
'CATEGORY.NAME',
'%' . Emoji::encode($categoryQuery->filter->query) .
'%');
158 if (!empty($categoryQuery->filter->categoryId))
160 $query->where(
'CATEGORY_ID', $categoryQuery->filter->categoryId);
164 private function prepareLimit(Query
$query, Provider\Category\Query $categoryQuery): void
166 if (!empty($categoryQuery->limit))
168 $query->setOffset($categoryQuery->page * $categoryQuery->limit);
169 $query->setLimit($categoryQuery->limit);
173 private function prepareOrder(Query
$query, Provider\Category\Query $categoryQuery): void
175 if (!empty($categoryQuery->order))
177 $query->addOrder(...$this->getOrder($categoryQuery->order));
184 CategoryOrderEnum::BY_ACTIVITY => [
'CATEGORY.LAST_ACTIVITY',
'DESC'],
185 CategoryOrderEnum::BY_NAME => [
'CATEGORY.NAME',
'ASC'],
192 private function prepareResult(
193 OpenEventCategoryAttendeeCollection $categoryCollection,
194 Provider\Category\Query $categoryQuery,
197 $categoryIds = $categoryCollection->getCategoryIdList();
199 $defaultCategoryMatchesSearchString = !empty($categoryQuery->filter->query)
202 if ($categoryQuery->requireDefault || $defaultCategoryMatchesSearchString)
204 $defaultCategoryId = DefaultCategoryService::getInstance()->getCategoryId();
206 if (!in_array($defaultCategoryId, $categoryIds,
true))
208 $categoryCollection->add($this->getDefaultRow());
210 $categoryIds[] = $defaultCategoryId;
214 if ($categoryCollection->isEmpty())
219 $mutedCategories = (
new CategoryMuteProvider($this->userId))->getByCategoryIds($categoryIds);
221 if (isset($categoryQuery->filter->isBanned))
223 $bannedCategoryIds = $categoryQuery->filter->isBanned ? $categoryIds : [];
227 $bannedCategoryIds = (
new CategoryBanProvider($this->userId))->listIds();
233 foreach ($categoryCollection as $row)
238 $category = $row->get(
'CATEGORY');
248 $category->getName() === DefaultCategoryService::DEFAULT_CATEGORY_NAME
249 && !empty($categoryQuery->filter->query)
250 && mb_stripos(
$name, $categoryQuery->filter->query) ===
false
256 $categories[] =
new Category(
257 id: $category->getId(),
258 closed: $category->getClosed(),
260 description: $this->prepareCategoryDescription($category->getDescription()),
261 creatorId: $category->getCreatorId(),
262 eventsCount: $category->getEventsCount(),
263 permissions: EventCategoryAccess::getPermissionsForEntity($category, $this->userId),
264 channelId: $category->getChannelId(),
265 isMuted: $mutedCategories[$category->getId()] ??
false,
266 isBanned: in_array($category->getId(), $bannedCategoryIds,
true),
268 updatedAt: $category->getLastActivity()->getTimestamp(),
277 if (
$name === DefaultCategoryService::DEFAULT_CATEGORY_NAME)
282 return Emoji::decode(
$name);
287 return Loc::getMessage(
'CALENDAR_OPEN_EVENTS_DEFAULT_CATEGORY_NAME');
292 if (
$description === DefaultCategoryService::DEFAULT_CATEGORY_DESCRIPTION)
294 return Loc::getMessage(
'CALENDAR_OPEN_EVENTS_DEFAULT_CATEGORY_DESCRIPTION');
302 $defaultCategory = DefaultCategoryService::getInstance()->getCategory();
305 $row->entity->addField($this->getCategoryReference(),
'CATEGORY');
306 $row->set(
'CATEGORY_ID', $defaultCategory->getId());
307 $row->set(
'CATEGORY', $defaultCategory);
312 private function getCategoryReference(): ReferenceField
314 return new ReferenceField(
316 OpenEventCategoryTable::getEntity(),
317 Join::on(
'this.CATEGORY_ID',
'ref.ID'),