diff options
Diffstat (limited to 'app/frontend/facades/EventFacade.php')
-rw-r--r-- | app/frontend/facades/EventFacade.php | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/app/frontend/facades/EventFacade.php b/app/frontend/facades/EventFacade.php new file mode 100644 index 0000000..14f809d --- /dev/null +++ b/app/frontend/facades/EventFacade.php @@ -0,0 +1,115 @@ +<?php + +Prado::using('Application.facades.Facade'); +Prado::using('Application.dto.EventDTO'); +Prado::using('Application.dto.TimezoneDTO'); +Prado::using('Application.dto.GridEventDTO'); +Prado::using('Application.dto.CalendarGridDTO'); +Prado::using('Application.model.Calendar'); +Prado::using('Application.facades.CalendarFacade'); +Prado::using('Application.user.DbUser'); + +class EventFacade extends Facade { + + public function getEventList(string $dateFrom=NULL, string $dateTo=NULL, + array $calendars=NULL, string $order='ASC') { + $calendarClause = '1=1'; + if ($calendars) { + $calendarClause = sprintf( + '_calendar IN (%s)', + implode( + ',', + array_map( + function($calendar) { + return $this->quoteString($calendar->UID); + }, + $calendars + ) + ) + ); + } + return $this->fetchList( + 'getEvents', + [ + 'date_from' => $dateFrom ?: '0000-00-00 00:00:00', + 'date_to' => $dateTo ?: '9999-99-99', + 'calendar_clause' => $calendarClause, + 'order_clause' => $order + ] + ); + } + + private function _compileEventObjects(array $events, array $calendars, + TimezoneDTO $tz, + string $class = 'Application.dto.EventDTO') { + return array_map( + function($event) use($calendars, $class, $tz) { + $dto = Prado::createComponent($class, $tz); + $dto->loadRecord($event, $calendars); + return $dto; + }, + $events + ); + } + + public function getTimeframeListForUser( + DbUser $user, + DateTime $dateFrom, DateTime $dateTo, + string $returnClass = 'Application.dto.EventDTO') { + $calendars = CalendarFacade::getInstance()->getCalendarPreference($user); + if ($calendars) { + $events = $this->getEventList( + $dateFrom->format('Y-m-d H:i:s'), + $dateTo->format('Y-m-d H:i:s'), + $calendars + ); + $calendars = $this->_getCalendarsForEvents($events); + return $this->_compileEventObjects( + $events, $calendars, + UserFacade::getInstance()->getTimezonePreference($user), + $returnClass); + } + return []; + } + + public function getCalendarListForUser(DbUser $user, + $month, $year) { + if (!$year) { + $year = intval(date('Y')); + } + if (!$month) { + $month = intval(date('m')); + } + $timezone = $user + ? UserFacade::getInstance()->getTimezonePreference($user) + : new TimezoneDTO(date_default_timezone_get()); + $timeframe = CalendarFacade::getInstance()->getCalendarBoundaries( + $year, $month, $timezone + ); + return new CalendarGridDTO( + $this->getTimeframeListForUser( + $user, + $timeframe[0], $timeframe[1], + 'Application.dto.GridEventDTO' + ), + ...$timeframe + ); + } + + private function _getCalendarsForEvents(array $events) { + if ($events) { + return Calendar::finder()->findAllByPks( + array_map( + function($event) { + return $event->CalendarID; + }, + $events + ) + ); + } + return []; + } + +} + +?> |