330f29889232e08152663be802e31b3b50cb5cc1
[friendica-addons.git] / dav / common / wdcal_backend.inc.php
1 <?php
2
3
4
5
6 /**
7  * @param mixed $obj
8  * @return string
9  */
10 function wdcal_jsonp_encode($obj)
11 {
12         $str = json_encode($obj);
13         if (isset($_REQUEST["callback"])) {
14                 $str = $_REQUEST["callback"] . "(" . $str . ")";
15         }
16         return $str;
17 }
18
19
20 /**
21  * @param string $day
22  * @param int $weekstartday
23  * @param int $num_days
24  * @param string $type
25  * @return array
26  */
27 function wdcal_get_list_range_params($day, $weekstartday, $num_days, $type)
28 {
29         $phpTime = IntVal($day);
30         switch ($type) {
31                 case "month":
32                         $st = mktime(0, 0, 0, date("m", $phpTime), 1, date("Y", $phpTime));
33                         $et = mktime(0, 0, -1, date("m", $phpTime) + 1, 1, date("Y", $phpTime));
34                         break;
35                 case "week":
36                         //suppose first day of a week is monday
37                         $monday = date("d", $phpTime) - date('N', $phpTime) + 1;
38                         //echo date('N', $phpTime);
39                         $st = mktime(0, 0, 0, date("m", $phpTime), $monday, date("Y", $phpTime));
40                         $et = mktime(0, 0, -1, date("m", $phpTime), $monday + 7, date("Y", $phpTime));
41                         break;
42                 case "multi_days":
43                         //suppose first day of a week is monday
44                         $monday = date("d", $phpTime) - date('N', $phpTime) + $weekstartday;
45                         //echo date('N', $phpTime);
46                         $st = mktime(0, 0, 0, date("m", $phpTime), $monday, date("Y", $phpTime));
47                         $et = mktime(0, 0, -1, date("m", $phpTime), $monday + $num_days, date("Y", $phpTime));
48                         break;
49                 case "day":
50                         $st = mktime(0, 0, 0, date("m", $phpTime), date("d", $phpTime), date("Y", $phpTime));
51                         $et = mktime(0, 0, -1, date("m", $phpTime), date("d", $phpTime) + 1, date("Y", $phpTime));
52                         break;
53                 default:
54                         return array(0, 0);
55         }
56         return array($st, $et);
57 }
58
59
60 /**
61  * @param Sabre_DAV_Server $server
62  * @param string $right
63  * @return null|Sabre_CalDAV_Calendar
64  */
65 function wdcal_print_feed_getCal(&$server, $right)
66 {
67         $cals     = dav_get_current_user_calendars($server, $right);
68         $calfound = null;
69         for ($i = 0; $i < count($cals) && $calfound === null; $i++) {
70                 $prop = $cals[$i]->getProperties(array("id"));
71                 if (isset($prop["id"]) && (!isset($_REQUEST["cal"]) || in_array($prop["id"], $_REQUEST["cal"]))) $calfound = $cals[$i];
72         }
73         return $calfound;
74 }
75
76
77 /**
78  *
79  */
80 function wdcal_print_feed($base_path = "")
81 {
82         $server = dav_create_server(true, true, false);
83
84         $ret = null;
85
86         $method = $_GET["method"];
87         switch ($method) {
88                 case "add":
89                         $cs = wdcal_print_feed_getCal($server, DAV_ACL_WRITE);
90                         if ($cs == null) {
91                                 echo wdcal_jsonp_encode(array('IsSuccess' => false,
92                                                                                           'Msg'       => t('No access')));
93                                 killme();
94                         }
95                         try {
96                                 $item      = dav_create_empty_vevent();
97                                 $component = dav_get_eventComponent($item);
98                                 $component->add("SUMMARY", icalendar_sanitize_string(dav_compat_parse_text_serverside("CalendarTitle")));
99
100                                 if (isset($_REQUEST["allday"])) $type = Sabre\VObject\Property\DateTime::DATE;
101                                 else $type = Sabre\VObject\Property\DateTime::LOCALTZ;
102
103                                 $datetime_start = new Sabre\VObject\Property\DateTime("DTSTART");
104                                 $datetime_start->setDateTime(new DateTime(date("Y-m-d H:i:s", IntVal($_REQUEST["CalendarStartTime"]))), $type);
105                                 $datetime_end = new Sabre\VObject\Property\DateTime("DTEND");
106                                 $datetime_end->setDateTime(new DateTime(date("Y-m-d H:i:s", IntVal($_REQUEST["CalendarEndTime"]))), $type);
107
108                                 $component->add($datetime_start);
109                                 $component->add($datetime_end);
110
111                                 $uid  = $component->__get("UID");
112                                 $data = $item->serialize();
113
114                                 $cs->createFile($uid . ".ics", $data);
115
116                                 $ret = array(
117                                         'IsSuccess' => true,
118                                         'Msg'       => 'add success',
119                                         'Data'      => $uid . ".ics",
120                                 );
121
122                         } catch (Exception $e) {
123                                 $ret = array(
124                                         'IsSuccess' => false,
125                                         'Msg'       => $e->__toString(),
126                                 );
127                         }
128                         break;
129                 case "list":
130                         $weekstartday = (isset($_REQUEST["weekstartday"]) ? IntVal($_REQUEST["weekstartday"]) : 1); // 1 = Monday
131                         $num_days     = (isset($_REQUEST["num_days"]) ? IntVal($_REQUEST["num_days"]) : 7);
132                         $ret          = null;
133
134                         $date          = wdcal_get_list_range_params($_REQUEST["showdate"], $weekstartday, $num_days, $_REQUEST["viewtype"]);
135                         $ret           = array();
136                         $ret['events'] = array();
137                         $ret["issort"] = true;
138                         $ret["start"]  = $date[0];
139                         $ret["end"]    = $date[1];
140                         $ret['error']  = null;
141
142                         $cals = dav_get_current_user_calendars($server, DAV_ACL_READ);
143                         foreach ($cals as $cal) {
144                                 $prop = $cal->getProperties(array("id"));
145                                 if (isset($prop["id"]) && (!isset($_REQUEST["cal"]) || in_array($prop["id"], $_REQUEST["cal"]))) {
146                                         $backend       = wdcal_calendar_factory_by_id($prop["id"]);
147                                         $events        = $backend->listItemsByRange($prop["id"], $date[0], $date[1], $base_path);
148                                         $ret["events"] = array_merge($ret["events"], $events);
149                                 }
150                         }
151
152                         $tmpev = array();
153                         foreach ($ret["events"] as $e) {
154                                 if (!isset($tmpev[$e["start"]])) $tmpev[$e["start"]] = array();
155                                 $tmpev[$e["start"]][] = $e;
156                         }
157                         ksort($tmpev);
158                         $ret["events"] = array();
159                         foreach ($tmpev as $e) foreach ($e as $f) $ret["events"][] = $f;
160
161                         break;
162                 case "update":
163                         $r = q("SELECT `calendarobject_id`, `calendar_id` FROM %s%sjqcalendar WHERE `id`=%d", CALDAV_SQL_DB, CALDAV_SQL_PREFIX, IntVal($_REQUEST["jq_id"]));
164                         if (count($r) != 1) {
165                                 echo wdcal_jsonp_encode(array('IsSuccess' => false,
166                                                                                           'Msg'       => t('No access')));
167                                 killme();
168                         }
169                         try {
170                                 $cs      = dav_get_current_user_calendar_by_id($server, $r[0]["calendar_id"], DAV_ACL_READ);
171                                 $obj_uri = Sabre_CalDAV_Backend_Common::loadCalendarobjectById($r[0]["calendarobject_id"]);
172
173                                 $vObject   = dav_get_current_user_calendarobject($server, $cs, $obj_uri["uri"], DAV_ACL_WRITE);
174                                 $component = dav_get_eventComponent($vObject);
175
176                                 if (!$component) {
177                                         echo wdcal_jsonp_encode(array('IsSuccess' => false,
178                                                                                                   'Msg'       => t('No access')));
179                                         killme();
180                                 }
181
182                                 if (isset($_REQUEST["allday"])) $type = Sabre\VObject\Property\DateTime::DATE;
183                                 else $type = Sabre\VObject\Property\DateTime::LOCALTZ;
184
185                                 $datetime_start = new Sabre\VObject\Property\DateTime("DTSTART");
186                                 $datetime_start->setDateTime(new DateTime(date("Y-m-d H:i:s", IntVal($_REQUEST["CalendarStartTime"]))), $type);
187                                 $datetime_end = new Sabre\VObject\Property\DateTime("DTEND");
188                                 $datetime_end->setDateTime(new DateTime(date("Y-m-d H:i:s", IntVal($_REQUEST["CalendarEndTime"]))), $type);
189
190                                 $component->__unset("DTSTART");
191                                 $component->__unset("DTEND");
192                                 $component->add($datetime_start);
193                                 $component->add($datetime_end);
194
195                                 $data = $vObject->serialize();
196                                 /** @var Sabre_CalDAV_CalendarObject $child  */
197                                 $child = $cs->getChild($obj_uri["uri"]);
198                                 $child->put($data);
199
200                                 $ret = array(
201                                         'IsSuccess' => true,
202                                         'Msg'       => 'Succefully',
203                                 );
204                         } catch (Exception $e) {
205                                 echo wdcal_jsonp_encode(array('IsSuccess' => false,
206                                                                                           'Msg'       => t('No access')));
207                                 killme();
208                         }
209                         break;
210                 case "remove":
211                         $r = q("SELECT `calendarobject_id`, `calendar_id` FROM %s%sjqcalendar WHERE `id`=%d", CALDAV_SQL_DB, CALDAV_SQL_PREFIX, IntVal($_REQUEST["jq_id"]));
212                         if (count($r) != 1) {
213                                 echo wdcal_jsonp_encode(array('IsSuccess' => false,
214                                                                                           'Msg'       => t('No access')));
215                                 killme();
216                         }
217                         try {
218                                 $cs      = dav_get_current_user_calendar_by_id($server, $r[0]["calendar_id"], DAV_ACL_WRITE);
219                                 $obj_uri = Sabre_CalDAV_Backend_Common::loadCalendarobjectById($r[0]["calendarobject_id"]);
220                                 $child   = $cs->getChild($obj_uri["uri"]);
221                                 $child->delete();
222
223                                 $ret = array(
224                                         'IsSuccess' => true,
225                                         'Msg'       => 'Succefully',
226                                 );
227                         } catch (Exception $e) {
228                                 echo wdcal_jsonp_encode(array('IsSuccess' => false,
229                                                                                           'Msg'       => t('No access')));
230                                 killme();
231                         }
232
233                         break;
234         }
235         echo wdcal_jsonp_encode($ret);
236         killme();
237 }
238