|
27 | 27 | namespace OCA\DAV\Service; |
28 | 28 |
|
29 | 29 | use InvalidArgumentException; |
| 30 | +use OC\AppFramework\Utility\TimeFactory; |
| 31 | +use OCA\DAV\CalDAV\CalDavBackend; |
| 32 | +use OCA\DAV\CalDAV\Calendar; |
| 33 | +use OCA\DAV\CalDAV\CalendarImpl; |
30 | 34 | use OCA\DAV\Db\Absence; |
31 | 35 | use OCA\DAV\Db\AbsenceMapper; |
| 36 | +use OCA\DAV\ServerFactory; |
32 | 37 | use OCP\AppFramework\Db\DoesNotExistException; |
| 38 | +use OCP\AppFramework\Utility\ITimeFactory; |
33 | 39 | use OCP\EventDispatcher\IEventDispatcher; |
| 40 | +use OCP\IConfig; |
34 | 41 | use OCP\IUserManager; |
35 | 42 | use OCP\User\Events\OutOfOfficeChangedEvent; |
36 | 43 | use OCP\User\Events\OutOfOfficeClearedEvent; |
37 | 44 | use OCP\User\Events\OutOfOfficeScheduledEvent; |
| 45 | +use Sabre\DAV\Exception\NotFound; |
| 46 | +use Sabre\VObject\Component\VCalendar; |
| 47 | +use Sabre\VObject\Component\VTimeZone; |
38 | 48 |
|
39 | 49 | class AbsenceService { |
40 | 50 | public function __construct( |
41 | 51 | private AbsenceMapper $absenceMapper, |
42 | 52 | private IEventDispatcher $eventDispatcher, |
43 | 53 | private IUserManager $userManager, |
| 54 | + private ITimeFactory $timeFactory, |
| 55 | + private ServerFactory $serverFactory, |
| 56 | + private IConfig $appConfig, |
44 | 57 | ) { |
45 | 58 | } |
46 | 59 |
|
@@ -117,5 +130,50 @@ public function getAbsence(string $userId): ?Absence { |
117 | 130 | return null; |
118 | 131 | } |
119 | 132 | } |
| 133 | + |
| 134 | + public function isInEffect(Absence $absence): bool { |
| 135 | + $principal = "principals/users/" . $absence->getUserId(); |
| 136 | + $invitationServer = $this->serverFactory->createInviationResponseServer(false); |
| 137 | + $server = $invitationServer->getServer(); |
| 138 | + |
| 139 | + /** @var \OCA\DAV\CalDAV\Plugin $caldavPlugin */ |
| 140 | + $caldavPlugin = $server->getPlugin('caldav'); |
| 141 | + $calendarHomePath = $caldavPlugin->getCalendarHomeForPrincipal($principal); |
| 142 | + try { |
| 143 | + $calendarHome = $server->tree->getNodeForPath($calendarHomePath); |
| 144 | + $uri = $this->appConfig->getUserValue($absence->getUserId(), 'dav', 'defaultCalendar', CalDavBackend::PERSONAL_CALENDAR_URI); |
| 145 | + $calendarNode = $calendarHome->getChild($uri); |
| 146 | + } catch (NotFound $e) { |
| 147 | + return false; |
| 148 | + } |
| 149 | + |
| 150 | + if (!($calendarNode instanceof Calendar)) { |
| 151 | + $this->logger->warning('Personal calendar node is not a calendar'); |
| 152 | + return false; |
| 153 | + } |
| 154 | + if ($calendarNode->isDeleted()) { |
| 155 | + $this->logger->warning('Personal calendar has been deleted'); |
| 156 | + return false; |
| 157 | + } |
| 158 | + |
| 159 | + $tz = $calendarNode->getProperties([])['{urn:ietf:params:xml:ns:caldav}calendar-timezone'] ?? null; |
| 160 | + if($tz === null) { |
| 161 | + // Do the comparison without a tz |
| 162 | + $absenceStart = new \DateTime($absence->getFirstDay()); |
| 163 | + $absenceEnd = new \DateTime($absence->getLastDay()); |
| 164 | + $now = $this->timeFactory->getTime(); |
| 165 | + return $absenceStart->getTimestamp() <= $now && $absenceEnd->getTimestamp() >= $now; |
| 166 | + } |
| 167 | + |
| 168 | + /** @var VCalendar $vtimezoneObj */ |
| 169 | + $vtimezoneObj = Reader::read($tz); |
| 170 | + /** @var VTimeZone $vtimezone */ |
| 171 | + $vtimezone = $vtimezoneObj->VTIMEZONE; |
| 172 | + $calendarTimeZone = $vtimezone->getTimeZone(); |
| 173 | + $absenceStart = new \DateTime($absence->getFirstDay(), $calendarTimeZone); |
| 174 | + $absenceEnd = new \DateTime($absence->getLastDay(), $calendarTimeZone); |
| 175 | + $now = $this->timeFactory->getTime(); |
| 176 | + return $absenceStart->getTimestamp() <= $now && $absenceEnd->getTimestamp() >= $now; |
| 177 | + } |
120 | 178 | } |
121 | 179 |
|
0 commit comments