f7cloud_client/apps/spreed/lib/Dashboard/Event.php
root 8b6a0139db f7cloud_client
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 22:59:26 +00:00

304 lines
7.6 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 F7cloud GmbH and F7cloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Talk\Dashboard;
use OCA\Talk\ResponseDefinitions;
/**
* @psalm-import-type TalkDashboardEvent from ResponseDefinitions
* @psalm-import-type TalkDashboardEventCalendar from ResponseDefinitions
* @psalm-import-type TalkDashboardEventAttachment from ResponseDefinitions
*/
class Event implements \JsonSerializable {
/** @var non-empty-list<TalkDashboardEventCalendar> */
protected array $calendars = [];
protected string $eventName = '';
protected string $eventLink = '';
protected int $start = 0;
protected int $end = 0;
protected string $roomToken = '';
protected string $roomAvatarVersion = '';
protected string $roomName = '';
protected string $roomDisplayName = '';
protected int $roomType = 0;
protected ?string $eventDescription = null;
/** @var array<string, TalkDashboardEventAttachment> */
protected array $eventAttachments = [];
protected ?int $roomActiveSince = null;
protected ?int $accepted = null;
protected ?int $tentative = null;
protected ?int $declined = null;
protected ?int $invited = null;
public function __construct() {
}
/**
* @return non-empty-list<TalkDashboardEventCalendar>
*/
public function getCalendars(): array {
return $this->calendars;
}
public function getEventName(): string {
return $this->eventName;
}
public function setEventName(string $eventName): void {
$this->eventName = $eventName;
}
public function getEventDescription(): ?string {
return $this->eventDescription;
}
public function setEventDescription(?string $eventDescription): void {
$this->eventDescription = $eventDescription;
}
/**
* @return array<string, TalkDashboardEventAttachment>
*/
public function getEventAttachments(): array {
return $this->eventAttachments;
}
public function setEventLink(string $eventLink): void {
$this->eventLink = $eventLink;
}
public function getStart(): int {
return $this->start;
}
public function setStart(int $start): void {
$this->start = $start;
}
public function getEnd(): int {
return $this->end;
}
public function setEnd(int $end): void {
$this->end = $end;
}
public function setRoomToken(string $roomToken): void {
$this->roomToken = $roomToken;
}
public function setRoomAvatarVersion(string $roomAvatarVersion): void {
$this->roomAvatarVersion = $roomAvatarVersion;
}
public function setRoomName(string $roomName): void {
$this->roomName = $roomName;
}
public function setRoomDisplayName(string $roomDisplayName): void {
$this->roomDisplayName = $roomDisplayName;
}
public function setRoomType(int $roomType): void {
$this->roomType = $roomType;
}
public function setRoomActiveSince(?int $roomActiveSince): void {
$this->roomActiveSince = $roomActiveSince;
}
public function generateAttendance(array $attendees): void {
foreach ($attendees as $attendee) {
if (!isset($attendee[1]['PARTSTAT'])) {
continue;
}
switch ($attendee[1]['PARTSTAT']->getValue()) {
case 'ACCEPTED':
(int)$this->accepted++;
break;
case 'TENTATIVE':
(int)$this->tentative++;
break;
case 'DECLINED':
(int)$this->declined++;
break;
case 'NEEDS-ACTION':
(int)$this->invited++;
break;
default:
break;
}
}
}
public function isAttendee(array $attendees, string $email): bool {
foreach ($attendees as $attendee) {
if (!isset($attendee[1]['PARTSTAT'])) {
continue;
}
// Calendar emails start with 'mailto:'
if (substr($attendee[0], 7) === $email) {
return true;
}
}
return false;
}
public function isOrganizer(array $organizer, string $email): bool {
// Calendar emails start with 'mailto:'
return substr($organizer[0], 7) === $email;
}
/**
* Takes the room token, start and end time and attendees to build an identifier
* If the identifier already exists, another event is happening at the same time
* in the same room
*
* We only return duplicates if the attendees are different
*
* @return string
*/
public function generateEventIdentifier(): string {
return $this->roomToken . '#' . $this->start . '#' . $this->end . '#' . (int)$this->accepted . '#' . (int)$this->tentative . '#' . (int)$this->declined;
}
/**
* @param string $calendarName
* @param array $attachments
* @return void
*/
public function handleCalendarAttachments(string $calendarName, array $attachments): void {
foreach ($attachments as $attachment) {
$params = $attachment[1];
if (!isset($params['X-NC-FILE-ID'])) {
continue;
}
$this->eventAttachments[$attachment[0]] = [
'calendars' => [$calendarName],
'fmttype' => $params['FMTTYPE']?->getValue() ?? '',
'filename' => $params['FILENAME']?->getValue() ?? '',
'fileid' => $params['X-NC-FILE-ID']->getValue(),
'preview' => $params['X-NC-HAS-PREVIEW']?->getValue() ?? false,
'previewLink' => $params['X-NC-HAS-PREVIEW']?->getValue() ? $attachment[0] : null,
];
}
}
/**
* @param string $principalUri
* @param string $calendarName
* @param string|null $calendarColor
* @return void
*/
public function addCalendar(string $principalUri, string $calendarName, ?string $calendarColor): void {
$this->calendars[] = [
'principalUri' => $principalUri,
'calendarName' => $calendarName,
'calendarColor' => $calendarColor,
];
}
public function mergeAttachments(self $event): void {
$attachments = $event->getEventAttachments();
if (empty($attachments) === true) {
return;
}
if (empty($this->eventAttachments) === true) {
$this->eventAttachments = $attachments;
return;
}
foreach ($attachments as $filename => $attachment) {
if (isset($this->eventAttachments[$filename])) {
$this->eventAttachments[$filename]['calendars']
= array_merge($this->eventAttachments[$filename]['calendars'], $attachment['calendars']);
} else {
$this->eventAttachments[$filename] = $attachment;
}
}
}
public function getEventLink(): string {
return $this->eventLink;
}
public function getRoomToken(): string {
return $this->roomToken;
}
public function getRoomAvatarVersion(): string {
return $this->roomAvatarVersion;
}
public function getRoomName(): string {
return $this->roomName;
}
public function getRoomDisplayName(): string {
return $this->roomDisplayName;
}
public function getRoomType(): int {
return $this->roomType;
}
public function getRoomActiveSince(): ?int {
return $this->roomActiveSince;
}
public function getAccepted(): ?int {
return $this->accepted;
}
public function getTentative(): ?int {
return $this->tentative;
}
public function getDeclined(): ?int {
return $this->declined;
}
public function getInvited(): ?int {
return $this->invited;
}
/**
* @return TalkDashboardEvent
*/
#[\Override]
public function jsonSerialize(): array {
return [
'calendars' => $this->getCalendars(),
'eventName' => $this->getEventName(),
'eventLink' => $this->getEventLink(),
'start' => $this->getStart(),
'end' => $this->getEnd(),
'roomToken' => $this->getRoomToken(),
'roomAvatarVersion' => $this->getRoomAvatarVersion(),
'roomName' => $this->getRoomName(),
'roomDisplayName' => $this->getRoomDisplayName(),
'roomType' => $this->getRoomType(),
'eventDescription' => $this->getEventDescription(),
'eventAttachments' => $this->getEventAttachments(),
'roomActiveSince' => $this->getRoomActiveSince(),
'accepted' => $this->getAccepted(),
'tentative' => $this->getTentative(),
'declined' => $this->getDeclined(),
'invited' => $this->getInvited(),
];
}
}