aboutsummaryrefslogtreecommitdiffstats
path: root/apps/dav/lib/Search/ACalendarSearchProvider.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dav/lib/Search/ACalendarSearchProvider.php')
-rw-r--r--apps/dav/lib/Search/ACalendarSearchProvider.php138
1 files changed, 138 insertions, 0 deletions
diff --git a/apps/dav/lib/Search/ACalendarSearchProvider.php b/apps/dav/lib/Search/ACalendarSearchProvider.php
new file mode 100644
index 00000000000..56273fe17e4
--- /dev/null
+++ b/apps/dav/lib/Search/ACalendarSearchProvider.php
@@ -0,0 +1,138 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2020, Georg Ehrke
+ *
+ * @author Georg Ehrke <oc.list@georgehrke.com>
+ *
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace OCA\DAV\Search;
+
+use OCA\DAV\CalDAV\CalDavBackend;
+use OCP\App\IAppManager;
+use OCP\IL10N;
+use OCP\IURLGenerator;
+use OCP\Search\IProvider;
+use Sabre\VObject\Component;
+use Sabre\VObject\Reader;
+
+/**
+ * Class ACalendarSearchProvider
+ *
+ * @package OCA\DAV\Search
+ */
+abstract class ACalendarSearchProvider implements IProvider {
+
+ /** @var IAppManager */
+ protected $appManager;
+
+ /** @var IL10N */
+ protected $l10n;
+
+ /** @var IURLGenerator */
+ protected $urlGenerator;
+
+ /** @var CalDavBackend */
+ protected $backend;
+
+ /**
+ * ACalendarSearchProvider constructor.
+ *
+ * @param IAppManager $appManager
+ * @param IL10N $l10n
+ * @param IURLGenerator $urlGenerator
+ * @param CalDavBackend $backend
+ */
+ public function __construct(IAppManager $appManager,
+ IL10N $l10n,
+ IURLGenerator $urlGenerator,
+ CalDavBackend $backend) {
+ $this->appManager = $appManager;
+ $this->l10n = $l10n;
+ $this->urlGenerator = $urlGenerator;
+ $this->backend = $backend;
+ }
+
+ /**
+ * Get an associative array of calendars
+ * calendarId => calendar
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ protected function getSortedCalendars(string $principalUri): array {
+ $calendars = $this->backend->getCalendarsForUser($principalUri);
+ $calendarsById = [];
+ foreach ($calendars as $calendar) {
+ $calendarsById[(int) $calendar['id']] = $calendar;
+ }
+
+ return $calendarsById;
+ }
+
+ /**
+ * Get an associative array of subscriptions
+ * subscriptionId => subscription
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ protected function getSortedSubscriptions(string $principalUri): array {
+ $subscriptions = $this->backend->getSubscriptionsForUser($principalUri);
+ $subscriptionsById = [];
+ foreach ($subscriptions as $subscription) {
+ $subscriptionsById[(int) $subscription['id']] = $subscription;
+ }
+
+ return $subscriptionsById;
+ }
+
+ /**
+ * Returns the primary VEvent / VJournal / VTodo component
+ * If it's a component with recurrence-ids, it will return
+ * the primary component
+ *
+ * TODO: It would be a nice enhancement to show recurrence-exceptions
+ * as individual search-results.
+ * For now we will just display the primary element of a recurrence-set.
+ *
+ * @param string $calendarData
+ * @param string $componentName
+ * @return Component
+ */
+ protected function getPrimaryComponent(string $calendarData, string $componentName): Component {
+ $vCalendar = Reader::read($calendarData, Reader::OPTION_FORGIVING);
+
+ $components = $vCalendar->select($componentName);
+ if (count($components) === 1) {
+ return $components[0];
+ }
+
+ // If it's a recurrence-set, take the primary element
+ foreach ($components as $component) {
+ /** @var Component $component */
+ if (!$component->{'RECURRENCE-ID'}) {
+ return $component;
+ }
+ }
+
+ // In case of error, just fallback to the first element in the set
+ return $components[0];
+ }
+}