diff options
Diffstat (limited to 'apps/dav/lib/Service/AbsenceService.php')
-rw-r--r-- | apps/dav/lib/Service/AbsenceService.php | 75 |
1 files changed, 47 insertions, 28 deletions
diff --git a/apps/dav/lib/Service/AbsenceService.php b/apps/dav/lib/Service/AbsenceService.php index b50dd32e925..3f5168e386d 100644 --- a/apps/dav/lib/Service/AbsenceService.php +++ b/apps/dav/lib/Service/AbsenceService.php @@ -27,11 +27,14 @@ declare(strict_types=1); namespace OCA\DAV\Service; use InvalidArgumentException; +use OCA\DAV\BackgroundJob\OutOfOfficeEventDispatcherJob; +use OCA\DAV\CalDAV\TimezoneService; use OCA\DAV\Db\Absence; use OCA\DAV\Db\AbsenceMapper; use OCP\AppFramework\Db\DoesNotExistException; +use OCP\BackgroundJob\IJobList; use OCP\EventDispatcher\IEventDispatcher; -use OCP\IUserManager; +use OCP\IUser; use OCP\User\Events\OutOfOfficeChangedEvent; use OCP\User\Events\OutOfOfficeClearedEvent; use OCP\User\Events\OutOfOfficeScheduledEvent; @@ -40,7 +43,8 @@ class AbsenceService { public function __construct( private AbsenceMapper $absenceMapper, private IEventDispatcher $eventDispatcher, - private IUserManager $userManager, + private IJobList $jobList, + private TimezoneService $timezoneService, ) { } @@ -52,61 +56,76 @@ class AbsenceService { * @throws InvalidArgumentException If no user with the given user id exists. */ public function createOrUpdateAbsence( - string $userId, + IUser $user, string $firstDay, string $lastDay, string $status, string $message, ): Absence { try { - $absence = $this->absenceMapper->findByUserId($userId); + $absence = $this->absenceMapper->findByUserId($user->getUID()); } catch (DoesNotExistException) { $absence = new Absence(); } - $absence->setUserId($userId); + $absence->setUserId($user->getUID()); $absence->setFirstDay($firstDay); $absence->setLastDay($lastDay); $absence->setStatus($status); $absence->setMessage($message); - // TODO: this method should probably just take a IUser instance - $user = $this->userManager->get($userId); - if ($user === null) { - throw new InvalidArgumentException("User $userId does not exist"); - } - if ($absence->getId() === null) { - $persistedAbsence = $this->absenceMapper->insert($absence); - $this->eventDispatcher->dispatchTyped(new OutOfOfficeScheduledEvent( - $persistedAbsence->toOutOufOfficeData($user) - )); - return $persistedAbsence; + $absence = $this->absenceMapper->insert($absence); + $eventData = $absence->toOutOufOfficeData( + $user, + $this->timezoneService->getUserTimezone($user->getUID()) ?? $this->timezoneService->getDefaultTimezone(), + ); + $this->eventDispatcher->dispatchTyped(new OutOfOfficeScheduledEvent($eventData)); + } else { + $absence = $this->absenceMapper->update($absence); + $eventData = $absence->toOutOufOfficeData( + $user, + $this->timezoneService->getUserTimezone($user->getUID()) ?? $this->timezoneService->getDefaultTimezone(), + ); + $this->eventDispatcher->dispatchTyped(new OutOfOfficeChangedEvent($eventData)); } - $this->eventDispatcher->dispatchTyped(new OutOfOfficeChangedEvent( - $absence->toOutOufOfficeData($user) - )); - return $this->absenceMapper->update($absence); + $this->jobList->scheduleAfter( + OutOfOfficeEventDispatcherJob::class, + $eventData->getStartDate(), + [ + 'id' => $absence->getId(), + 'event' => OutOfOfficeEventDispatcherJob::EVENT_START, + ], + ); + $this->jobList->scheduleAfter( + OutOfOfficeEventDispatcherJob::class, + $eventData->getEndDate(), + [ + 'id' => $absence->getId(), + 'event' => OutOfOfficeEventDispatcherJob::EVENT_END, + ], + ); + + return $absence; } /** * @throws \OCP\DB\Exception */ - public function clearAbsence(string $userId): void { + public function clearAbsence(IUser $user): void { try { - $absence = $this->absenceMapper->findByUserId($userId); + $absence = $this->absenceMapper->findByUserId($user->getUID()); } catch (DoesNotExistException $e) { // Nothing to clear return; } $this->absenceMapper->delete($absence); - // TODO: this method should probably just take a IUser instance - $user = $this->userManager->get($userId); - if ($user === null) { - throw new InvalidArgumentException("User $userId does not exist"); - } - $eventData = $absence->toOutOufOfficeData($user); + $this->jobList->remove(OutOfOfficeEventDispatcherJob::class); + $eventData = $absence->toOutOufOfficeData( + $user, + $this->timezoneService->getUserTimezone($user->getUID()) ?? $this->timezoneService->getDefaultTimezone(), + ); $this->eventDispatcher->dispatchTyped(new OutOfOfficeClearedEvent($eventData)); } } |