mirror of
https://github.com/grocy/grocy.git
synced 2025-04-29 17:45:39 +00:00
104 lines
3.2 KiB
PHP
104 lines
3.2 KiB
PHP
<?php
|
|
|
|
namespace Grocy\Controllers;
|
|
|
|
use Eluceo\iCal\Domain\Entity\Calendar;
|
|
use Eluceo\iCal\Domain\Entity\Event;
|
|
use Eluceo\iCal\Domain\Entity\TimeZone;
|
|
use Eluceo\iCal\Domain\ValueObject\Date;
|
|
use Eluceo\iCal\Domain\ValueObject\DateTime;
|
|
use Eluceo\iCal\Domain\ValueObject\SingleDay;
|
|
use Eluceo\iCal\Domain\ValueObject\TimeSpan;
|
|
use Eluceo\iCal\Presentation\Factory\CalendarFactory;
|
|
|
|
class CalendarApiController extends BaseApiController
|
|
{
|
|
public function Ical(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args)
|
|
{
|
|
try
|
|
{
|
|
$events = $this->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(\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());
|
|
}
|
|
}
|
|
}
|