getCalendarService()->GetEvents(); $vCalendar = new Calendar(); foreach ($events as $event) { $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', $event['start'])); $vEventOccurrence = new SingleDay($date); } else { // Time-point event $start = new DateTime(\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $event['start']), false); $end = new DateTime(\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $event['start']), false); $vEventOccurrence = new TimeSpan($start, $end); } $vEvent = new Event(); $vEvent->setOccurrence($vEventOccurrence) ->setSummary($event['title']) ->setDescription($description); $vCalendar->addEvent($vEvent); } $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(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args) { try { return $this->ApiResponse($response, [ 'url' => $this->AppContainer->get('UrlManager')->ConstructUrl('/api/calendar/ical?secret=' . $this->getApiKeyService()->GetOrCreateApiKey(\Grocy\Services\ApiKeyService::API_KEY_TYPE_SPECIAL_PURPOSE_CALENDAR_ICAL)) ]); } catch (\Exception $ex) { return $this->GenericErrorResponse($response, $ex->getMessage()); } } public function __construct(\DI\Container $container) { parent::__construct($container); } }