Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 65 additions & 7 deletions lib/public/Calendar/ICalendar.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,18 @@
*/
namespace OCP\Calendar;

use DateTimeInterface;

/**
* Interface ICalendar
*
* @since 13.0.0
*
* @psalm-type CalendarSearchOptions = array{
* timerange?: array{start?: DateTimeInterface, end?: DateTimeInterface},
* uid?: string,
* types?: string[],
* }
*/
interface ICalendar {
/**
Expand Down Expand Up @@ -41,13 +49,63 @@ public function getDisplayName(): ?string;
public function getDisplayColor(): ?string;

/**
* @param string $pattern which should match within the $searchProperties
* @param array $searchProperties defines the properties within the query pattern should match
* @param array $options - optional parameters:
* ['timerange' => ['start' => new DateTime(...), 'end' => new DateTime(...)]]
* @param int|null $limit - limit number of search results
* @param int|null $offset - offset for paging of search results
* @return array an array of events/journals/todos which are arrays of key-value-pairs. the events are sorted by start date (closest first, furthest last)
* Search the current calendar for matching events.
*
* This method searches for events in the calendar that match a given pattern within specified properties.
* The search is case-insensitive. It supports optional parameters such as a time range, limit, and offset.
* The results are sorted by start date, with the closest events appearing first.
*
* @param string $pattern A string to search for within the events. The search is done case-insensitive.
* @param array $searchProperties Defines the properties within which the pattern should match.
* @param array $options Optional parameters for the search:
* - 'timerange' element that can have 'start' (DateTimeInterface), 'end' (DateTimeInterface), or both.
* - 'uid' element to look for events with a given uid.
* - 'types' element to only return events for a given type (e.g. VEVENT or VTODO)
* @psalm-param CalendarSearchOptions $options
* @param int|null $limit Limit the number of search results.
* @param int|null $offset For paging of search results.
* @return array An array of events/journals/todos which are arrays of key-value-pairs. The events are sorted by start date (closest first, furthest last).
*
* Implementation Details:
*
* An event can consist of many sub-events, typically the case for events with recurrence rules. On a database level,
* there's only one event stored (with a matching first occurrence and last occurrence timestamp). Expanding an event
* into sub-events is done on the backend level. Using limit, offset, and timerange comes with some drawbacks.
* When asking the database for events, the result is ordered by the primary key to guarantee a stable order.
* After expanding the events into sub-events, they are sorted by the date (closest to furthest).
*
* Usage Examples:
*
* 1) Find 7 events within the next two weeks:
*
* $dateTime = (new DateTimeImmutable())->setTimestamp($this->timeFactory->getTime());
* $inTwoWeeks = $dateTime->add(new DateInterval('P14D'));
*
* $calendar->search(
* '',
* [],
* ['timerange' => ['start' => $dateTime, 'end' => $inTwoWeeks]],
* 7
* );
*
* Note: When combining timerange and limit, it's possible that the expected outcome is not in the order you would expect.
*
* Example: Create 7 events for tomorrow, starting from 11:00, 30 minutes each. Then create an 8th event for tomorrow at 10:00.
* The above code will list the event at 11:00 first, missing the event at 10:00. The reason is the ordering by the primary key
* and expanding on the backend level. This is a technical limitation. The easiest workaround is to fetch more events
* than you actually need, with the downside of needing more resources.
*
* Related:
* - https://github.com/nextcloud/server/pull/45222
* - https://github.com/nextcloud/server/issues/53002
*
* 2) Find all events where the location property contains the string 'Berlin':
*
* $calendar->search(
* 'Berlin',
* ['LOCATION']
* );
*
* @since 13.0.0
*/
public function search(string $pattern, array $searchProperties = [], array $options = [], ?int $limit = null, ?int $offset = null): array;
Expand Down
Loading