mirror of
				https://github.com/grocy/grocy.git
				synced 2025-10-31 18:49:38 +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());
 | |
| 		}
 | |
| 	}
 | |
| }
 |