calDavBackend->getCalendarsForUser($principalUri) ?? []; /** @var array{uri: string, principaluri: string}[] $federatedCalendarInfos */ $federatedCalendarInfos = $this->calDavBackend->getFederatedCalendarsForUser($principalUri); if (!empty($calendarUris)) { $calendarInfos = array_filter($calendarInfos, function ($calendar) use ($calendarUris) { return in_array($calendar['uri'], $calendarUris); }); $federatedCalendarInfos = array_filter($federatedCalendarInfos, function ($federatedCalendar) use ($calendarUris) { return in_array($federatedCalendar['uri'], $calendarUris); }); } $additionalProperties = $this->getAdditionalPropertiesForCalendars($calendarInfos); $iCalendars = []; foreach ($calendarInfos as $calendarInfo) { $user = str_replace('principals/users/', '', $calendarInfo['principaluri']); $path = 'calendars/' . $user . '/' . $calendarInfo['uri']; $calendarInfo = array_merge($calendarInfo, $additionalProperties[$path] ?? []); $calendar = new Calendar($this->calDavBackend, $calendarInfo, $this->l10n, $this->config, $this->logger); $iCalendars[] = new CalendarImpl( $calendar, $calendarInfo, $this->calDavBackend, ); } $additionalFederatedProps = $this->getAdditionalPropertiesForCalendars( $federatedCalendarInfos, ); foreach ($federatedCalendarInfos as $calendarInfo) { $user = str_replace('principals/users/', '', $calendarInfo['principaluri']); $path = 'calendars/' . $user . '/' . $calendarInfo['uri']; if (isset($additionalFederatedProps[$path])) { $calendarInfo = array_merge($calendarInfo, $additionalProperties[$path]); } $iCalendars[] = new FederatedCalendarImpl($calendarInfo, $this->calDavBackend); } return $iCalendars; } /** * @param array{ * principaluri: string, * uri: string, * }[] $uris * @return array> */ private function getAdditionalPropertiesForCalendars(array $uris): array { $calendars = []; foreach ($uris as $uri) { /** @var string $user */ $user = str_replace('principals/users/', '', $uri['principaluri']); if (!array_key_exists($user, $calendars)) { $calendars[$user] = []; } $calendars[$user][] = 'calendars/' . $user . '/' . $uri['uri']; } $properties = $this->propertyMapper->findPropertiesByPathsAndUsers($calendars); $list = []; foreach ($properties as $property) { if ($property instanceof Property) { if (!isset($list[$property->getPropertypath()])) { $list[$property->getPropertypath()] = []; } $list[$property->getPropertypath()][$property->getPropertyname()] = match ($property->getPropertyname()) { '{http://owncloud.org/ns}calendar-enabled' => (bool)$property->getPropertyvalue(), default => $property->getPropertyvalue() }; } } return $list; } }