Use the event dispatcher

Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
Joas Schilling 2016-10-13 15:34:26 +02:00
parent d3e8463de2
commit 52dd27892b
No known key found for this signature in database
GPG Key ID: E166FD8976B3BAC8
8 changed files with 189 additions and 177 deletions

View File

@ -48,10 +48,8 @@ $principalBackend = new Principal(
$db = \OC::$server->getDatabaseConnection(); $db = \OC::$server->getDatabaseConnection();
$userManager = \OC::$server->getUserManager(); $userManager = \OC::$server->getUserManager();
$random = \OC::$server->getSecureRandom(); $random = \OC::$server->getSecureRandom();
$groupManager = \OC::$server->getGroupManager(); $dispatcher = \OC::$server->getEventDispatcher();
$activityManager = \OC::$server->getActivityManager(); $calDavBackend = new CalDavBackend($db, $principalBackend, $userManager, $random, $dispatcher);
$userSession = \OC::$server->getUserSession();
$calDavBackend = new CalDavBackend($db, $principalBackend, $userManager, $groupManager, $random, $activityManager, $userSession);
$debugging = \OC::$server->getConfig()->getSystemValue('debug', false); $debugging = \OC::$server->getConfig()->getSystemValue('debug', false);

View File

@ -24,6 +24,7 @@
*/ */
namespace OCA\DAV\AppInfo; namespace OCA\DAV\AppInfo;
use OCA\DAV\CalDAV\Activity\Backend;
use OCA\DAV\CalDAV\Activity\Extension; use OCA\DAV\CalDAV\Activity\Extension;
use OCA\DAV\CalDAV\BirthdayService; use OCA\DAV\CalDAV\BirthdayService;
use OCA\DAV\Capabilities; use OCA\DAV\Capabilities;
@ -90,6 +91,62 @@ class Application extends App {
} }
}); });
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::createCalendar', function(GenericEvent $event) {
/** @var Backend $backend */
$backend = $this->getContainer()->query(Backend::class);
$backend->onCalendarAdd(
$event->getArgument('calendarData')
);
});
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::updateCalendar', function(GenericEvent $event) {
/** @var Backend $backend */
$backend = $this->getContainer()->query(Backend::class);
$backend->onCalendarUpdate(
$event->getArgument('calendarData'),
$event->getArgument('shares'),
$event->getArgument('propertyMutations')
);
});
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::deleteCalendar', function(GenericEvent $event) {
/** @var Backend $backend */
$backend = $this->getContainer()->query(Backend::class);
$backend->onCalendarDelete(
$event->getArgument('calendarData'),
$event->getArgument('shares')
);
});
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::updateShares', function(GenericEvent $event) {
/** @var Backend $backend */
$backend = $this->getContainer()->query(Backend::class);
$backend->onCalendarUpdateShares(
$event->getArgument('calendarData'),
$event->getArgument('shares'),
$event->getArgument('add'),
$event->getArgument('remove')
);
});
$listener = function(GenericEvent $event, $eventName) {
/** @var Backend $backend */
$backend = $this->getContainer()->query(Backend::class);
$subject = Extension::SUBJECT_OBJECT_ADD;
if ($eventName === '\OCA\DAV\CalDAV\CalDavBackend::updateCalendarObject') {
$subject = Extension::SUBJECT_OBJECT_UPDATE;
} else if ($eventName === '\OCA\DAV\CalDAV\CalDavBackend::deleteCalendarObject') {
$subject = Extension::SUBJECT_OBJECT_DELETE;
}
$backend->onTouchCalendarObject(
$subject,
$event->getArgument('calendarData'),
$event->getArgument('shares'),
$event->getArgument('objectData')
);
};
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject', $listener);
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::updateCalendarObject', $listener);
$dispatcher->addListener('\OCA\DAV\CalDAV\CalDavBackend::deleteCalendarObject', $listener);
$aM = $this->getContainer()->getServer()->getActivityManager(); $aM = $this->getContainer()->getServer()->getActivityManager();
$aM->registerExtension(function() { $aM->registerExtension(function() {
return $this->getContainer()->query(Extension::class); return $this->getContainer()->query(Extension::class);

View File

@ -22,8 +22,6 @@
namespace OCA\DAV\CalDAV\Activity; namespace OCA\DAV\CalDAV\Activity;
use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CalDAV\Calendar;
use OCP\Activity\IEvent; use OCP\Activity\IEvent;
use OCP\Activity\IManager as IActivityManager; use OCP\Activity\IManager as IActivityManager;
use OCP\IGroup; use OCP\IGroup;
@ -39,9 +37,6 @@ use Sabre\VObject\Reader;
*/ */
class Backend { class Backend {
/** @var CalDavBackend */
protected $calDavBackend;
/** @var IActivityManager */ /** @var IActivityManager */
protected $activityManager; protected $activityManager;
@ -52,13 +47,11 @@ class Backend {
protected $userSession; protected $userSession;
/** /**
* @param CalDavBackend $calDavBackend
* @param IActivityManager $activityManager * @param IActivityManager $activityManager
* @param IGroupManager $groupManager * @param IGroupManager $groupManager
* @param IUserSession $userSession * @param IUserSession $userSession
*/ */
public function __construct(CalDavBackend $calDavBackend, IActivityManager $activityManager, IGroupManager $groupManager, IUserSession $userSession) { public function __construct(IActivityManager $activityManager, IGroupManager $groupManager, IUserSession $userSession) {
$this->calDavBackend = $calDavBackend;
$this->activityManager = $activityManager; $this->activityManager = $activityManager;
$this->groupManager = $groupManager; $this->groupManager = $groupManager;
$this->userSession = $userSession; $this->userSession = $userSession;
@ -67,46 +60,47 @@ class Backend {
/** /**
* Creates activities when a calendar was creates * Creates activities when a calendar was creates
* *
* @param int $calendarId * @param array $calendarData
* @param array $properties
*/ */
public function addCalendar($calendarId, array $properties) { public function onCalendarAdd(array $calendarData) {
$this->triggerCalendarActivity(Extension::SUBJECT_ADD, $calendarId, $properties); $this->triggerCalendarActivity(Extension::SUBJECT_ADD, $calendarData);
} }
/** /**
* Creates activities when a calendar was updated * Creates activities when a calendar was updated
* *
* @param int $calendarId * @param array $calendarData
* @param array $shares
* @param array $properties * @param array $properties
*/ */
public function updateCalendar($calendarId, array $properties) { public function onCalendarUpdate(array $calendarData, array $shares, array $properties) {
$this->triggerCalendarActivity(Extension::SUBJECT_UPDATE, $calendarId, $properties); $this->triggerCalendarActivity(Extension::SUBJECT_UPDATE, $calendarData, $shares, $properties);
} }
/** /**
* Creates activities when a calendar was deleted * Creates activities when a calendar was deleted
* *
* @param int $calendarId * @param array $calendarData
* @param array $shares
*/ */
public function deleteCalendar($calendarId) { public function onCalendarDelete(array $calendarData, array $shares) {
$this->triggerCalendarActivity(Extension::SUBJECT_DELETE, $calendarId); $this->triggerCalendarActivity(Extension::SUBJECT_DELETE, $calendarData, $shares);
} }
/** /**
* Creates activities for all related users when a calendar was touched * Creates activities for all related users when a calendar was touched
* *
* @param string $action * @param string $action
* @param int $calendarId * @param array $calendarData
* @param array $shares
* @param array $changedProperties * @param array $changedProperties
*/ */
protected function triggerCalendarActivity($action, $calendarId, array $changedProperties = []) { protected function triggerCalendarActivity($action, array $calendarData, array $shares = [], array $changedProperties = []) {
$properties = $this->calDavBackend->getCalendarById($calendarId); if (!isset($calendarData['principaluri'])) {
if (!isset($properties['principaluri'])) {
return; return;
} }
$principal = explode('/', $properties['principaluri']); $principal = explode('/', $calendarData['principaluri']);
$owner = $principal[2]; $owner = $principal[2];
$currentUser = $this->userSession->getUser(); $currentUser = $this->userSession->getUser();
@ -118,7 +112,7 @@ class Backend {
$event = $this->activityManager->generateEvent(); $event = $this->activityManager->generateEvent();
$event->setApp('dav') $event->setApp('dav')
->setObject(Extension::CALENDAR, $calendarId) ->setObject(Extension::CALENDAR, $calendarData['id'])
->setType(Extension::CALENDAR) ->setType(Extension::CALENDAR)
->setAuthor($currentUser); ->setAuthor($currentUser);
@ -127,10 +121,10 @@ class Backend {
'{http://apple.com/ns/ical/}calendar-color' '{http://apple.com/ns/ical/}calendar-color'
], array_keys($changedProperties)); ], array_keys($changedProperties));
if ($action === Extension::SUBJECT_UPDATE && empty($changedVisibleInformation)) { if (empty($shares) || ($action === Extension::SUBJECT_UPDATE && empty($changedVisibleInformation))) {
$users = [$owner]; $users = [$owner];
} else { } else {
$users = $this->getUsersForCalendar($calendarId); $users = $this->getUsersForShares($shares);
$users[] = $owner; $users[] = $owner;
} }
@ -140,7 +134,7 @@ class Backend {
$user === $currentUser ? $action . '_self' : $action, $user === $currentUser ? $action . '_self' : $action,
[ [
$currentUser, $currentUser,
$properties['{DAV:}displayname'], $calendarData['{DAV:}displayname'],
] ]
); );
$this->activityManager->publish($event); $this->activityManager->publish($event);
@ -150,16 +144,13 @@ class Backend {
/** /**
* Creates activities for all related users when a calendar was (un-)shared * Creates activities for all related users when a calendar was (un-)shared
* *
* @param Calendar $calendar * @param array $calendarData
* @param array $shares
* @param array $add * @param array $add
* @param array $remove * @param array $remove
*/ */
public function updateCalendarShares(Calendar $calendar, array $add, array $remove) { public function onCalendarUpdateShares(array $calendarData, array $shares, array $add, array $remove) {
$calendarId = $calendar->getResourceId(); $principal = explode('/', $calendarData['principaluri']);
$shares = $this->calDavBackend->getShares($calendarId);
$properties = $this->calDavBackend->getCalendarById($calendarId);
$principal = explode('/', $properties['principaluri']);
$owner = $principal[2]; $owner = $principal[2];
$currentUser = $this->userSession->getUser(); $currentUser = $this->userSession->getUser();
@ -171,7 +162,7 @@ class Backend {
$event = $this->activityManager->generateEvent(); $event = $this->activityManager->generateEvent();
$event->setApp('dav') $event->setApp('dav')
->setObject(Extension::CALENDAR, $calendarId) ->setObject(Extension::CALENDAR, $calendarData['id'])
->setType(Extension::CALENDAR) ->setType(Extension::CALENDAR)
->setAuthor($currentUser); ->setAuthor($currentUser);
@ -187,7 +178,7 @@ class Backend {
$this->triggerActivityUser( $this->triggerActivityUser(
$principal[2], $principal[2],
$event, $event,
$properties, $calendarData,
Extension::SUBJECT_UNSHARE_USER, Extension::SUBJECT_UNSHARE_USER,
Extension::SUBJECT_DELETE . '_self' Extension::SUBJECT_DELETE . '_self'
); );
@ -195,7 +186,7 @@ class Backend {
if ($owner !== $principal[2]) { if ($owner !== $principal[2]) {
$parameters = [ $parameters = [
$principal[2], $principal[2],
$properties['{DAV:}displayname'], $calendarData['{DAV:}displayname'],
]; ];
if ($owner === $event->getAuthor()) { if ($owner === $event->getAuthor()) {
@ -216,11 +207,11 @@ class Backend {
$this->activityManager->publish($event); $this->activityManager->publish($event);
} }
} else if ($principal[1] === 'groups') { } else if ($principal[1] === 'groups') {
$this->triggerActivityGroup($principal[2], $event, $properties, Extension::SUBJECT_UNSHARE_USER); $this->triggerActivityGroup($principal[2], $event, $calendarData, Extension::SUBJECT_UNSHARE_USER);
$parameters = [ $parameters = [
$principal[2], $principal[2],
$properties['{DAV:}displayname'], $calendarData['{DAV:}displayname'],
]; ];
if ($owner === $event->getAuthor()) { if ($owner === $event->getAuthor()) {
@ -253,12 +244,12 @@ class Backend {
$principal = explode('/', $parts[1]); $principal = explode('/', $parts[1]);
if ($principal[1] === 'users') { if ($principal[1] === 'users') {
$this->triggerActivityUser($principal[2], $event, $properties, Extension::SUBJECT_SHARE_USER); $this->triggerActivityUser($principal[2], $event, $calendarData, Extension::SUBJECT_SHARE_USER);
if ($owner !== $principal[2]) { if ($owner !== $principal[2]) {
$parameters = [ $parameters = [
$principal[2], $principal[2],
$properties['{DAV:}displayname'], $calendarData['{DAV:}displayname'],
]; ];
if ($owner === $event->getAuthor()) { if ($owner === $event->getAuthor()) {
@ -277,11 +268,11 @@ class Backend {
$this->activityManager->publish($event); $this->activityManager->publish($event);
} }
} else if ($principal[1] === 'groups') { } else if ($principal[1] === 'groups') {
$this->triggerActivityGroup($principal[2], $event, $properties, Extension::SUBJECT_SHARE_USER); $this->triggerActivityGroup($principal[2], $event, $calendarData, Extension::SUBJECT_SHARE_USER);
$parameters = [ $parameters = [
$principal[2], $principal[2],
$properties['{DAV:}displayname'], $calendarData['{DAV:}displayname'],
]; ];
if ($owner === $event->getAuthor()) { if ($owner === $event->getAuthor()) {
@ -363,49 +354,19 @@ class Backend {
} }
/** /**
* Creates activities when a calendar object was created * Creates activities when a calendar object was created/updated/deleted
*
* @param int $calendarId
* @param string $objectUri
*/
public function addCalendarObject($calendarId, $objectUri) {
$this->triggerCalendarObjectActivity(Extension::SUBJECT_OBJECT_ADD, $calendarId, $objectUri);
}
/**
* Creates activities when a calendar object was updated
*
* @param int $calendarId
* @param string $objectUri
*/
public function updateCalendarObject($calendarId, $objectUri) {
$this->triggerCalendarObjectActivity(Extension::SUBJECT_OBJECT_UPDATE, $calendarId, $objectUri);
}
/**
* Creates activities when a calendar object was deleted
*
* @param int $calendarId
* @param string $objectUri
*/
public function deleteCalendarObject($calendarId, $objectUri) {
$this->triggerCalendarObjectActivity(Extension::SUBJECT_OBJECT_DELETE, $calendarId, $objectUri);
}
/**
* Creates activities for all related users when a calendar was touched
* *
* @param string $action * @param string $action
* @param int $calendarId * @param array $calendarData
* @param string $objectUri * @param array $shares
* @param array $objectData
*/ */
protected function triggerCalendarObjectActivity($action, $calendarId, $objectUri) { public function onTouchCalendarObject($action, array $calendarData, array $shares, array $objectData) {
$properties = $this->calDavBackend->getCalendarById($calendarId); if (!isset($calendarData['principaluri'])) {
if (!isset($properties['principaluri'])) {
return; return;
} }
$principal = explode('/', $properties['principaluri']); $principal = explode('/', $calendarData['principaluri']);
$owner = $principal[2]; $owner = $principal[2];
$currentUser = $this->userSession->getUser(); $currentUser = $this->userSession->getUser();
@ -415,7 +376,7 @@ class Backend {
$currentUser = $owner; $currentUser = $owner;
} }
$object = $this->getObjectNameAndType($calendarId, $objectUri); $object = $this->getObjectNameAndType($objectData);
$action = $action . '_' . $object['type']; $action = $action . '_' . $object['type'];
if ($object['type'] === 'todo' && strpos($action, Extension::SUBJECT_OBJECT_UPDATE) === 0 && $object['status'] === 'COMPLETED') { if ($object['type'] === 'todo' && strpos($action, Extension::SUBJECT_OBJECT_UPDATE) === 0 && $object['status'] === 'COMPLETED') {
@ -426,11 +387,11 @@ class Backend {
$event = $this->activityManager->generateEvent(); $event = $this->activityManager->generateEvent();
$event->setApp('dav') $event->setApp('dav')
->setObject(Extension::CALENDAR, $calendarId) ->setObject(Extension::CALENDAR, $calendarData['id'])
->setType($object['type'] === 'event' ? Extension::CALENDAR_EVENT : Extension::CALENDAR_TODO) ->setType($object['type'] === 'event' ? Extension::CALENDAR_EVENT : Extension::CALENDAR_TODO)
->setAuthor($currentUser); ->setAuthor($currentUser);
$users = $this->getUsersForCalendar($calendarId); $users = $this->getUsersForShares($shares);
$users[] = $owner; $users[] = $owner;
foreach ($users as $user) { foreach ($users as $user) {
@ -439,7 +400,7 @@ class Backend {
$user === $currentUser ? $action . '_self' : $action, $user === $currentUser ? $action . '_self' : $action,
[ [
$currentUser, $currentUser,
$properties['{DAV:}displayname'], $calendarData['{DAV:}displayname'],
$object['name'], $object['name'],
] ]
); );
@ -448,14 +409,11 @@ class Backend {
} }
/** /**
* @param int $calendarId * @param array $objectData
* @param string $objectUri
* @return string[]|bool * @return string[]|bool
*/ */
protected function getObjectNameAndType($calendarId, $objectUri) { protected function getObjectNameAndType(array $objectData) {
$data = $this->calDavBackend->getCalendarObject($calendarId, $objectUri); $vObject = Reader::read($objectData['calendardata']);
$vObject = Reader::read($data['calendardata']);
$component = $componentType = null; $component = $componentType = null;
foreach($vObject->getComponents() as $component) { foreach($vObject->getComponents() as $component) {
if (in_array($component->name, ['VEVENT', 'VTODO'])) { if (in_array($component->name, ['VEVENT', 'VTODO'])) {
@ -478,12 +436,11 @@ class Backend {
/** /**
* Get all users that have access to a given calendar * Get all users that have access to a given calendar
* *
* @param int $calendarId * @param array $shares
* @return string[] * @return string[]
*/ */
protected function getUsersForCalendar($calendarId) { protected function getUsersForShares(array $shares) {
$users = $groups = []; $users = $groups = [];
$shares = $this->calDavBackend->getShares($calendarId);
foreach ($shares as $share) { foreach ($shares as $share) {
$prinical = explode('/', $share['{http://owncloud.org/ns}principal']); $prinical = explode('/', $share['{http://owncloud.org/ns}principal']);
if ($prinical[1] === 'users') { if ($prinical[1] === 'users') {

View File

@ -26,16 +26,12 @@
namespace OCA\DAV\CalDAV; namespace OCA\DAV\CalDAV;
use OCA\DAV\DAV\Sharing\IShareable; use OCA\DAV\DAV\Sharing\IShareable;
use OCA\DAV\CalDAV\Activity\Backend as ActivityBackend;
use OCP\Activity\IManager as IActivityManager;
use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\DB\QueryBuilder\IQueryBuilder;
use OCA\DAV\Connector\Sabre\Principal; use OCA\DAV\Connector\Sabre\Principal;
use OCA\DAV\DAV\Sharing\Backend; use OCA\DAV\DAV\Sharing\Backend;
use OCP\IDBConnection; use OCP\IDBConnection;
use OCP\IGroupManager;
use OCP\IUser; use OCP\IUser;
use OCP\IUserManager; use OCP\IUserManager;
use OCP\IUserSession;
use OCP\Security\ISecureRandom; use OCP\Security\ISecureRandom;
use Sabre\CalDAV\Backend\AbstractBackend; use Sabre\CalDAV\Backend\AbstractBackend;
use Sabre\CalDAV\Backend\SchedulingSupport; use Sabre\CalDAV\Backend\SchedulingSupport;
@ -52,6 +48,8 @@ use Sabre\HTTP\URLUtil;
use Sabre\VObject\DateTimeParser; use Sabre\VObject\DateTimeParser;
use Sabre\VObject\Reader; use Sabre\VObject\Reader;
use Sabre\VObject\Recur\EventIterator; use Sabre\VObject\Recur\EventIterator;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
/** /**
* Class CalDavBackend * Class CalDavBackend
@ -131,8 +129,8 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
/** @var ISecureRandom */ /** @var ISecureRandom */
private $random; private $random;
/** @var ActivityBackend */ /** @var EventDispatcherInterface */
private $activityBackend; private $dispatcher;
/** /**
* CalDavBackend constructor. * CalDavBackend constructor.
@ -140,25 +138,20 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
* @param IDBConnection $db * @param IDBConnection $db
* @param Principal $principalBackend * @param Principal $principalBackend
* @param IUserManager $userManager * @param IUserManager $userManager
* @param IGroupManager $groupManager
* @param ISecureRandom $random * @param ISecureRandom $random
* @param IActivityManager $activityManager * @param EventDispatcherInterface $dispatcher
* @param IUserSession $userSession
*/ */
public function __construct(IDBConnection $db, public function __construct(IDBConnection $db,
Principal $principalBackend, Principal $principalBackend,
IUserManager $userManager, IUserManager $userManager,
IGroupManager $groupManager,
ISecureRandom $random, ISecureRandom $random,
IActivityManager $activityManager, EventDispatcherInterface $dispatcher) {
IUserSession $userSession) {
$this->db = $db; $this->db = $db;
$this->principalBackend = $principalBackend; $this->principalBackend = $principalBackend;
$this->userManager = $userManager; $this->userManager = $userManager;
$this->userManager = $groupManager;
$this->sharingBackend = new Backend($this->db, $principalBackend, 'calendar'); $this->sharingBackend = new Backend($this->db, $principalBackend, 'calendar');
$this->activityBackend = new ActivityBackend($this, $activityManager, $groupManager, $userSession);
$this->random = $random; $this->random = $random;
$this->dispatcher = $dispatcher;
} }
/** /**
@ -623,7 +616,12 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$query->execute(); $query->execute();
$calendarId = $query->getLastInsertId(); $calendarId = $query->getLastInsertId();
$this->activityBackend->addCalendar($calendarId, $values); $this->dispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::createCalendar', new GenericEvent(
'\OCA\DAV\CalDAV\CalDavBackend::createCalendar',
[
'calendarId' => $calendarId,
'calendarData' => $this->getCalendarById($calendarId),
]));
return $calendarId; return $calendarId;
} }
@ -673,7 +671,14 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$this->addChange($calendarId, "", 2); $this->addChange($calendarId, "", 2);
$this->activityBackend->updateCalendar($calendarId, $mutations); $this->dispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::updateCalendar', new GenericEvent(
'\OCA\DAV\CalDAV\CalDavBackend::updateCalendar',
[
'calendarId' => $calendarId,
'calendarData' => $this->getCalendarById($calendarId),
'shares' => $this->getShares($calendarId),
'propertyMutations' => $mutations,
]));
return true; return true;
}); });
@ -686,7 +691,13 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
* @return void * @return void
*/ */
function deleteCalendar($calendarId) { function deleteCalendar($calendarId) {
$this->activityBackend->deleteCalendar($calendarId); $this->dispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::deleteCalendar', new GenericEvent(
'\OCA\DAV\CalDAV\CalDavBackend::deleteCalendar',
[
'calendarId' => $calendarId,
'calendarData' => $this->getCalendarById($calendarId),
'shares' => $this->getShares($calendarId),
]));
$stmt = $this->db->prepare('DELETE FROM `*PREFIX*calendarobjects` WHERE `calendarid` = ?'); $stmt = $this->db->prepare('DELETE FROM `*PREFIX*calendarobjects` WHERE `calendarid` = ?');
$stmt->execute([$calendarId]); $stmt->execute([$calendarId]);
@ -892,7 +903,15 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
]) ])
->execute(); ->execute();
$this->activityBackend->addCalendarObject($calendarId, $objectUri); $this->dispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject', new GenericEvent(
'\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject',
[
'calendarId' => $calendarId,
'calendarData' => $this->getCalendarById($calendarId),
'shares' => $this->getShares($calendarId),
'objectData' => $this->getCalendarObject($calendarId, $objectUri),
]
));
$this->addChange($calendarId, $objectUri, 1); $this->addChange($calendarId, $objectUri, 1);
return '"' . $extraData['etag'] . '"'; return '"' . $extraData['etag'] . '"';
@ -934,7 +953,18 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri))) ->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri)))
->execute(); ->execute();
$this->activityBackend->updateCalendarObject($calendarId, $objectUri); $data = $this->getCalendarObject($calendarId, $objectUri);
if (is_array($data)) {
$this->dispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::updateCalendarObject', new GenericEvent(
'\OCA\DAV\CalDAV\CalDavBackend::updateCalendarObject',
[
'calendarId' => $calendarId,
'calendarData' => $this->getCalendarById($calendarId),
'shares' => $this->getShares($calendarId),
'objectData' => $data,
]
));
}
$this->addChange($calendarId, $objectUri, 2); $this->addChange($calendarId, $objectUri, 2);
return '"' . $extraData['etag'] . '"'; return '"' . $extraData['etag'] . '"';
@ -967,7 +997,18 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
* @return void * @return void
*/ */
function deleteCalendarObject($calendarId, $objectUri) { function deleteCalendarObject($calendarId, $objectUri) {
$this->activityBackend->deleteCalendarObject($calendarId, $objectUri); $data = $this->getCalendarObject($calendarId, $objectUri);
if (is_array($data)) {
$this->dispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::deleteCalendarObject', new GenericEvent(
'\OCA\DAV\CalDAV\CalDavBackend::deleteCalendarObject',
[
'calendarId' => $calendarId,
'calendarData' => $this->getCalendarById($calendarId),
'shares' => $this->getShares($calendarId),
'objectData' => $data,
]
));
}
$stmt = $this->db->prepare('DELETE FROM `*PREFIX*calendarobjects` WHERE `calendarid` = ? AND `uri` = ?'); $stmt = $this->db->prepare('DELETE FROM `*PREFIX*calendarobjects` WHERE `calendarid` = ? AND `uri` = ?');
$stmt->execute([$calendarId, $objectUri]); $stmt->execute([$calendarId, $objectUri]);
@ -1668,8 +1709,16 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
* @param array $remove * @param array $remove
*/ */
public function updateShares($shareable, $add, $remove) { public function updateShares($shareable, $add, $remove) {
/** @var Calendar $shareable */ $calendarId = $shareable->getResourceId();
$this->activityBackend->updateCalendarShares($shareable, $add, $remove); $this->dispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::updateShares', new GenericEvent(
'\OCA\DAV\CalDAV\CalDavBackend::updateShares',
[
'calendarId' => $calendarId,
'calendarData' => $this->getCalendarById($calendarId),
'shares' => $this->getShares($calendarId),
'add' => $add,
'remove' => $remove,
]));
$this->sharingBackend->updateShares($shareable, $add, $remove); $this->sharingBackend->updateShares($shareable, $add, $remove);
} }

View File

@ -76,11 +76,10 @@ class CreateCalendar extends Command {
$this->groupManager $this->groupManager
); );
$random = \OC::$server->getSecureRandom(); $random = \OC::$server->getSecureRandom();
$activityManager = \OC::$server->getActivityManager(); $dispatcher = \OC::$server->getEventDispatcher();
$userSession = \OC::$server->getUserSession();
$name = $input->getArgument('name'); $name = $input->getArgument('name');
$caldav = new CalDavBackend($this->dbConnection, $principalBackend, $this->userManager, $this->groupManager, $random, $activityManager, $userSession); $caldav = new CalDavBackend($this->dbConnection, $principalBackend, $this->userManager, $random, $dispatcher);
$caldav->createCalendar("principals/users/$user", $name, []); $caldav->createCalendar("principals/users/$user", $name, []);
} }
} }

View File

@ -41,9 +41,6 @@ class RootCollection extends SimpleCollection {
$config = \OC::$server->getConfig(); $config = \OC::$server->getConfig();
$random = \OC::$server->getSecureRandom(); $random = \OC::$server->getSecureRandom();
$userManager = \OC::$server->getUserManager(); $userManager = \OC::$server->getUserManager();
$groupManager = \OC::$server->getGroupManager();
$activityManager = \OC::$server->getActivityManager();
$userSession = \OC::$server->getUserSession();
$db = \OC::$server->getDatabaseConnection(); $db = \OC::$server->getDatabaseConnection();
$dispatcher = \OC::$server->getEventDispatcher(); $dispatcher = \OC::$server->getEventDispatcher();
$userPrincipalBackend = new Principal( $userPrincipalBackend = new Principal(
@ -65,7 +62,7 @@ class RootCollection extends SimpleCollection {
$systemPrincipals->disableListing = $disableListing; $systemPrincipals->disableListing = $disableListing;
$filesCollection = new Files\RootCollection($userPrincipalBackend, 'principals/users'); $filesCollection = new Files\RootCollection($userPrincipalBackend, 'principals/users');
$filesCollection->disableListing = $disableListing; $filesCollection->disableListing = $disableListing;
$caldavBackend = new CalDavBackend($db, $userPrincipalBackend, $userManager, $groupManager, $random, $activityManager, $userSession); $caldavBackend = new CalDavBackend($db, $userPrincipalBackend, $userManager, $random, $dispatcher);
$calendarRoot = new CalendarRoot($userPrincipalBackend, $caldavBackend, 'principals/users'); $calendarRoot = new CalendarRoot($userPrincipalBackend, $caldavBackend, 'principals/users');
$calendarRoot->disableListing = $disableListing; $calendarRoot->disableListing = $disableListing;
$publicCalendarRoot = new PublicCalendarRoot($caldavBackend); $publicCalendarRoot = new PublicCalendarRoot($caldavBackend);

View File

@ -22,15 +22,12 @@
namespace OCA\DAV\Tests\unit\CalDAV; namespace OCA\DAV\Tests\unit\CalDAV;
use OCA\DAV\CalDAV\Activity\Backend as ActivityBackend;
use OCA\DAV\CalDAV\CalDavBackend; use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\Connector\Sabre\Principal; use OCA\DAV\Connector\Sabre\Principal;
use OCP\Activity\IManager as IActivityManager;
use OCP\IGroupManager;
use OCP\IUserManager; use OCP\IUserManager;
use OCP\IUserSession;
use OCP\Security\ISecureRandom; use OCP\Security\ISecureRandom;
use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet; use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Test\TestCase; use Test\TestCase;
/** /**
@ -49,8 +46,6 @@ abstract class AbstractCalDavBackendTest extends TestCase {
protected $principal; protected $principal;
/** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */
protected $userManager; protected $userManager;
/** @var ActivityBackend|\PHPUnit_Framework_MockObject_MockObject */
protected $activityBackend;
/** @var ISecureRandom */ /** @var ISecureRandom */
private $random; private $random;
@ -63,9 +58,7 @@ abstract class AbstractCalDavBackendTest extends TestCase {
parent::setUp(); parent::setUp();
$this->userManager = $this->createMock(IUserManager::class); $this->userManager = $this->createMock(IUserManager::class);
$groupManager = $this->createMock(IGroupManager::class); $dispatcher = $this->createMock(EventDispatcherInterface::class);
$activityManager = $this->createMock(IActivityManager::class);
$userSession = $this->createMock(IUserSession::class);
$this->principal = $this->getMockBuilder('OCA\DAV\Connector\Sabre\Principal') $this->principal = $this->getMockBuilder('OCA\DAV\Connector\Sabre\Principal')
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(['getPrincipalByPath', 'getGroupMembership']) ->setMethods(['getPrincipalByPath', 'getGroupMembership'])
@ -80,10 +73,7 @@ abstract class AbstractCalDavBackendTest extends TestCase {
$db = \OC::$server->getDatabaseConnection(); $db = \OC::$server->getDatabaseConnection();
$this->random = \OC::$server->getSecureRandom(); $this->random = \OC::$server->getSecureRandom();
$this->backend = new CalDavBackend($db, $this->principal, $this->userManager, $groupManager, $this->random, $activityManager, $userSession); $this->backend = new CalDavBackend($db, $this->principal, $this->userManager, $this->random, $dispatcher);
$this->activityBackend = $this->createMock(ActivityBackend::class);
$this->invokePrivate($this->backend, 'activityBackend', [$this->activityBackend]);
$this->cleanUpBackend(); $this->cleanUpBackend();
} }

View File

@ -2,17 +2,14 @@
namespace OCA\DAV\Tests\unit\CalDAV; namespace OCA\DAV\Tests\unit\CalDAV;
use OCA\DAV\CalDAV\Activity\Backend as ActivityBackend;
use OCA\DAV\CalDAV\Calendar; use OCA\DAV\CalDAV\Calendar;
use OCA\DAV\Connector\Sabre\Principal; use OCA\DAV\Connector\Sabre\Principal;
use OCP\Activity\IManager as IActivityManager;
use OCP\IGroupManager;
use OCP\IL10N; use OCP\IL10N;
use OCA\DAV\CalDAV\CalDavBackend; use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CalDAV\PublicCalendarRoot; use OCA\DAV\CalDAV\PublicCalendarRoot;
use OCP\IUserManager; use OCP\IUserManager;
use OCP\IUserSession;
use OCP\Security\ISecureRandom; use OCP\Security\ISecureRandom;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Test\TestCase; use Test\TestCase;
/** /**
@ -35,14 +32,6 @@ class PublicCalendarRootTest extends TestCase {
private $principal; private $principal;
/** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */
protected $userManager; protected $userManager;
/** @var IGroupManager|\PHPUnit_Framework_MockObject_MockObject */
protected $groupManager;
/** @var IActivityManager|\PHPUnit_Framework_MockObject_MockObject */
protected $activityManager;
/** @var IUserSession|\PHPUnit_Framework_MockObject_MockObject */
protected $userSession;
/** @var ActivityBackend|\PHPUnit_Framework_MockObject_MockObject */
protected $activityBackend;
/** @var ISecureRandom */ /** @var ISecureRandom */
private $random; private $random;
@ -53,24 +42,17 @@ class PublicCalendarRootTest extends TestCase {
$db = \OC::$server->getDatabaseConnection(); $db = \OC::$server->getDatabaseConnection();
$this->principal = $this->createMock('OCA\DAV\Connector\Sabre\Principal'); $this->principal = $this->createMock('OCA\DAV\Connector\Sabre\Principal');
$this->userManager = $this->createMock(IUserManager::class); $this->userManager = $this->createMock(IUserManager::class);
$groupManager = $this->createMock(IGroupManager::class);
$activityManager = $this->createMock(IActivityManager::class);
$userSession = $this->createMock(IUserSession::class);
$this->random = \OC::$server->getSecureRandom(); $this->random = \OC::$server->getSecureRandom();
$dispatcher = $this->createMock(EventDispatcherInterface::class);
$this->backend = new CalDavBackend( $this->backend = new CalDavBackend(
$db, $db,
$this->principal, $this->principal,
$this->userManager, $this->userManager,
$groupManager,
$this->random, $this->random,
$activityManager, $dispatcher
$userSession
); );
$this->activityBackend = $this->createMock(ActivityBackend::class);
$this->invokePrivate($this->backend, 'activityBackend', [$this->activityBackend]);
$this->publicCalendarRoot = new PublicCalendarRoot($this->backend); $this->publicCalendarRoot = new PublicCalendarRoot($this->backend);
$this->l10n = $this->getMockBuilder('\OCP\IL10N') $this->l10n = $this->getMockBuilder('\OCP\IL10N')
@ -95,14 +77,6 @@ class PublicCalendarRootTest extends TestCase {
} }
public function testGetChild() { public function testGetChild() {
$this->activityBackend->expects($this->exactly(1))
->method('addCalendar');
$this->activityBackend->expects($this->never())
->method('updateCalendar');
$this->activityBackend->expects($this->never())
->method('deleteCalendar');
$this->activityBackend->expects($this->never())
->method('updateCalendarShares');
$calendar = $this->createPublicCalendar(); $calendar = $this->createPublicCalendar();
@ -117,15 +91,6 @@ class PublicCalendarRootTest extends TestCase {
} }
public function testGetChildren() { public function testGetChildren() {
$this->activityBackend->expects($this->exactly(1))
->method('addCalendar');
$this->activityBackend->expects($this->never())
->method('updateCalendar');
$this->activityBackend->expects($this->never())
->method('deleteCalendar');
$this->activityBackend->expects($this->never())
->method('updateCalendarShares');
$this->createPublicCalendar(); $this->createPublicCalendar();
$publicCalendars = $this->backend->getPublicCalendars(); $publicCalendars = $this->backend->getPublicCalendars();