Remove all legacy event dispatchers from CalDAV & CardDAV backends

Move them to proper EventListeners and test them

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel 2022-05-12 17:29:57 +02:00
parent 07c9bf1adf
commit 4bb31c021e
No known key found for this signature in database
GPG key ID: A061B9DDE0CA0773
22 changed files with 616 additions and 252 deletions

View file

@ -61,7 +61,6 @@ $userManager = \OC::$server->getUserManager();
$random = \OC::$server->getSecureRandom();
$logger = \OC::$server->get(LoggerInterface::class);
$dispatcher = \OC::$server->get(\OCP\EventDispatcher\IEventDispatcher::class);
$legacyDispatcher = \OC::$server->getEventDispatcher();
$config = \OC::$server->get(\OCP\IConfig::class);
$calDavBackend = new CalDavBackend(
@ -72,7 +71,6 @@ $calDavBackend = new CalDavBackend(
$random,
$logger,
$dispatcher,
$legacyDispatcher,
$config,
true
);

View file

@ -8,6 +8,7 @@
* @author John Molakvoæ <skjnldsv@protonmail.com>
* @author Lukas Reschke <lukas@statuscode.ch>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Thomas Citharel <nextcloud@tcit.fr>
* @author Thomas Müller <thomas.mueller@tmit.eu>
*
* @license AGPL-3.0
@ -60,7 +61,7 @@ $principalBackend = new Principal(
'principals/'
);
$db = \OC::$server->getDatabaseConnection();
$cardDavBackend = new CardDavBackend($db, $principalBackend, \OC::$server->getUserManager(), \OC::$server->getGroupManager(), \OC::$server->get(\OCP\EventDispatcher\IEventDispatcher::class), \OC::$server->getEventDispatcher());
$cardDavBackend = new CardDavBackend($db, $principalBackend, \OC::$server->getUserManager(), \OC::$server->getGroupManager(), \OC::$server->get(\OCP\EventDispatcher\IEventDispatcher::class));
$debugging = \OC::$server->getConfig()->getSystemValue('debug', false);

View file

@ -235,10 +235,15 @@ return array(
'OCA\\DAV\\HookManager' => $baseDir . '/../lib/HookManager.php',
'OCA\\DAV\\Listener\\ActivityUpdaterListener' => $baseDir . '/../lib/Listener/ActivityUpdaterListener.php',
'OCA\\DAV\\Listener\\AddressbookListener' => $baseDir . '/../lib/Listener/AddressbookListener.php',
'OCA\\DAV\\Listener\\BirthdayListener' => $baseDir . '/../lib/Listener/BirthdayListener.php',
'OCA\\DAV\\Listener\\CalendarContactInteractionListener' => $baseDir . '/../lib/Listener/CalendarContactInteractionListener.php',
'OCA\\DAV\\Listener\\CalendarDeletionDefaultUpdaterListener' => $baseDir . '/../lib/Listener/CalendarDeletionDefaultUpdaterListener.php',
'OCA\\DAV\\Listener\\CalendarObjectReminderUpdaterListener' => $baseDir . '/../lib/Listener/CalendarObjectReminderUpdaterListener.php',
'OCA\\DAV\\Listener\\CalendarPublicationListener' => $baseDir . '/../lib/Listener/CalendarPublicationListener.php',
'OCA\\DAV\\Listener\\CalendarShareUpdateListener' => $baseDir . '/../lib/Listener/CalendarShareUpdateListener.php',
'OCA\\DAV\\Listener\\CardListener' => $baseDir . '/../lib/Listener/CardListener.php',
'OCA\\DAV\\Listener\\ClearPhotoCacheListener' => $baseDir . '/../lib/Listener/ClearPhotoCacheListener.php',
'OCA\\DAV\\Listener\\SubscriptionListener' => $baseDir . '/../lib/Listener/SubscriptionListener.php',
'OCA\\DAV\\Migration\\BuildCalendarSearchIndex' => $baseDir . '/../lib/Migration/BuildCalendarSearchIndex.php',
'OCA\\DAV\\Migration\\BuildCalendarSearchIndexBackgroundJob' => $baseDir . '/../lib/Migration/BuildCalendarSearchIndexBackgroundJob.php',
'OCA\\DAV\\Migration\\BuildSocialSearchIndex' => $baseDir . '/../lib/Migration/BuildSocialSearchIndex.php',

View file

@ -250,10 +250,15 @@ class ComposerStaticInitDAV
'OCA\\DAV\\HookManager' => __DIR__ . '/..' . '/../lib/HookManager.php',
'OCA\\DAV\\Listener\\ActivityUpdaterListener' => __DIR__ . '/..' . '/../lib/Listener/ActivityUpdaterListener.php',
'OCA\\DAV\\Listener\\AddressbookListener' => __DIR__ . '/..' . '/../lib/Listener/AddressbookListener.php',
'OCA\\DAV\\Listener\\BirthdayListener' => __DIR__ . '/..' . '/../lib/Listener/BirthdayListener.php',
'OCA\\DAV\\Listener\\CalendarContactInteractionListener' => __DIR__ . '/..' . '/../lib/Listener/CalendarContactInteractionListener.php',
'OCA\\DAV\\Listener\\CalendarDeletionDefaultUpdaterListener' => __DIR__ . '/..' . '/../lib/Listener/CalendarDeletionDefaultUpdaterListener.php',
'OCA\\DAV\\Listener\\CalendarObjectReminderUpdaterListener' => __DIR__ . '/..' . '/../lib/Listener/CalendarObjectReminderUpdaterListener.php',
'OCA\\DAV\\Listener\\CalendarPublicationListener' => __DIR__ . '/..' . '/../lib/Listener/CalendarPublicationListener.php',
'OCA\\DAV\\Listener\\CalendarShareUpdateListener' => __DIR__ . '/..' . '/../lib/Listener/CalendarShareUpdateListener.php',
'OCA\\DAV\\Listener\\CardListener' => __DIR__ . '/..' . '/../lib/Listener/CardListener.php',
'OCA\\DAV\\Listener\\ClearPhotoCacheListener' => __DIR__ . '/..' . '/../lib/Listener/ClearPhotoCacheListener.php',
'OCA\\DAV\\Listener\\SubscriptionListener' => __DIR__ . '/..' . '/../lib/Listener/SubscriptionListener.php',
'OCA\\DAV\\Migration\\BuildCalendarSearchIndex' => __DIR__ . '/..' . '/../lib/Migration/BuildCalendarSearchIndex.php',
'OCA\\DAV\\Migration\\BuildCalendarSearchIndexBackgroundJob' => __DIR__ . '/..' . '/../lib/Migration/BuildCalendarSearchIndexBackgroundJob.php',
'OCA\\DAV\\Migration\\BuildSocialSearchIndex' => __DIR__ . '/..' . '/../lib/Migration/BuildSocialSearchIndex.php',

View file

@ -35,18 +35,14 @@ namespace OCA\DAV\AppInfo;
use Exception;
use OCA\DAV\BackgroundJob\UpdateCalendarResourcesRoomsBackgroundJob;
use OCA\DAV\CalDAV\Activity\Backend;
use OCA\DAV\CalDAV\BirthdayService;
use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CalDAV\CalendarManager;
use OCA\DAV\CalDAV\CalendarProvider;
use OCA\DAV\CalDAV\Reminder\Backend as ReminderBackend;
use OCA\DAV\CalDAV\Reminder\NotificationProvider\AudioProvider;
use OCA\DAV\CalDAV\Reminder\NotificationProvider\EmailProvider;
use OCA\DAV\CalDAV\Reminder\NotificationProvider\PushProvider;
use OCA\DAV\CalDAV\Reminder\NotificationProviderManager;
use OCA\DAV\CalDAV\Reminder\Notifier;
use OCA\DAV\CalDAV\WebcalCaching\RefreshWebcalService;
use OCA\DAV\Capabilities;
use OCA\DAV\CardDAV\CardDavBackend;
use OCA\DAV\CardDAV\ContactsManager;
@ -64,19 +60,28 @@ use OCA\DAV\Events\CalendarObjectDeletedEvent;
use OCA\DAV\Events\CalendarObjectMovedToTrashEvent;
use OCA\DAV\Events\CalendarObjectRestoredEvent;
use OCA\DAV\Events\CalendarObjectUpdatedEvent;
use OCA\DAV\Events\CalendarPublishedEvent;
use OCA\DAV\Events\CalendarRestoredEvent;
use OCA\DAV\Events\CalendarShareUpdatedEvent;
use OCA\DAV\Events\CalendarUnpublishedEvent;
use OCA\DAV\Events\CalendarUpdatedEvent;
use OCA\DAV\Events\CardCreatedEvent;
use OCA\DAV\Events\CardDeletedEvent;
use OCA\DAV\Events\CardUpdatedEvent;
use OCA\DAV\Events\SubscriptionCreatedEvent;
use OCA\DAV\Events\SubscriptionDeletedEvent;
use OCA\DAV\HookManager;
use OCA\DAV\Listener\ActivityUpdaterListener;
use OCA\DAV\Listener\AddressbookListener;
use OCA\DAV\Listener\BirthdayListener;
use OCA\DAV\Listener\CalendarContactInteractionListener;
use OCA\DAV\Listener\CalendarDeletionDefaultUpdaterListener;
use OCA\DAV\Listener\CalendarObjectReminderUpdaterListener;
use OCA\DAV\Listener\CalendarPublicationListener;
use OCA\DAV\Listener\CalendarShareUpdateListener;
use OCA\DAV\Listener\CardListener;
use OCA\DAV\Listener\ClearPhotoCacheListener;
use OCA\DAV\Listener\SubscriptionListener;
use OCA\DAV\Search\ContactsSearchProvider;
use OCA\DAV\Search\EventsSearchProvider;
use OCA\DAV\Search\TasksSearchProvider;
@ -154,6 +159,12 @@ class Application extends App implements IBootstrap {
$context->registerEventListener(CalendarObjectRestoredEvent::class, ActivityUpdaterListener::class);
$context->registerEventListener(CalendarObjectRestoredEvent::class, CalendarObjectReminderUpdaterListener::class);
$context->registerEventListener(CalendarShareUpdatedEvent::class, CalendarContactInteractionListener::class);
$context->registerEventListener(CalendarPublishedEvent::class, CalendarPublicationListener::class);
$context->registerEventListener(CalendarUnpublishedEvent::class, CalendarPublicationListener::class);
$context->registerEventListener(CalendarShareUpdatedEvent::class, CalendarShareUpdateListener::class);
$context->registerEventListener(SubscriptionCreatedEvent::class, SubscriptionListener::class);
$context->registerEventListener(SubscriptionDeletedEvent::class, SubscriptionListener::class);
$context->registerEventListener(AddressBookCreatedEvent::class, AddressbookListener::class);
@ -163,6 +174,11 @@ class Application extends App implements IBootstrap {
$context->registerEventListener(CardCreatedEvent::class, CardListener::class);
$context->registerEventListener(CardDeletedEvent::class, CardListener::class);
$context->registerEventListener(CardUpdatedEvent::class, CardListener::class);
$context->registerEventListener(CardCreatedEvent::class, BirthdayListener::class);
$context->registerEventListener(CardDeletedEvent::class, BirthdayListener::class);
$context->registerEventListener(CardUpdatedEvent::class, BirthdayListener::class);
$context->registerEventListener(CardDeletedEvent::class, ClearPhotoCacheListener::class);
$context->registerEventListener(CardUpdatedEvent::class, ClearPhotoCacheListener::class);
$context->registerNotifierService(Notifier::class);
@ -195,44 +211,6 @@ class Application extends App implements IBootstrap {
}
});
$birthdayListener = function ($event) use ($container): void {
if ($event instanceof GenericEvent) {
/** @var BirthdayService $b */
$b = $container->query(BirthdayService::class);
$b->onCardChanged(
(int) $event->getArgument('addressBookId'),
(string) $event->getArgument('cardUri'),
(string) $event->getArgument('cardData')
);
}
};
$dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::createCard', $birthdayListener);
$dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::updateCard', $birthdayListener);
$dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', function ($event) use ($container) {
if ($event instanceof GenericEvent) {
/** @var BirthdayService $b */
$b = $container->query(BirthdayService::class);
$b->onCardDeleted(
(int) $event->getArgument('addressBookId'),
(string) $event->getArgument('cardUri')
);
}
});
$clearPhotoCache = function ($event) use ($container): void {
if ($event instanceof GenericEvent) {
/** @var PhotoCache $p */
$p = $container->query(PhotoCache::class);
$p->delete(
$event->getArgument('addressBookId'),
$event->getArgument('cardUri')
);
}
};
$dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::updateCard', $clearPhotoCache);
$dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', $clearPhotoCache);
$dispatcher->addListener('OC\AccountManager::userUpdated', function (GenericEvent $event) use ($container) {
$user = $event->getSubject();
/** @var SyncService $syncService */
@ -254,16 +232,6 @@ class Application extends App implements IBootstrap {
// Here we should recalculate if reminders should be sent to new or old sharees
});
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::publishCalendar', function (GenericEvent $event) use ($container) {
/** @var Backend $backend */
$backend = $container->query(Backend::class);
$backend->onCalendarPublication(
$event->getArgument('calendarData'),
$event->getArgument('public')
);
});
$dispatcher->addListener('OCP\Federation\TrustedServerEvent::remove',
function (GenericEvent $event) {
/** @var CardDavBackend $cardDavBackend */
@ -276,48 +244,6 @@ class Application extends App implements IBootstrap {
}
);
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::createSubscription',
function (GenericEvent $event) use ($container, $serverContainer) {
$jobList = $serverContainer->getJobList();
$subscriptionData = $event->getArgument('subscriptionData');
/**
* Initial subscription refetch
*
* @var RefreshWebcalService $refreshWebcalService
*/
$refreshWebcalService = $container->query(RefreshWebcalService::class);
$refreshWebcalService->refreshSubscription(
(string) $subscriptionData['principaluri'],
(string) $subscriptionData['uri']
);
$jobList->add(\OCA\DAV\BackgroundJob\RefreshWebcalJob::class, [
'principaluri' => $subscriptionData['principaluri'],
'uri' => $subscriptionData['uri']
]);
}
);
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::deleteSubscription',
function (GenericEvent $event) use ($container, $serverContainer) {
$jobList = $serverContainer->getJobList();
$subscriptionData = $event->getArgument('subscriptionData');
$jobList->remove(\OCA\DAV\BackgroundJob\RefreshWebcalJob::class, [
'principaluri' => $subscriptionData['principaluri'],
'uri' => $subscriptionData['uri']
]);
/** @var CalDavBackend $calDavBackend */
$calDavBackend = $container->get(CalDavBackend::class);
$calDavBackend->purgeAllCachedEventsForSubscription($subscriptionData['id']);
/** @var ReminderBackend $calDavBackend */
$reminderBackend = $container->get(ReminderBackend::class);
$reminderBackend->cleanRemindersForCalendar((int) $subscriptionData['id']);
}
);
$eventHandler = function () use ($container, $serverContainer): void {
try {
/** @var UpdateCalendarResourcesRoomsBackgroundJob $job */

View file

@ -119,7 +119,7 @@ class Backend {
* @param array $calendarData
* @param bool $publishStatus
*/
public function onCalendarPublication(array $calendarData, $publishStatus) {
public function onCalendarPublication(array $calendarData, bool $publishStatus): void {
$this->triggerCalendarActivity($publishStatus ? Calendar::SUBJECT_PUBLISH : Calendar::SUBJECT_UNPUBLISH, $calendarData);
}

View file

@ -95,8 +95,6 @@ use Sabre\VObject\ParseException;
use Sabre\VObject\Property;
use Sabre\VObject\Reader;
use Sabre\VObject\Recur\EventIterator;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
use function array_column;
use function array_merge;
use function array_values;
@ -247,7 +245,6 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
ISecureRandom $random,
LoggerInterface $logger,
IEventDispatcher $dispatcher,
EventDispatcherInterface $legacyDispatcher,
IConfig $config,
bool $legacyEndpoint = false) {
$this->db = $db;
@ -257,7 +254,6 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$this->random = $random;
$this->logger = $logger;
$this->dispatcher = $dispatcher;
$this->legacyDispatcher = $legacyDispatcher;
$this->config = $config;
$this->legacyEndpoint = $legacyEndpoint;
}
@ -1300,15 +1296,6 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$subscriptionRow = $this->getSubscriptionById($calendarId);
$this->dispatcher->dispatchTyped(new CachedCalendarObjectCreatedEvent((int)$calendarId, $subscriptionRow, [], $objectRow));
$this->legacyDispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::createCachedCalendarObject', new GenericEvent(
'\OCA\DAV\CalDAV\CalDavBackend::createCachedCalendarObject',
[
'subscriptionId' => $calendarId,
'calendarData' => $subscriptionRow,
'shares' => [],
'objectData' => $objectRow,
]
));
}
return '"' . $extraData['etag'] . '"';
@ -1365,15 +1352,6 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$subscriptionRow = $this->getSubscriptionById($calendarId);
$this->dispatcher->dispatchTyped(new CachedCalendarObjectUpdatedEvent((int)$calendarId, $subscriptionRow, [], $objectRow));
$this->legacyDispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::updateCachedCalendarObject', new GenericEvent(
'\OCA\DAV\CalDAV\CalDavBackend::updateCachedCalendarObject',
[
'subscriptionId' => $calendarId,
'calendarData' => $subscriptionRow,
'shares' => [],
'objectData' => $objectRow,
]
));
}
}
@ -1481,15 +1459,6 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$subscriptionRow = $this->getSubscriptionById($calendarId);
$this->dispatcher->dispatchTyped(new CachedCalendarObjectDeletedEvent((int)$calendarId, $subscriptionRow, [], $data));
$this->legacyDispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::deleteCachedCalendarObject', new GenericEvent(
'\OCA\DAV\CalDAV\CalDavBackend::deleteCachedCalendarObject',
[
'subscriptionId' => $calendarId,
'calendarData' => $subscriptionRow,
'shares' => [],
'objectData' => $data,
]
));
}
} else {
$pathInfo = pathinfo($data['uri']);
@ -2500,12 +2469,6 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$subscriptionRow = $this->getSubscriptionById($subscriptionId);
$this->dispatcher->dispatchTyped(new SubscriptionCreatedEvent($subscriptionId, $subscriptionRow));
$this->legacyDispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::createSubscription', new GenericEvent(
'\OCA\DAV\CalDAV\CalDavBackend::createSubscription',
[
'subscriptionId' => $subscriptionId,
'subscriptionData' => $subscriptionRow,
]));
return $subscriptionId;
}
@ -2553,13 +2516,6 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$subscriptionRow = $this->getSubscriptionById($subscriptionId);
$this->dispatcher->dispatchTyped(new SubscriptionUpdatedEvent((int)$subscriptionId, $subscriptionRow, [], $mutations));
$this->legacyDispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::updateSubscription', new GenericEvent(
'\OCA\DAV\CalDAV\CalDavBackend::updateSubscription',
[
'subscriptionId' => $subscriptionId,
'subscriptionData' => $subscriptionRow,
'propertyMutations' => $mutations,
]));
return true;
});
@ -2574,13 +2530,6 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
public function deleteSubscription($subscriptionId) {
$subscriptionRow = $this->getSubscriptionById($subscriptionId);
$this->legacyDispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::deleteSubscription', new GenericEvent(
'\OCA\DAV\CalDAV\CalDavBackend::deleteSubscription',
[
'subscriptionId' => $subscriptionId,
'subscriptionData' => $this->getSubscriptionById($subscriptionId),
]));
$query = $this->db->getQueryBuilder();
$query->delete('calendarsubscriptions')
->where($query->expr()->eq('id', $query->createNamedParameter($subscriptionId)))
@ -2878,15 +2827,6 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$calendarRow = $this->getCalendarById($calendarId);
$oldShares = $this->getShares($calendarId);
$this->legacyDispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::updateShares', new GenericEvent(
'\OCA\DAV\CalDAV\CalDavBackend::updateShares',
[
'calendarId' => $calendarId,
'calendarData' => $calendarRow,
'shares' => $oldShares,
'add' => $add,
'remove' => $remove,
]));
$this->calendarSharingBackend->updateShares($shareable, $add, $remove);
$this->dispatcher->dispatchTyped(new CalendarShareUpdatedEvent((int)$calendarId, $calendarRow, $oldShares, $add, $remove));
@ -2908,13 +2848,6 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
public function setPublishStatus($value, $calendar) {
$calendarId = $calendar->getResourceId();
$calendarData = $this->getCalendarById($calendarId);
$this->legacyDispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::publishCalendar', new GenericEvent(
'\OCA\DAV\CalDAV\CalDavBackend::updateShares',
[
'calendarId' => $calendarId,
'calendarData' => $calendarData,
'public' => $value,
]));
$query = $this->db->getQueryBuilder();
if ($value) {

View file

@ -58,8 +58,6 @@ use Sabre\CardDAV\Plugin;
use Sabre\DAV\Exception\BadRequest;
use Sabre\VObject\Component\VCard;
use Sabre\VObject\Reader;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
class CardDavBackend implements BackendInterface, SyncSupport {
public const PERSONAL_ADDRESSBOOK_URI = 'contacts';
@ -110,19 +108,16 @@ class CardDavBackend implements BackendInterface, SyncSupport {
* @param IUserManager $userManager
* @param IGroupManager $groupManager
* @param IEventDispatcher $dispatcher
* @param EventDispatcherInterface $legacyDispatcher
*/
public function __construct(IDBConnection $db,
Principal $principalBackend,
IUserManager $userManager,
IGroupManager $groupManager,
IEventDispatcher $dispatcher,
EventDispatcherInterface $legacyDispatcher) {
IEventDispatcher $dispatcher) {
$this->db = $db;
$this->principalBackend = $principalBackend;
$this->userManager = $userManager;
$this->dispatcher = $dispatcher;
$this->legacyDispatcher = $legacyDispatcher;
$this->sharingBackend = new Backend($this->db, $this->userManager, $groupManager, $principalBackend, 'addressbook');
}
@ -692,11 +687,6 @@ class CardDavBackend implements BackendInterface, SyncSupport {
$shares = $this->getShares($addressBookId);
$objectRow = $this->getCard($addressBookId, $cardUri);
$this->dispatcher->dispatchTyped(new CardCreatedEvent($addressBookId, $addressBookData, $shares, $objectRow));
$this->legacyDispatcher->dispatch('\OCA\DAV\CardDAV\CardDavBackend::createCard',
new GenericEvent(null, [
'addressBookId' => $addressBookId,
'cardUri' => $cardUri,
'cardData' => $cardData]));
return '"' . $etag . '"';
}
@ -756,12 +746,6 @@ class CardDavBackend implements BackendInterface, SyncSupport {
$shares = $this->getShares($addressBookId);
$objectRow = $this->getCard($addressBookId, $cardUri);
$this->dispatcher->dispatchTyped(new CardUpdatedEvent($addressBookId, $addressBookData, $shares, $objectRow));
$this->legacyDispatcher->dispatch('\OCA\DAV\CardDAV\CardDavBackend::updateCard',
new GenericEvent(null, [
'addressBookId' => $addressBookId,
'cardUri' => $cardUri,
'cardData' => $cardData]));
return '"' . $etag . '"';
}
@ -793,11 +777,6 @@ class CardDavBackend implements BackendInterface, SyncSupport {
if ($ret === 1) {
if ($cardId !== null) {
$this->dispatcher->dispatchTyped(new CardDeletedEvent($addressBookId, $addressBookData, $shares, $objectRow));
$this->legacyDispatcher->dispatch('\OCA\DAV\CardDAV\CardDavBackend::deleteCard',
new GenericEvent(null, [
'addressBookId' => $addressBookId,
'cardUri' => $cardUri]));
$this->purgeProperties($addressBookId, $cardId);
}
return true;

View file

@ -94,7 +94,6 @@ class CreateCalendar extends Command {
$random = \OC::$server->getSecureRandom();
$logger = \OC::$server->get(LoggerInterface::class);
$dispatcher = \OC::$server->get(IEventDispatcher::class);
$legacyDispatcher = \OC::$server->getEventDispatcher();
$config = \OC::$server->get(IConfig::class);
$name = $input->getArgument('name');
@ -106,7 +105,6 @@ class CreateCalendar extends Command {
$random,
$logger,
$dispatcher,
$legacyDispatcher,
$config
);
$caldav->createCalendar("principals/users/$user", $name, []);

View file

@ -0,0 +1,54 @@
<?php
declare(strict_types=1);
/**
* @copyright 2022 Thomas Citharel <nextcloud@tcit.fr>
*
* @author Thomas Citharel <nextcloud@tcit.fr>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\DAV\Listener;
use OCA\DAV\CalDAV\BirthdayService;
use OCA\DAV\Events\CardCreatedEvent;
use OCA\DAV\Events\CardDeletedEvent;
use OCA\DAV\Events\CardUpdatedEvent;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
class BirthdayListener implements IEventListener {
private BirthdayService $birthdayService;
public function __construct(BirthdayService $birthdayService) {
$this->birthdayService = $birthdayService;
}
public function handle(Event $event): void {
if ($event instanceof CardCreatedEvent || $event instanceof CardUpdatedEvent) {
$cardData = $event->getCardData();
$this->birthdayService->onCardChanged($event->getAddressBookId(), $cardData['uri'], $cardData['carddata']);
}
if ($event instanceof CardDeletedEvent) {
$cardData = $event->getCardData();
$this->birthdayService->onCardDeleted($event->getAddressBookId(), $cardData['uri']);
}
}
}

View file

@ -0,0 +1,65 @@
<?php
declare(strict_types=1);
/**
* @copyright 2022 Thomas Citharel <nextcloud@tcit.fr>
*
* @author Thomas Citharel <nextcloud@tcit.fr>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\DAV\Listener;
use OCA\DAV\CalDAV\Activity\Backend;
use OCA\DAV\Events\CalendarPublishedEvent;
use OCA\DAV\Events\CalendarUnpublishedEvent;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use Psr\Log\LoggerInterface;
class CalendarPublicationListener implements IEventListener {
private Backend $activityBackend;
private LoggerInterface $logger;
public function __construct(Backend $activityBackend,
LoggerInterface $logger) {
$this->activityBackend = $activityBackend;
$this->logger = $logger;
}
/**
* In case the user has set their default calendar to the deleted one
*/
public function handle(Event $event): void {
if ($event instanceof CalendarPublishedEvent) {
$this->logger->debug('Creating activity for Calendar being published');
$this->activityBackend->onCalendarPublication(
$event->getCalendarData(),
true
);
} elseif ($event instanceof CalendarUnpublishedEvent) {
$this->logger->debug('Creating activity for Calendar being unpublished');
$this->activityBackend->onCalendarPublication(
$event->getCalendarData(),
false
);
}
}
}

View file

@ -0,0 +1,62 @@
<?php
declare(strict_types=1);
/**
* @copyright 2022 Thomas Citharel <nextcloud@tcit.fr>
*
* @author Thomas Citharel <nextcloud@tcit.fr>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\DAV\Listener;
use OCA\DAV\CalDAV\Activity\Backend;
use OCA\DAV\Events\CalendarShareUpdatedEvent;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use Psr\Log\LoggerInterface;
class CalendarShareUpdateListener implements IEventListener {
private Backend $activityBackend;
private LoggerInterface $logger;
public function __construct(Backend $activityBackend,
LoggerInterface $logger) {
$this->activityBackend = $activityBackend;
$this->logger = $logger;
}
/**
* In case the user has set their default calendar to the deleted one
*/
public function handle(Event $event): void {
if (!($event instanceof CalendarShareUpdatedEvent)) {
// Not what we subscribed to
return;
}
$this->logger->debug("Creating activity for Calendar having it's shares updated");
$this->activityBackend->onCalendarUpdateShares(
$event->getCalendarData(),
$event->getOldShares(),
$event->getAdded(),
$event->getRemoved()
);
}
}

View file

@ -0,0 +1,48 @@
<?php
declare(strict_types=1);
/**
* @copyright 2022 Thomas Citharel <nextcloud@tcit.fr>
*
* @author Thomas Citharel <nextcloud@tcit.fr>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\DAV\Listener;
use OCA\DAV\CardDAV\PhotoCache;
use OCA\DAV\Events\CardDeletedEvent;
use OCA\DAV\Events\CardUpdatedEvent;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
class ClearPhotoCacheListener implements IEventListener {
private PhotoCache $photoCache;
public function __construct(PhotoCache $photoCache) {
$this->photoCache = $photoCache;
}
public function handle(Event $event): void {
if ($event instanceof CardUpdatedEvent || $event instanceof CardDeletedEvent) {
$cardData = $event->getCardData();
$this->photoCache->delete($event->getAddressBookId(), $cardData['uri']);
}
}
}

View file

@ -0,0 +1,85 @@
<?php
declare(strict_types=1);
/**
* @copyright 2022 Thomas Citharel <nextcloud@tcit.fr>
*
* @author Thomas Citharel <nextcloud@tcit.fr>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\DAV\Listener;
use OCA\DAV\BackgroundJob\RefreshWebcalJob;
use OCA\DAV\CalDAV\Reminder\Backend as ReminderBackend;
use OCA\DAV\CalDAV\WebcalCaching\RefreshWebcalService;
use OCA\DAV\Events\SubscriptionCreatedEvent;
use OCA\DAV\Events\SubscriptionDeletedEvent;
use OCP\BackgroundJob\IJobList;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use Psr\Log\LoggerInterface;
class SubscriptionListener implements IEventListener {
private IJobList $jobList;
private RefreshWebcalService $refreshWebcalService;
private ReminderBackend $reminderBackend;
private LoggerInterface $logger;
public function __construct(IJobList $jobList, RefreshWebcalService $refreshWebcalService, ReminderBackend $reminderBackend,
LoggerInterface $logger) {
$this->jobList = $jobList;
$this->refreshWebcalService = $refreshWebcalService;
$this->reminderBackend = $reminderBackend;
$this->logger = $logger;
}
/**
* In case the user has set their default calendar to the deleted one
*/
public function handle(Event $event): void {
if ($event instanceof SubscriptionCreatedEvent) {
$subscriptionId = $event->getSubscriptionId();
$subscriptionData = $event->getSubscriptionData();
$this->logger->debug('Refreshing webcal data for subscription ' . $subscriptionId);
$this->refreshWebcalService->refreshSubscription(
(string)$subscriptionData['principaluri'],
(string)$subscriptionData['uri']
);
$this->logger->debug('Scheduling webcal data refreshment for subscription ' . $subscriptionId);
$this->jobList->add(RefreshWebcalJob::class, [
'principaluri' => $subscriptionData['principaluri'],
'uri' => $subscriptionData['uri']
]);
} elseif ($event instanceof SubscriptionDeletedEvent) {
$subscriptionId = $event->getSubscriptionId();
$subscriptionData = $event->getSubscriptionData();
$this->logger->debug('Removing refresh webcal job for subscription ' . $subscriptionId);
$this->jobList->remove(RefreshWebcalJob::class, [
'principaluri' => $subscriptionData['principaluri'],
'uri' => $subscriptionData['uri']
]);
$this->logger->debug('Cleaning all reminders for subscription ' . $subscriptionId);
$this->reminderBackend->cleanRemindersForCalendar($subscriptionId);
}
}
}

View file

@ -7,6 +7,7 @@
* @author Georg Ehrke <oc.list@georgehrke.com>
* @author Joas Schilling <coding@schilljs.com>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Thomas Citharel <nextcloud@tcit.fr>
* @author Thomas Müller <thomas.mueller@tmit.eu>
* @author Vincent Petry <vincent@nextcloud.com>
*
@ -61,7 +62,6 @@ class RootCollection extends SimpleCollection {
$shareManager = \OC::$server->getShareManager();
$db = \OC::$server->getDatabaseConnection();
$dispatcher = \OC::$server->get(IEventDispatcher::class);
$legacyDispatcher = \OC::$server->getEventDispatcher();
$config = \OC::$server->get(IConfig::class);
$proxyMapper = \OC::$server->query(ProxyMapper::class);
@ -105,7 +105,6 @@ class RootCollection extends SimpleCollection {
$random,
$logger,
$dispatcher,
$legacyDispatcher,
$config
);
$userCalendarRoot = new CalendarRoot($userPrincipalBackend, $caldavBackend, 'principals/users', $logger);
@ -140,11 +139,11 @@ class RootCollection extends SimpleCollection {
);
$pluginManager = new PluginManager(\OC::$server, \OC::$server->query(IAppManager::class));
$usersCardDavBackend = new CardDavBackend($db, $userPrincipalBackend, $userManager, $groupManager, $dispatcher, $legacyDispatcher);
$usersCardDavBackend = new CardDavBackend($db, $userPrincipalBackend, $userManager, $groupManager, $dispatcher);
$usersAddressBookRoot = new AddressBookRoot($userPrincipalBackend, $usersCardDavBackend, $pluginManager, 'principals/users');
$usersAddressBookRoot->disableListing = $disableListing;
$systemCardDavBackend = new CardDavBackend($db, $userPrincipalBackend, $userManager, $groupManager, $dispatcher, $legacyDispatcher);
$systemCardDavBackend = new CardDavBackend($db, $userPrincipalBackend, $userManager, $groupManager, $dispatcher);
$systemAddressBookRoot = new AddressBookRoot(new SystemPrincipalBackend(), $systemCardDavBackend, $pluginManager, 'principals/system');
$systemAddressBookRoot->disableListing = $disableListing;

View file

@ -7,6 +7,7 @@
* @author Joas Schilling <coding@schilljs.com>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Thomas Citharel <nextcloud@tcit.fr>
* @author Thomas Müller <thomas.mueller@tmit.eu>
*
* @license AGPL-3.0
@ -42,7 +43,6 @@ use OCP\Share\IManager as ShareManager;
use Psr\Log\LoggerInterface;
use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet;
use Sabre\DAV\Xml\Property\Href;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Test\TestCase;
/**
@ -65,8 +65,6 @@ abstract class AbstractCalDavBackend extends TestCase {
protected $groupManager;
/** @var IEventDispatcher|\PHPUnit\Framework\MockObject\MockObject */
protected $dispatcher;
/** @var EventDispatcherInterface|\PHPUnit\Framework\MockObject\MockObject */
protected $legacyDispatcher;
/** @var ISecureRandom */
private $random;
@ -84,7 +82,6 @@ abstract class AbstractCalDavBackend extends TestCase {
$this->userManager = $this->createMock(IUserManager::class);
$this->groupManager = $this->createMock(IGroupManager::class);
$this->dispatcher = $this->createMock(IEventDispatcher::class);
$this->legacyDispatcher = $this->createMock(EventDispatcherInterface::class);
$this->principal = $this->getMockBuilder(Principal::class)
->setConstructorArgs([
$this->userManager,
@ -120,7 +117,6 @@ abstract class AbstractCalDavBackend extends TestCase {
$this->random,
$this->logger,
$this->dispatcher,
$this->legacyDispatcher,
$this->config
);
@ -147,8 +143,6 @@ abstract class AbstractCalDavBackend extends TestCase {
$calendars = $this->backend->getCalendarsForUser($principal);
$this->dispatcher->expects(self::any())
->method('dispatchTyped');
$this->legacyDispatcher->expects(self::any())
->method('dispatch');
foreach ($calendars as $calendar) {
$this->backend->deleteCalendar($calendar['id'], true);
}

View file

@ -150,9 +150,6 @@ class CalDavBackendTest extends AbstractCalDavBackend {
$calendars = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
$this->assertCount(1, $calendars);
$calendar = new Calendar($this->backend, $calendars[0], $l10n, $config, $logger);
$this->legacyDispatcher->expects($this->at(0))
->method('dispatch')
->with('\OCA\DAV\CalDAV\CalDavBackend::updateShares');
$this->backend->updateShares($calendar, $add, []);
$calendars = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER1);
$this->assertCount(1, $calendars);

View file

@ -0,0 +1,79 @@
<?php
/**
* @copyright 2022 Thomas Citharel <nextcloud@tcit.fr>
*
* @author Thomas Citharel <nextcloud@tcit.fr>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\DAV\Tests\unit\CalDAV\Listeners;
use OCA\DAV\CalDAV\Activity\Backend;
use OCA\DAV\Events\CalendarPublishedEvent;
use OCA\DAV\Events\CalendarUnpublishedEvent;
use OCA\DAV\Listener\CalendarPublicationListener;
use OCP\EventDispatcher\Event;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\LoggerInterface;
use Test\TestCase;
class CalendarPublicationListenerTest extends TestCase {
/** @var Backend|MockObject */
private $activityBackend;
/** @var LoggerInterface|MockObject */
private $logger;
private CalendarPublicationListener $calendarPublicationListener;
/** @var CalendarPublishedEvent|MockObject */
private $publicationEvent;
/** @var CalendarUnpublishedEvent|MockObject */
private $unpublicationEvent;
protected function setUp(): void {
parent::setUp();
$this->activityBackend = $this->createMock(Backend::class);
$this->logger = $this->createMock(LoggerInterface::class);
$this->publicationEvent = $this->createMock(CalendarPublishedEvent::class);
$this->unpublicationEvent = $this->createMock(CalendarUnpublishedEvent::class);
$this->calendarPublicationListener = new CalendarPublicationListener($this->activityBackend, $this->logger);
}
public function testInvalidEvent(): void {
$this->activityBackend->expects($this->never())->method('onCalendarPublication');
$this->logger->expects($this->never())->method('debug');
$this->calendarPublicationListener->handle(new Event());
}
public function testPublicationEvent(): void {
$this->publicationEvent->expects($this->once())->method('getCalendarData')->with()->willReturn([]);
$this->activityBackend->expects($this->once())->method('onCalendarPublication')->with([], true);
$this->logger->expects($this->once())->method('debug');
$this->calendarPublicationListener->handle($this->publicationEvent);
}
public function testUnPublicationEvent(): void {
$this->unpublicationEvent->expects($this->once())->method('getCalendarData')->with()->willReturn([]);
$this->activityBackend->expects($this->once())->method('onCalendarPublication')->with([], false);
$this->logger->expects($this->once())->method('debug');
$this->calendarPublicationListener->handle($this->unpublicationEvent);
}
}

View file

@ -0,0 +1,70 @@
<?php
/**
* @copyright 2022 Thomas Citharel <nextcloud@tcit.fr>
*
* @author Thomas Citharel <nextcloud@tcit.fr>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\DAV\Tests\unit\CalDAV\Listeners;
use OCA\DAV\CalDAV\Activity\Backend;
use OCA\DAV\Events\CalendarShareUpdatedEvent;
use OCA\DAV\Listener\CalendarShareUpdateListener;
use OCP\EventDispatcher\Event;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\LoggerInterface;
use Test\TestCase;
class CalendarShareUpdateListenerTest extends TestCase {
/** @var Backend|MockObject */
private $activityBackend;
/** @var LoggerInterface|MockObject */
private $logger;
private CalendarShareUpdateListener $calendarPublicationListener;
/** @var CalendarShareUpdatedEvent|MockObject */
private $event;
protected function setUp(): void {
parent::setUp();
$this->activityBackend = $this->createMock(Backend::class);
$this->logger = $this->createMock(LoggerInterface::class);
$this->event = $this->createMock(CalendarShareUpdatedEvent::class);
$this->calendarPublicationListener = new CalendarShareUpdateListener($this->activityBackend, $this->logger);
}
public function testInvalidEvent(): void {
$this->activityBackend->expects($this->never())->method('onCalendarUpdateShares');
$this->logger->expects($this->never())->method('debug');
$this->calendarPublicationListener->handle(new Event());
}
public function testEvent(): void {
$this->event->expects($this->once())->method('getCalendarData')->with()->willReturn([]);
$this->event->expects($this->once())->method('getOldShares')->with()->willReturn([]);
$this->event->expects($this->once())->method('getAdded')->with()->willReturn([]);
$this->event->expects($this->once())->method('getRemoved')->with()->willReturn([]);
$this->activityBackend->expects($this->once())->method('onCalendarUpdateShares')->with([], [], [], []);
$this->logger->expects($this->once())->method('debug');
$this->calendarPublicationListener->handle($this->event);
}
}

View file

@ -0,0 +1,95 @@
<?php
/**
* @copyright 2022 Thomas Citharel <nextcloud@tcit.fr>
*
* @author Thomas Citharel <nextcloud@tcit.fr>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\DAV\Tests\unit\CalDAV\Listeners;
use OCA\DAV\BackgroundJob\RefreshWebcalJob;
use OCA\DAV\CalDAV\Reminder\Backend;
use OCA\DAV\CalDAV\WebcalCaching\RefreshWebcalService;
use OCA\DAV\Events\SubscriptionCreatedEvent;
use OCA\DAV\Events\SubscriptionDeletedEvent;
use OCA\DAV\Listener\SubscriptionListener;
use OCP\BackgroundJob\IJobList;
use OCP\EventDispatcher\Event;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\LoggerInterface;
use Test\TestCase;
class SubscriptionListenerTest extends TestCase {
/** @var RefreshWebcalService|MockObject */
private $refreshWebcalService;
/** @var Backend|MockObject */
private $reminderBackend;
/** @var IJobList|MockObject */
private $jobList;
/** @var LoggerInterface|MockObject */
private $logger;
private SubscriptionListener $calendarPublicationListener;
/** @var SubscriptionCreatedEvent|MockObject */
private $subscriptionCreatedEvent;
/** @var SubscriptionDeletedEvent|MockObject */
private $subscriptionDeletedEvent;
protected function setUp(): void {
parent::setUp();
$this->refreshWebcalService = $this->createMock(RefreshWebcalService::class);
$this->reminderBackend = $this->createMock(Backend::class);
$this->jobList = $this->createMock(IJobList::class);
$this->logger = $this->createMock(LoggerInterface::class);
$this->subscriptionCreatedEvent = $this->createMock(SubscriptionCreatedEvent::class);
$this->subscriptionDeletedEvent = $this->createMock(SubscriptionDeletedEvent::class);
$this->calendarPublicationListener = new SubscriptionListener($this->jobList, $this->refreshWebcalService, $this->reminderBackend, $this->logger);
}
public function testInvalidEvent(): void {
$this->refreshWebcalService->expects($this->never())->method('refreshSubscription');
$this->jobList->expects($this->never())->method('add');
$this->logger->expects($this->never())->method('debug');
$this->calendarPublicationListener->handle(new Event());
}
public function testCreateSubscriptionEvent(): void {
$this->subscriptionCreatedEvent->expects($this->once())->method('getSubscriptionId')->with()->willReturn(5);
$this->subscriptionCreatedEvent->expects($this->once())->method('getSubscriptionData')->with()->willReturn(['principaluri' => 'principaluri', 'uri' => 'uri']);
$this->refreshWebcalService->expects($this->once())->method('refreshSubscription')->with('principaluri', 'uri');
$this->jobList->expects($this->once())->method('add')->with(RefreshWebcalJob::class, ['principaluri' => 'principaluri', 'uri' => 'uri']);
$this->logger->expects($this->exactly(2))->method('debug');
$this->calendarPublicationListener->handle($this->subscriptionCreatedEvent);
}
public function testDeleteSubscriptionEvent(): void {
$this->subscriptionDeletedEvent->expects($this->once())->method('getSubscriptionId')->with()->willReturn(5);
$this->subscriptionDeletedEvent->expects($this->once())->method('getSubscriptionData')->with()->willReturn(['principaluri' => 'principaluri', 'uri' => 'uri']);
$this->jobList->expects($this->once())->method('remove')->with(RefreshWebcalJob::class, ['principaluri' => 'principaluri', 'uri' => 'uri']);
$this->reminderBackend->expects($this->once())->method('cleanRemindersForCalendar')->with(5);
$this->logger->expects($this->exactly(2))->method('debug');
$this->calendarPublicationListener->handle($this->subscriptionDeletedEvent);
}
}

View file

@ -42,7 +42,6 @@ use OCP\IL10N;
use OCP\IUserManager;
use OCP\Security\ISecureRandom;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Test\TestCase;
/**
@ -84,7 +83,6 @@ class PublicCalendarRootTest extends TestCase {
$this->random = \OC::$server->getSecureRandom();
$this->logger = $this->createMock(LoggerInterface::class);
$dispatcher = $this->createMock(IEventDispatcher::class);
$legacyDispatcher = $this->createMock(EventDispatcherInterface::class);
$config = $this->createMock(IConfig::class);
$this->principal->expects($this->any())->method('getGroupMembership')
@ -103,7 +101,6 @@ class PublicCalendarRootTest extends TestCase {
$this->random,
$this->logger,
$dispatcher,
$legacyDispatcher,
$config
);
$this->l10n = $this->getMockBuilder(IL10N::class)

View file

@ -13,6 +13,7 @@
* @author Morris Jobke <hey@morrisjobke.de>
* @author Robin Appelman <robin@icewind.nl>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Thomas Citharel <nextcloud@tcit.fr>
* @author Thomas Müller <thomas.mueller@tmit.eu>
*
* @license AGPL-3.0
@ -52,8 +53,6 @@ use Sabre\DAV\Exception\BadRequest;
use Sabre\DAV\PropPatch;
use Sabre\VObject\Component\VCard;
use Sabre\VObject\Property\Text;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
use Test\TestCase;
/**
@ -77,10 +76,7 @@ class CardDavBackendTest extends TestCase {
/** @var IGroupManager|\PHPUnit\Framework\MockObject\MockObject */
private $groupManager;
/** @var EventDispatcherInterface|\PHPUnit\Framework\MockObject\MockObject */
private $legacyDispatcher;
/** @var IEventDispatcher|\PHPUnit\Framework\MockObject\MockObject */
/** @var IEventDispatcher|MockObject */
private $dispatcher;
/** @var IDBConnection */
@ -155,11 +151,10 @@ class CardDavBackendTest extends TestCase {
->withAnyParameters()
->willReturn([self::UNIT_TEST_GROUP]);
$this->dispatcher = $this->createMock(IEventDispatcher::class);
$this->legacyDispatcher = $this->createMock(EventDispatcherInterface::class);
$this->db = \OC::$server->getDatabaseConnection();
$this->backend = new CardDavBackend($this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher, $this->legacyDispatcher);
$this->backend = new CardDavBackend($this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher);
// start every test with a empty cards_properties and cards table
$query = $this->db->getQueryBuilder();
$query->delete('cards_properties')->execute();
@ -249,8 +244,8 @@ class CardDavBackendTest extends TestCase {
/** @var CardDavBackend | \PHPUnit\Framework\MockObject\MockObject $backend */
$backend = $this->getMockBuilder(CardDavBackend::class)
->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher, $this->legacyDispatcher])
->setMethods(['updateProperties', 'purgeProperties'])->getMock();
->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher])
->onlyMethods(['updateProperties', 'purgeProperties'])->getMock();
// create a new address book
$backend->createAddressBook(self::UNIT_TEST_USER, 'Example', []);
@ -264,13 +259,9 @@ class CardDavBackendTest extends TestCase {
$backend->expects($this->at(1))->method('updateProperties')->with($bookId, $uri, $this->vcardTest1);
// Expect event
$this->legacyDispatcher->expects($this->at(0))
->method('dispatch')
->with('\OCA\DAV\CardDAV\CardDavBackend::createCard', $this->callback(function (GenericEvent $e) use ($bookId, $uri) {
return $e->getArgument('addressBookId') === $bookId &&
$e->getArgument('cardUri') === $uri &&
$e->getArgument('cardData') === $this->vcardTest0;
}));
$this->dispatcher
->expects($this->exactly(3))
->method('dispatchTyped');
// create a card
$backend->createCard($bookId, $uri, $this->vcardTest0);
@ -290,28 +281,11 @@ class CardDavBackendTest extends TestCase {
$this->assertArrayHasKey('size', $card);
$this->assertEquals($this->vcardTest0, $card['carddata']);
// Expect event
$this->legacyDispatcher->expects($this->at(0))
->method('dispatch')
->with('\OCA\DAV\CardDAV\CardDavBackend::updateCard', $this->callback(function (GenericEvent $e) use ($bookId, $uri) {
return $e->getArgument('addressBookId') === $bookId &&
$e->getArgument('cardUri') === $uri &&
$e->getArgument('cardData') === $this->vcardTest1;
}));
// update the card
$backend->updateCard($bookId, $uri, $this->vcardTest1);
$card = $backend->getCard($bookId, $uri);
$this->assertEquals($this->vcardTest1, $card['carddata']);
// Expect event
$this->legacyDispatcher->expects($this->at(0))
->method('dispatch')
->with('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', $this->callback(function (GenericEvent $e) use ($bookId, $uri) {
return $e->getArgument('addressBookId') === $bookId &&
$e->getArgument('cardUri') === $uri;
}));
// delete the card
$backend->expects($this->once())->method('purgeProperties')->with($bookId, $card['id']);
$backend->deleteCard($bookId, $uri);
@ -321,7 +295,7 @@ class CardDavBackendTest extends TestCase {
public function testMultiCard() {
$this->backend = $this->getMockBuilder(CardDavBackend::class)
->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher, $this->legacyDispatcher])
->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher])
->setMethods(['updateProperties'])->getMock();
// create a new address book
@ -374,8 +348,8 @@ class CardDavBackendTest extends TestCase {
public function testMultipleUIDOnDifferentAddressbooks() {
$this->backend = $this->getMockBuilder(CardDavBackend::class)
->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher, $this->legacyDispatcher])
->setMethods(['updateProperties'])->getMock();
->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher])
->onlyMethods(['updateProperties'])->getMock();
// create 2 new address books
$this->backend->createAddressBook(self::UNIT_TEST_USER, 'Example', []);
@ -396,7 +370,7 @@ class CardDavBackendTest extends TestCase {
public function testMultipleUIDDenied() {
$this->backend = $this->getMockBuilder(CardDavBackend::class)
->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher, $this->legacyDispatcher])
->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher])
->setMethods(['updateProperties'])->getMock();
// create a new address book
@ -417,7 +391,7 @@ class CardDavBackendTest extends TestCase {
public function testNoValidUID() {
$this->backend = $this->getMockBuilder(CardDavBackend::class)
->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher, $this->legacyDispatcher])
->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher])
->setMethods(['updateProperties'])->getMock();
// create a new address book
@ -434,8 +408,8 @@ class CardDavBackendTest extends TestCase {
public function testDeleteWithoutCard() {
$this->backend = $this->getMockBuilder(CardDavBackend::class)
->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher, $this->legacyDispatcher])
->setMethods([
->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher])
->onlyMethods([
'getCardId',
'addChange',
'purgeProperties',
@ -474,7 +448,7 @@ class CardDavBackendTest extends TestCase {
public function testSyncSupport() {
$this->backend = $this->getMockBuilder(CardDavBackend::class)
->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher, $this->legacyDispatcher])
->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher])
->setMethods(['updateProperties'])->getMock();
// create a new address book
@ -540,8 +514,8 @@ class CardDavBackendTest extends TestCase {
$cardId = 2;
$backend = $this->getMockBuilder(CardDavBackend::class)
->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher, $this->legacyDispatcher])
->setMethods(['getCardId'])->getMock();
->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->groupManager, $this->dispatcher])
->onlyMethods(['getCardId'])->getMock();
$backend->expects($this->any())->method('getCardId')->willReturn($cardId);
@ -630,8 +604,8 @@ class CardDavBackendTest extends TestCase {
$qResult->closeCursor();
$this->assertSame(1, count($result));
$this->assertSame(1 ,(int)$result[0]['addressbookid']);
$this->assertSame(2 ,(int)$result[0]['cardid']);
$this->assertSame(1, (int)$result[0]['addressbookid']);
$this->assertSame(2, (int)$result[0]['cardid']);
}
public function testGetCardId() {