|
|
|
@ -38,6 +38,7 @@ use OCP\IGroup; |
|
|
|
|
use OCP\IGroupManager; |
|
|
|
|
use OCP\IUser; |
|
|
|
|
use OCP\IUserManager; |
|
|
|
|
use Psr\Log\LoggerInterface; |
|
|
|
|
use Sabre\VObject; |
|
|
|
|
use Sabre\VObject\Component\VAlarm; |
|
|
|
|
use Sabre\VObject\Component\VEvent; |
|
|
|
@ -46,6 +47,7 @@ use Sabre\VObject\ParseException; |
|
|
|
|
use Sabre\VObject\Recur\EventIterator; |
|
|
|
|
use Sabre\VObject\Recur\MaxInstancesExceededException; |
|
|
|
|
use Sabre\VObject\Recur\NoInstancesException; |
|
|
|
|
use function count; |
|
|
|
|
use function strcasecmp; |
|
|
|
|
|
|
|
|
|
class ReminderService { |
|
|
|
@ -71,6 +73,9 @@ class ReminderService { |
|
|
|
|
/** @var IConfig */ |
|
|
|
|
private $config; |
|
|
|
|
|
|
|
|
|
/** @var LoggerInterface */ |
|
|
|
|
private $logger; |
|
|
|
|
|
|
|
|
|
public const REMINDER_TYPE_EMAIL = 'EMAIL'; |
|
|
|
|
public const REMINDER_TYPE_DISPLAY = 'DISPLAY'; |
|
|
|
|
public const REMINDER_TYPE_AUDIO = 'AUDIO'; |
|
|
|
@ -86,24 +91,14 @@ class ReminderService { |
|
|
|
|
self::REMINDER_TYPE_AUDIO |
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* ReminderService constructor. |
|
|
|
|
* |
|
|
|
|
* @param Backend $backend |
|
|
|
|
* @param NotificationProviderManager $notificationProviderManager |
|
|
|
|
* @param IUserManager $userManager |
|
|
|
|
* @param IGroupManager $groupManager |
|
|
|
|
* @param CalDavBackend $caldavBackend |
|
|
|
|
* @param ITimeFactory $timeFactory |
|
|
|
|
* @param IConfig $config |
|
|
|
|
*/ |
|
|
|
|
public function __construct(Backend $backend, |
|
|
|
|
NotificationProviderManager $notificationProviderManager, |
|
|
|
|
IUserManager $userManager, |
|
|
|
|
IGroupManager $groupManager, |
|
|
|
|
CalDavBackend $caldavBackend, |
|
|
|
|
ITimeFactory $timeFactory, |
|
|
|
|
IConfig $config) { |
|
|
|
|
IConfig $config, |
|
|
|
|
LoggerInterface $logger) { |
|
|
|
|
$this->backend = $backend; |
|
|
|
|
$this->notificationProviderManager = $notificationProviderManager; |
|
|
|
|
$this->userManager = $userManager; |
|
|
|
@ -111,6 +106,7 @@ class ReminderService { |
|
|
|
|
$this->caldavBackend = $caldavBackend; |
|
|
|
|
$this->timeFactory = $timeFactory; |
|
|
|
|
$this->config = $config; |
|
|
|
|
$this->logger = $logger; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -119,8 +115,11 @@ class ReminderService { |
|
|
|
|
* @throws NotificationProvider\ProviderNotAvailableException |
|
|
|
|
* @throws NotificationTypeDoesNotExistException |
|
|
|
|
*/ |
|
|
|
|
public function processReminders():void { |
|
|
|
|
public function processReminders() :void { |
|
|
|
|
$reminders = $this->backend->getRemindersToProcess(); |
|
|
|
|
$this->logger->debug('{numReminders} reminders to process', [ |
|
|
|
|
'numReminders' => count($reminders), |
|
|
|
|
]); |
|
|
|
|
|
|
|
|
|
foreach ($reminders as $reminder) { |
|
|
|
|
$calendarData = is_resource($reminder['calendardata']) |
|
|
|
@ -133,22 +132,34 @@ class ReminderService { |
|
|
|
|
|
|
|
|
|
$vcalendar = $this->parseCalendarData($calendarData); |
|
|
|
|
if (!$vcalendar) { |
|
|
|
|
$this->logger->debug('Reminder {id} does not belong to a valid calendar', [ |
|
|
|
|
'id' => $reminder['id'], |
|
|
|
|
]); |
|
|
|
|
$this->backend->removeReminder($reminder['id']); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$vevent = $this->getVEventByRecurrenceId($vcalendar, $reminder['recurrence_id'], $reminder['is_recurrence_exception']); |
|
|
|
|
if (!$vevent) { |
|
|
|
|
$this->logger->debug('Reminder {id} does not belong to a valid event', [ |
|
|
|
|
'id' => $reminder['id'], |
|
|
|
|
]); |
|
|
|
|
$this->backend->removeReminder($reminder['id']); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($this->wasEventCancelled($vevent)) { |
|
|
|
|
$this->logger->debug('Reminder {id} belongs to a cancelled event', [ |
|
|
|
|
'id' => $reminder['id'], |
|
|
|
|
]); |
|
|
|
|
$this->deleteOrProcessNext($reminder, $vevent); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!$this->notificationProviderManager->hasProvider($reminder['type'])) { |
|
|
|
|
$this->logger->debug('Reminder {id} does not belong to a valid notification provider', [ |
|
|
|
|
'id' => $reminder['id'], |
|
|
|
|
]); |
|
|
|
|
$this->deleteOrProcessNext($reminder, $vevent); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
@ -164,6 +175,10 @@ class ReminderService { |
|
|
|
|
$users[] = $user; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$this->logger->debug('Reminder {id} will be sent to {numUsers} users', [ |
|
|
|
|
'id' => $reminder['id'], |
|
|
|
|
'numUsers' => count($users), |
|
|
|
|
]); |
|
|
|
|
$notificationProvider = $this->notificationProviderManager->getProvider($reminder['type']); |
|
|
|
|
$notificationProvider->send($vevent, $reminder['displayname'], $users); |
|
|
|
|
|
|
|
|
|