1<?php
2
3namespace Sabre\CalDAV\Backend;
4use Sabre\DAV;
5use Sabre\CalDAV;
6
7class Mock extends AbstractBackend {
8
9    protected $calendarData;
10    protected $calendars;
11
12    function __construct(array $calendars = [], array $calendarData = []) {
13
14        foreach($calendars as &$calendar) {
15            if (!isset($calendar['id'])) {
16                $calendar['id'] = DAV\UUIDUtil::getUUID();
17            }
18        }
19
20        $this->calendars = $calendars;
21        $this->calendarData = $calendarData;
22
23    }
24
25    /**
26     * Returns a list of calendars for a principal.
27     *
28     * Every project is an array with the following keys:
29     *  * id, a unique id that will be used by other functions to modify the
30     *    calendar. This can be the same as the uri or a database key.
31     *  * uri, which the basename of the uri with which the calendar is
32     *    accessed.
33     *  * principalUri. The owner of the calendar. Almost always the same as
34     *    principalUri passed to this method.
35     *
36     * Furthermore it can contain webdav properties in clark notation. A very
37     * common one is '{DAV:}displayname'.
38     *
39     * @param string $principalUri
40     * @return array
41     */
42    function getCalendarsForUser($principalUri) {
43
44        $r = array();
45        foreach($this->calendars as $row) {
46            if ($row['principaluri'] == $principalUri) {
47                $r[] = $row;
48            }
49        }
50
51        return $r;
52
53    }
54
55    /**
56     * Creates a new calendar for a principal.
57     *
58     * If the creation was a success, an id must be returned that can be used to reference
59     * this calendar in other methods, such as updateCalendar.
60     *
61     * This function must return a server-wide unique id that can be used
62     * later to reference the calendar.
63     *
64     * @param string $principalUri
65     * @param string $calendarUri
66     * @param array $properties
67     * @return string|int
68     */
69    function createCalendar($principalUri,$calendarUri,array $properties) {
70
71        $id = DAV\UUIDUtil::getUUID();
72        $this->calendars[] = array_merge([
73            'id' => $id,
74            'principaluri' => $principalUri,
75            'uri' => $calendarUri,
76            '{' . CalDAV\Plugin::NS_CALDAV . '}supported-calendar-component-set' => new CalDAV\Xml\Property\SupportedCalendarComponentSet(['VEVENT','VTODO']),
77        ], $properties);
78
79        return $id;
80
81    }
82
83    /**
84     * Delete a calendar and all it's objects
85     *
86     * @param string $calendarId
87     * @return void
88     */
89    public function deleteCalendar($calendarId) {
90
91        foreach($this->calendars as $k=>$calendar) {
92            if ($calendar['id'] === $calendarId) {
93                unset($this->calendars[$k]);
94            }
95        }
96
97    }
98
99    /**
100     * Returns all calendar objects within a calendar object.
101     *
102     * Every item contains an array with the following keys:
103     *   * id - unique identifier which will be used for subsequent updates
104     *   * calendardata - The iCalendar-compatible calendar data
105     *   * uri - a unique key which will be used to construct the uri. This can be any arbitrary string.
106     *   * lastmodified - a timestamp of the last modification time
107     *   * etag - An arbitrary string, surrounded by double-quotes. (e.g.:
108     *   '  "abcdef"')
109     *   * calendarid - The calendarid as it was passed to this function.
110     *
111     * Note that the etag is optional, but it's highly encouraged to return for
112     * speed reasons.
113     *
114     * The calendardata is also optional. If it's not returned
115     * 'getCalendarObject' will be called later, which *is* expected to return
116     * calendardata.
117     *
118     * @param string $calendarId
119     * @return array
120     */
121    public function getCalendarObjects($calendarId) {
122
123        if (!isset($this->calendarData[$calendarId]))
124            return array();
125
126        $objects = $this->calendarData[$calendarId];
127
128        foreach($objects as $uri => &$object) {
129            $object['calendarid'] = $calendarId;
130            $object['uri'] = $uri;
131            $object['lastmodified'] = null;
132        }
133        return $objects;
134
135    }
136
137    /**
138     * Returns information from a single calendar object, based on it's object
139     * uri.
140     *
141     * The returned array must have the same keys as getCalendarObjects. The
142     * 'calendardata' object is required here though, while it's not required
143     * for getCalendarObjects.
144     *
145     * @param string $calendarId
146     * @param string $objectUri
147     * @return array
148     */
149    function getCalendarObject($calendarId,$objectUri) {
150
151        if (!isset($this->calendarData[$calendarId][$objectUri])) {
152            throw new DAV\Exception\NotFound('Object could not be found');
153        }
154        $object = $this->calendarData[$calendarId][$objectUri];
155        $object['calendarid'] = $calendarId;
156        $object['uri'] = $objectUri;
157        $object['lastmodified'] = null;
158        return $object;
159
160    }
161
162    /**
163     * Creates a new calendar object.
164     *
165     * @param string $calendarId
166     * @param string $objectUri
167     * @param string $calendarData
168     * @return void
169     */
170    function createCalendarObject($calendarId,$objectUri,$calendarData) {
171
172        $this->calendarData[$calendarId][$objectUri] = array(
173            'calendardata' => $calendarData,
174            'calendarid' => $calendarId,
175            'uri' => $objectUri,
176        );
177        return '"' . md5($calendarData) . '"';
178
179    }
180
181    /**
182     * Updates an existing calendarobject, based on it's uri.
183     *
184     * @param string $calendarId
185     * @param string $objectUri
186     * @param string $calendarData
187     * @return void
188     */
189    function updateCalendarObject($calendarId,$objectUri,$calendarData) {
190
191        $this->calendarData[$calendarId][$objectUri] = array(
192            'calendardata' => $calendarData,
193            'calendarid' => $calendarId,
194            'uri' => $objectUri,
195        );
196        return '"' . md5($calendarData) . '"';
197
198    }
199
200    /**
201     * Deletes an existing calendar object.
202     *
203     * @param string $calendarId
204     * @param string $objectUri
205     * @return void
206     */
207    function deleteCalendarObject($calendarId,$objectUri) {
208
209        throw new Exception('Not implemented');
210
211
212    }
213
214}
215