getCalendarService()->GetEvents(); $minDate = null; $maxDate = null; $vCalendar = new Calendar(); $vCalendar->setProductIdentifier('Grocy'); foreach ($events as $event) { if (!isset($event['start']) || empty($event['start'])) { continue; } $description = ''; if (isset($event['description'])) { $description = $event['description']; } if ($event['date_format'] === 'date' || (isset($event['allDay']) && $event['allDay'])) { // All-day event $date = new Date(\DateTimeImmutable::createFromFormat('Y-m-d', substr($event['start'], 0, 10))); $vEventOccurrence = new SingleDay($date); $compareDate = \DateTimeImmutable::createFromFormat('Y-m-d', substr($event['start'], 0, 10)); } else { // Time-point event $start = new DateTime(\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $event['start']), true); $end = new DateTime(\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $event['start']), true); $vEventOccurrence = new TimeSpan($start, $end); $compareDate = \DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $event['start']); } $vEvent = new Event(); $vEvent->setOccurrence($vEventOccurrence) ->setSummary($event['title']) ->setDescription($description); $vCalendar->addEvent($vEvent); if ($minDate == null || $compareDate < $minDate) { $minDate = $compareDate; } if ($maxDate == null || $compareDate > $maxDate) { $maxDate = $compareDate; } } if ($minDate != null && $maxDate != null) { $vCalendar->addTimeZone(TimeZone::createFromPhpDateTimeZone(new \DateTimeZone(date_default_timezone_get()), $minDate, $maxDate)); } $response->write((new CalendarFactory())->createCalendar($vCalendar)); $response = $response->withHeader('Content-Type', 'text/calendar; charset=utf-8'); return $response->withHeader('Content-Disposition', 'attachment; filename="Grocy.ics"'); } catch (\Exception $ex) { return $this->GenericErrorResponse($response, $ex->getMessage()); } } public function IcalSharingLink(Request $request, Response $response, array $args) { try { return $this->ApiResponse($response, [ 'url' => $this->AppContainer->get('UrlManager')->ConstructUrl('/api/calendar/ical?secret=' . $this->getApiKeyService()->GetOrCreateApiKey(ApiKeyService::API_KEY_TYPE_SPECIAL_PURPOSE_CALENDAR_ICAL)) ]); } catch (\Exception $ex) { return $this->GenericErrorResponse($response, $ex->getMessage()); } } }