diff options
Diffstat (limited to 'apps/dav/lib/Db/Absence.php')
-rw-r--r-- | apps/dav/lib/Db/Absence.php | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/apps/dav/lib/Db/Absence.php b/apps/dav/lib/Db/Absence.php new file mode 100644 index 00000000000..d7cd46087c3 --- /dev/null +++ b/apps/dav/lib/Db/Absence.php @@ -0,0 +1,99 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\DAV\Db; + +use DateTime; +use Exception; +use InvalidArgumentException; +use JsonSerializable; +use OC\User\OutOfOfficeData; +use OCP\AppFramework\Db\Entity; +use OCP\IUser; +use OCP\User\IOutOfOfficeData; + +/** + * @method string getUserId() + * @method void setUserId(string $userId) + * @method string getFirstDay() + * @method void setFirstDay(string $firstDay) + * @method string getLastDay() + * @method void setLastDay(string $lastDay) + * @method string getStatus() + * @method void setStatus(string $status) + * @method string getMessage() + * @method void setMessage(string $message) + * @method string getReplacementUserId() + * @method void setReplacementUserId(?string $replacementUserId) + * @method string getReplacementUserDisplayName() + * @method void setReplacementUserDisplayName(?string $replacementUserDisplayName) + */ +class Absence extends Entity implements JsonSerializable { + protected string $userId = ''; + + /** Inclusive, formatted as YYYY-MM-DD */ + protected string $firstDay = ''; + + /** Inclusive, formatted as YYYY-MM-DD */ + protected string $lastDay = ''; + + protected string $status = ''; + + protected string $message = ''; + + protected ?string $replacementUserId = null; + + protected ?string $replacementUserDisplayName = null; + + public function __construct() { + $this->addType('userId', 'string'); + $this->addType('firstDay', 'string'); + $this->addType('lastDay', 'string'); + $this->addType('status', 'string'); + $this->addType('message', 'string'); + $this->addType('replacementUserId', 'string'); + $this->addType('replacementUserDisplayName', 'string'); + } + + public function toOutOufOfficeData(IUser $user, string $timezone): IOutOfOfficeData { + if ($user->getUID() !== $this->getUserId()) { + throw new InvalidArgumentException("The user doesn't match the user id of this absence! Expected " . $this->getUserId() . ', got ' . $user->getUID()); + } + if ($this->getId() === null) { + throw new Exception('Creating out-of-office data without ID'); + } + + $tz = new \DateTimeZone($timezone); + $startDate = new DateTime($this->getFirstDay(), $tz); + $endDate = new DateTime($this->getLastDay(), $tz); + $endDate->setTime(23, 59); + return new OutOfOfficeData( + (string)$this->getId(), + $user, + $startDate->getTimestamp(), + $endDate->getTimestamp(), + $this->getStatus(), + $this->getMessage(), + $this->getReplacementUserId(), + $this->getReplacementUserDisplayName(), + ); + } + + public function jsonSerialize(): array { + return [ + 'userId' => $this->userId, + 'firstDay' => $this->firstDay, + 'lastDay' => $this->lastDay, + 'status' => $this->status, + 'message' => $this->message, + 'replacementUserId' => $this->replacementUserId, + 'replacementUserDisplayName' => $this->replacementUserDisplayName, + ]; + } +} |